From 3b2a8a38af8d109c5e8e99b44ef4062ced7844ed Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Sat, 18 May 2024 08:33:51 +0200 Subject: [PATCH 01/45] fix(volume_rendering): Volume rendering fixes for max projection - picking, blending, and performance (#584) * fix: ensure picking value from max projection is < 1 * fix: better blending of multiple VR layers with max enabled * fix: clarify comment * fix: userIntensity always overwrites default * fix: no longer double draw opaque layers * chore: remove log to check fix * refactor: remove non-functioning continue statement * feat: emit a single ID for picking in VR layer * refactor: rename uniform to uPickId * feat: register VR layer to get pick ID * refactor: remove unused demo code around pick ID * refactor: clarify role of copy shaders in perspective panel * fix: don't copy over the max projection picking buffer for each max layer Do one copy if there are any max layers instead * refactor: clarify buffer names * fix: VR tool from Python --- python/neuroglancer/__init__.py | 2 +- python/neuroglancer/viewer_state.py | 4 +- src/perspective_view/panel.ts | 127 ++++++++++++-------- src/volume_rendering/volume_render_layer.ts | 16 ++- 4 files changed, 89 insertions(+), 60 deletions(-) diff --git a/python/neuroglancer/__init__.py b/python/neuroglancer/__init__.py index 367a4431f..836bbebd1 100644 --- a/python/neuroglancer/__init__.py +++ b/python/neuroglancer/__init__.py @@ -49,7 +49,7 @@ PlaceEllipsoidTool, # noqa: F401 BlendTool, # noqa: F401 OpacityTool, # noqa: F401 - VolumeRenderingModeTool, # noqa: F401 + VolumeRenderingTool, # noqa: F401 VolumeRenderingGainTool, # noqa: F401 VolumeRenderingDepthSamplesTool, # noqa: F401 CrossSectionRenderScaleTool, # noqa: F401 diff --git a/python/neuroglancer/viewer_state.py b/python/neuroglancer/viewer_state.py index e23e51514..301cc65f8 100644 --- a/python/neuroglancer/viewer_state.py +++ b/python/neuroglancer/viewer_state.py @@ -165,9 +165,9 @@ class OpacityTool(Tool): @export_tool -class VolumeRenderingModeTool(Tool): +class VolumeRenderingTool(Tool): __slots__ = () - TOOL_TYPE = "volumeRenderingMode" + TOOL_TYPE = "volumeRendering" @export_tool diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index 46d0dcc27..a38bd43e2 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -153,14 +153,18 @@ export function perspectivePanelEmitOIT(builder: ShaderBuilder) { } export function maxProjectionEmit(builder: ShaderBuilder) { - builder.addOutputBuffer("vec4", "v4f_fragData0", 0); - builder.addOutputBuffer("highp vec4", "v4f_fragData1", 1); - builder.addOutputBuffer("highp vec4", "v4f_fragData2", 2); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.addOutputBuffer("highp vec4", "out_z", 1); + builder.addOutputBuffer("highp vec4", "out_intensity", 2); + builder.addOutputBuffer("highp vec4", "out_pickId", 3); builder.addFragmentCode(` -void emit(vec4 color, float depth, float pick) { - v4f_fragData0 = color; - v4f_fragData1 = vec4(1.0 - depth, 1.0 - depth, 1.0 - depth, 1.0); - v4f_fragData2 = vec4(pick, pick, pick, 1.0); +void emit(vec4 color, float depth, float intensity, highp uint pickId) { + float pickIdFloat = float(pickId); + float bufferDepth = 1.0 - depth; + out_color = color; + out_z = vec4(bufferDepth, bufferDepth, bufferDepth, 1.0); + out_intensity = vec4(intensity, intensity, intensity, 1.0); + out_pickId = vec4(pickIdFloat, pickIdFloat, pickIdFloat, 1.0); }`); } @@ -168,6 +172,7 @@ const tempVec3 = vec3.create(); const tempVec4 = vec4.create(); const tempMat4 = mat4.create(); +// Copy the OIT values to the main color buffer function defineTransparencyCopyShader(builder: ShaderBuilder) { builder.addOutputBuffer("vec4", "v4f_fragColor", null); builder.setFragmentMain(` @@ -180,31 +185,45 @@ v4f_fragColor = vec4(accum.rgb / accum.a, revealage); `); } +// Copy the max projection color to the OIT buffer function defineMaxProjectionColorCopyShader(builder: ShaderBuilder) { - builder.addOutputBuffer("vec4", "v4f_fragColor", null); + builder.addOutputBuffer("vec4", "v4f_fragData0", 0); + builder.addOutputBuffer("vec4", "v4f_fragData1", 1); + builder.addFragmentCode(glsl_perspectivePanelEmitOIT); builder.setFragmentMain(` -v4f_fragColor = getValue0(); +vec4 color = getValue0(); +float bufferDepth = getValue1().r; +float weight = computeOITWeight(color.a, 1.0 - bufferDepth); +vec4 accum = color * weight; +float revealage = color.a; + +emitAccumAndRevealage(accum, revealage, 0u); `); } +// Copy the max projection depth and pick values to the main buffer function defineMaxProjectionPickCopyShader(builder: ShaderBuilder) { - builder.addOutputBuffer("vec4", "v4f_fragData0", 0); - builder.addOutputBuffer("highp vec4", "v4f_fragData1", 1); - builder.addOutputBuffer("highp vec4", "v4f_fragData2", 2); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.addOutputBuffer("highp vec4", "out_z", 1); + builder.addOutputBuffer("highp vec4", "out_pickId", 2); builder.setFragmentMain(` -v4f_fragData0 = vec4(0.0); -v4f_fragData1 = getValue0(); -v4f_fragData2 = getValue1(); +out_color = vec4(0.0); +out_z = getValue0(); +out_pickId = getValue1(); `); } +// Copy the max projection depth and picking to the max projection pick buffer. +// Note that the depth is set as the intensity value from the render layer. +// This is to combine max projection picking data via depth testing +// on the maximum intensity value of the data. function defineMaxProjectionToPickCopyShader(builder: ShaderBuilder) { - builder.addOutputBuffer("highp vec4", "v4f_fragData0", 0); - builder.addOutputBuffer("highp vec4", "v4f_fragData1", 1); + builder.addOutputBuffer("highp vec4", "out_z", 0); + builder.addOutputBuffer("highp vec4", "out_pickId", 1); builder.setFragmentMain(` -v4f_fragData0 = getValue0(); -v4f_fragData1 = getValue1(); -gl_FragDepth = v4f_fragData1.r; +out_z = getValue0(); +out_pickId = getValue2(); +gl_FragDepth = getValue1().r; `); } @@ -306,13 +325,13 @@ export class PerspectivePanel extends RenderedDataPanel { OffscreenCopyHelper.get(this.gl, defineTransparencyCopyShader, 2), ); protected maxProjectionColorCopyHelper = this.registerDisposer( - OffscreenCopyHelper.get(this.gl, defineMaxProjectionColorCopyShader, 1), + OffscreenCopyHelper.get(this.gl, defineMaxProjectionColorCopyShader, 2), ); protected maxProjectionPickCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineMaxProjectionPickCopyShader, 2), ); protected maxProjectionToPickCopyHelper = this.registerDisposer( - OffscreenCopyHelper.get(this.gl, defineMaxProjectionToPickCopyShader, 2), + OffscreenCopyHelper.get(this.gl, defineMaxProjectionToPickCopyShader, 3), ); private sharedObject: PerspectiveViewState; @@ -730,6 +749,12 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.RED, WebGL2RenderingContext.FLOAT, ), + new TextureBuffer( + this.gl, + WebGL2RenderingContext.R32F, + WebGL2RenderingContext.RED, + WebGL2RenderingContext.FLOAT, + ), ], depthBuffer: new DepthStencilRenderbuffer(this.gl), }), @@ -1004,6 +1029,7 @@ export class PerspectivePanel extends RenderedDataPanel { renderContext.depthBufferTexture = this.offscreenFramebuffer.colorBuffers[OffscreenTextures.Z].texture; } + // Draw max projection layers if ( renderLayer.isVolumeRendering && isProjectionLayer(renderLayer as VolumeRenderingRenderLayer) @@ -1021,21 +1047,26 @@ export class PerspectivePanel extends RenderedDataPanel { bindMaxProjectionPickingBuffer(); this.maxProjectionToPickCopyHelper.draw( this.maxProjectionConfiguration.colorBuffers[1 /*depth*/].texture, - this.maxProjectionConfiguration.colorBuffers[2 /*pick*/].texture, + this.maxProjectionConfiguration.colorBuffers[2 /*intensity*/] + .texture, + this.maxProjectionConfiguration.colorBuffers[3 /*pick*/].texture, ); - // Copy max projection color result to color only buffer + // Copy max projection color result to the transparent buffer with OIT // Depth testing off to combine max layers into one color via blend - this.offscreenFramebuffer.bindSingle(OffscreenTextures.COLOR); + renderContext.bindFramebuffer(); gl.depthMask(false); gl.disable(WebGL2RenderingContext.DEPTH_TEST); gl.enable(WebGL2RenderingContext.BLEND); - gl.blendFunc( + gl.blendFuncSeparate( + WebGL2RenderingContext.ONE, WebGL2RenderingContext.ONE, + WebGL2RenderingContext.ZERO, WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, ); this.maxProjectionColorCopyHelper.draw( this.maxProjectionConfiguration.colorBuffers[0 /*color*/].texture, + this.maxProjectionConfiguration.colorBuffers[1 /*depth*/].texture, ); // Reset the max projection buffer @@ -1052,19 +1083,15 @@ export class PerspectivePanel extends RenderedDataPanel { gl.clearDepth(1.0); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.depthMask(false); - gl.blendFuncSeparate( - WebGL2RenderingContext.ONE, - WebGL2RenderingContext.ONE, - WebGL2RenderingContext.ZERO, - WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, - ); gl.enable(WebGL2RenderingContext.DEPTH_TEST); gl.depthFunc(WebGL2RenderingContext.LESS); renderContext.emitter = perspectivePanelEmitOIT; renderContext.bindFramebuffer(); - continue; } - renderLayer.draw(renderContext, attachment); + // Draw regular transparent layers + else if (renderLayer.isTransparent) { + renderLayer.draw(renderContext, attachment); + } } // Copy transparent rendering result back to primary buffer. gl.disable(WebGL2RenderingContext.DEPTH_TEST); @@ -1109,27 +1136,21 @@ export class PerspectivePanel extends RenderedDataPanel { /*dppass=*/ WebGL2RenderingContext.REPLACE, ); gl.stencilMask(2); + if (hasMaxProjection) { + this.maxProjectionPickCopyHelper.draw( + this.maxProjectionPickConfiguration.colorBuffers[0].texture /*depth*/, + this.maxProjectionPickConfiguration.colorBuffers[1].texture /*pick*/, + ); + } for (const [renderLayer, attachment] of visibleLayers) { - if (!renderLayer.isTransparent || !renderLayer.transparentPickEnabled) { + if ( + !renderLayer.isTransparent || + !renderLayer.transparentPickEnabled || + renderLayer.isVolumeRendering + ) { + // Skip non-transparent layers and transparent layers with transparentPickEnabled=false. + // Volume rendering layers are handled separately and are combined in a pick buffer continue; - } - // For max projection layers, can copy over the pick buffer directly. - if (renderLayer.isVolumeRendering) { - if (isProjectionLayer(renderLayer as VolumeRenderingRenderLayer)) { - this.maxProjectionPickCopyHelper.draw( - this.maxProjectionPickConfiguration.colorBuffers[0] - .texture /*depth*/, - this.maxProjectionPickConfiguration.colorBuffers[1] - .texture /*pick*/, - ); - } - // Draw picking for non min/max volume rendering layers - else { - // Currently volume rendering layers have no picking support - // Outside of min/max mode - continue; - } - // other transparent layers are drawn as usual } else { renderLayer.draw(renderContext, attachment); } diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 49d79b1b5..889f608c3 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -254,16 +254,18 @@ void emitIntensity(float value) { float savedDepth = 0.0; float savedIntensity = 0.0; vec4 newColor = vec4(0.0); +float userEmittedIntensity = -100.0; `); glsl_emitIntensity = ` float convertIntensity(float value) { return clamp(${glsl_intensityConversion}, 0.0, 1.0); } void emitIntensity(float value) { - defaultMaxProjectionIntensity = value; + userEmittedIntensity = value; } float getIntensity() { - return convertIntensity(defaultMaxProjectionIntensity); + float intensity = userEmittedIntensity > -100.0 ? userEmittedIntensity : defaultMaxProjectionIntensity; + return convertIntensity(intensity); } `; glsl_rgbaEmit = ` @@ -281,8 +283,9 @@ void emitRGBA(vec4 rgba) { savedIntensity = intensityChanged ? newIntensity : savedIntensity; savedDepth = intensityChanged ? depthAtRayPosition : savedDepth; outputColor = intensityChanged ? newColor : outputColor; - emit(outputColor, savedDepth, savedIntensity); + emit(outputColor, savedDepth, savedIntensity, uPickId); defaultMaxProjectionIntensity = 0.0; + userEmittedIntensity = -100.0; `; } emitter(builder); @@ -308,6 +311,7 @@ void emitRGBA(vec4 rgba) { builder.addUniform("highp float", "uBrightnessFactor"); builder.addUniform("highp float", "uGain"); + builder.addUniform("highp uint", "uPickId"); builder.addVarying("highp vec4", "vNormalizedPosition"); builder.addTextureSampler( "sampler2D", @@ -365,7 +369,7 @@ vec2 computeUVFromClipSpace(vec4 clipSpacePosition) { `; if (isProjectionMode(shaderParametersState.mode)) { glsl_emitWireframe = ` - emit(outputColor, 1.0, uChunkNumber); + emit(outputColor, 1.0, uChunkNumber, uPickId); `; } builder.setFragmentMainFunction(` @@ -621,6 +625,9 @@ void main() { gl.enable(WebGL2RenderingContext.CULL_FACE); gl.cullFace(WebGL2RenderingContext.FRONT); + const pickId = isProjectionMode(this.mode.value) + ? renderContext.pickIDs.register(this) + : 0; forEachVisibleVolumeRenderingChunk( renderContext.projectionParameters, this.localPosition.value, @@ -798,6 +805,7 @@ void main() { } newSource = false; gl.uniform3fv(shader.uniform("uTranslation"), chunkPosition); + gl.uniform1ui(shader.uniform("uPickId"), pickId); drawBoxes(gl, 1, 1); ++presentCount; } else { From f805b54f6c6e68ecf11598e1cf21af8d2688d26e Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Sat, 18 May 2024 08:48:33 +0200 Subject: [PATCH 02/45] feat: Add a transfer function shader widget (#582) * feat: transfer function widget * refactor: fix linting warnings * refactor: TF uses uint64 as number, not string * chore: cleanup TODO and comments * refactor: clean up transfer function code a little * fix: TF control points didn't always make it to JSON * refactor: clearer comments and update loop * fix: no longer able to place control points on top of eachother * fix: can grab control points in TF that are close in X by breaking ties with Y * fix: bind remove TF point to shift+dblclick You could accidentally remove points trying to move them before * feat: clearer name of TF input value * feat: Python control over transfer function shader contro * docs: fix typo in python docs * test (Python): shader control transfer function test * fix: user can't specify transfer function points outside input range * docs: transfer function UI control * docs: code comment on transfer functions * chore: format and lint * chore(python): format * refactor(in progress): store control points in abs value * refactor(progress): transfer functino * progress(refactor): tf refactor * progress(refactor): tf refactor * progress(refactor): fix all type errors in tf file * progress(refactor): fix type errors * refactor(progress): fix more type errors * fix(tests): remove unused imports * tests(fix): browser test whole TF * fix: transfer function correct interpolation * fix: dynamic transfer function size and correct GPU control * feat: remove range and size as TF params Instead they are computed based on input * fix: parse shader directive for new TF * fix: JSON state parsing and saving for new TF * fix: new TF runs, but UI control is broken * fix: remove accidental log * fix: control points display in correct position in UI * fix: find control point near cursor in new TF * fix: moving control points and setting color * fix: correct number of lines * fix: display UI panel texture for TF * fix: render data from TF texture * fix: remove fixed size TF texture * fix: link UI to JSON for control points * fix: remove temps and TODOs * fix: handle control point range for 0 and 1 points * fix: test * fix: unused code * fix: can no longer lose control of point that you were trying to move * fix: compute range after removing a point * refactor: clearer range update * fix: tf UI has correct texture indicator * feat: default intensity for transfer functions * fix: don't crash on window[0] === window[1] in TF UI panel * fix: userIntensity always overwrites default * docs: update transfer function docs * tests: fix a test for TFs with uint64 data * feat: use non-interpolated value in TF for consistency and efficiency * fix: tests * Python(fix): fix transfer function control input * docs: fix formatting * Python: format * fix: remove accidental test change * refactor: clarifications * docs: while inverted windows are not supported, remove from docs * fix: correctly draw lines with a points beside window, one left, one right * feat: a little bit cleaner interaction with TF UI window * refactor: clarify the transfer function lines drawing --- python/README.md | 4 +- python/neuroglancer/__init__.py | 1 + python/neuroglancer/viewer_state.py | 14 + python/tests/shader_controls_test.py | 75 + src/sliceview/image_layer_rendering.md | 36 + src/sliceview/volume/renderlayer.ts | 1 + src/util/array.spec.ts | 22 + src/util/array.ts | 33 + src/volume_rendering/volume_render_layer.ts | 1 + src/webgl/rectangle_grid_buffer.spec.ts | 41 + src/webgl/rectangle_grid_buffer.ts | 80 + src/webgl/shader.ts | 53 +- src/webgl/shader_ui_controls.browser_test.ts | 506 ++++- src/webgl/shader_ui_controls.ts | 332 +++- src/widget/invlerp.ts | 4 +- src/widget/shader_controls.ts | 10 + src/widget/transfer_function.browser_test.ts | 327 ++++ src/widget/transfer_function.css | 41 + src/widget/transfer_function.ts | 1721 ++++++++++++++++++ 19 files changed, 3289 insertions(+), 13 deletions(-) create mode 100644 src/webgl/rectangle_grid_buffer.spec.ts create mode 100644 src/webgl/rectangle_grid_buffer.ts create mode 100644 src/widget/transfer_function.browser_test.ts create mode 100644 src/widget/transfer_function.css create mode 100644 src/widget/transfer_function.ts diff --git a/python/README.md b/python/README.md index 79ab5351b..4c7f039a7 100644 --- a/python/README.md +++ b/python/README.md @@ -152,8 +152,8 @@ headlessly on Firefox using `xvfb-run`. On other platforms, tests can't be run ```shell # For headless using Firefox on xvfb (Linux only) -sudo apt-get instrall xvfb # On Debian-based systems -tox -e firefox-xvfb # Run tests using non-headless Firefox +sudo apt-get install xvfb # On Debian-based systems +tox -e firefox-xvfb # Run tests using headless Firefox # For non-headless using Chrome tox -e chrome diff --git a/python/neuroglancer/__init__.py b/python/neuroglancer/__init__.py index 836bbebd1..edafa519b 100644 --- a/python/neuroglancer/__init__.py +++ b/python/neuroglancer/__init__.py @@ -89,6 +89,7 @@ LayerDataSource, # noqa: F401 LayerDataSources, # noqa: F401 InvlerpParameters, # noqa: F401 + TransferFunctionParameters, # noqa: F401 ImageLayer, # noqa: F401 SkeletonRenderingOptions, # noqa: F401 StarredSegments, # noqa: F401 diff --git a/python/neuroglancer/viewer_state.py b/python/neuroglancer/viewer_state.py index 301cc65f8..a2b14edba 100644 --- a/python/neuroglancer/viewer_state.py +++ b/python/neuroglancer/viewer_state.py @@ -518,6 +518,16 @@ class InvlerpParameters(JsonObjectWrapper): channel = wrapped_property("channel", optional(typed_list(int))) +@export +class TransferFunctionParameters(JsonObjectWrapper): + window = wrapped_property("window", optional(array_wrapper(numbers.Number, 2))) + channel = wrapped_property("channel", optional(typed_list(int))) + controlPoints = wrapped_property( + "controlPoints", optional(typed_list(typed_list(number_or_string))) + ) + defaultColor = wrapped_property("defaultColor", optional(str)) + + _UINT64_STR_PATTERN = re.compile("[0-9]+") @@ -530,9 +540,13 @@ def _shader_control_parameters(v, _readonly=False): if isinstance(v, numbers.Number): return v if isinstance(v, dict): + if "controlPoints" in v: + return TransferFunctionParameters(v, _readonly=_readonly) return InvlerpParameters(v, _readonly=_readonly) if isinstance(v, InvlerpParameters): return v + if isinstance(v, TransferFunctionParameters): + return v raise TypeError(f"Unexpected shader control parameters type: {type(v)}") diff --git a/python/tests/shader_controls_test.py b/python/tests/shader_controls_test.py index ee6bca39c..ece90fbf5 100644 --- a/python/tests/shader_controls_test.py +++ b/python/tests/shader_controls_test.py @@ -62,6 +62,81 @@ def expect_color(color): expect_color([0, 0, 0, 255]) +def test_transfer_function(webdriver): + shader = """ +#uicontrol transferFunction colormap +void main() { + emitRGBA(colormap()); +} +""" + shaderControls = { + "colormap": { + "controlPoints": [[0, "#000000", 0.0], [84, "#ffffff", 1.0]], + "window": [0, 50], + "channel": [], + "defaultColor": "#ff00ff", + } + } + with webdriver.viewer.txn() as s: + s.dimensions = neuroglancer.CoordinateSpace( + names=["x", "y"], units="nm", scales=[1, 1] + ) + s.position = [0.5, 0.5] + s.layers.append( + name="image", + layer=neuroglancer.ImageLayer( + source=neuroglancer.LocalVolume( + dimensions=s.dimensions, + data=np.full(shape=(1, 1), dtype=np.uint64, fill_value=63), + ), + ), + visible=True, + shader=shader, + shader_controls=shaderControls, + opacity=1.0, + blend="additive", + ) + s.layout = "xy" + s.cross_section_scale = 1e-6 + s.show_axis_lines = False + control = webdriver.viewer.state.layers["image"].shader_controls["colormap"] + assert isinstance(control, neuroglancer.TransferFunctionParameters) + np.testing.assert_equal(control.window, [0, 50]) + assert control.defaultColor == "#ff00ff" + + def expect_color(color): + webdriver.sync() + screenshot = webdriver.viewer.screenshot(size=[10, 10]).screenshot + np.testing.assert_array_equal( + screenshot.image_pixels, + np.tile(np.array(color, dtype=np.uint8), (10, 10, 1)), + ) + + # Ensure that the value 63 is mapped to the expected color. + # The value 63 is 3/4 of the way between 0 and 84, so the expected color + # is 3/4 of the way between black and white. + # Additionally, the opacity is 0.75, and the mode is additive, so the + # the final color is 0.75 * 0.75 * 255. + mapped_opacity = 0.75 + mapped_color = 0.75 * 255 + mapped_value = int(mapped_color * mapped_opacity) + expected_color = [mapped_value] * 3 + [255] + expect_color(expected_color) + with webdriver.viewer.txn() as s: + s.layers["image"].shader_controls = { + "colormap": neuroglancer.TransferFunctionParameters( + controlPoints=[[0, "#000000", 0.0], [84, "#ffffff", 1.0]], + window=[500, 5000], + channel=[], + defaultColor="#ff0000", + ) + } + control = webdriver.viewer.state.layers["image"].shader_controls["colormap"] + np.testing.assert_equal(control.window, [500, 5000]) + assert control.defaultColor == "#ff0000" + expect_color(expected_color) + + def test_slider(webdriver): with webdriver.viewer.txn() as s: s.dimensions = neuroglancer.CoordinateSpace( diff --git a/src/sliceview/image_layer_rendering.md b/src/sliceview/image_layer_rendering.md index 6aeb69dfd..71f2cd012 100644 --- a/src/sliceview/image_layer_rendering.md +++ b/src/sliceview/image_layer_rendering.md @@ -155,6 +155,42 @@ annotation layers). The one-parameter overload simply computes the inverse linea the specified value within the range specified by the control. The zero-parameter overload returns the inverse linear interpolation of the data value for configured channel/property. +### `transferFunction` controls + +The `transferFunction` control type allows the user to specify a function which maps +each data value in a numerical interval to an output color and opacity. The mapping function +is defined by a series of control points. Each control point is a color and opacity value at a +specific data input value. In between control points, the color and opacity is linearly interpolated. +Any input data before the first control point is mapped to a completely transparent output. +Any data point after the last control point is mapped to the same output as the last control point. + +Directive syntax: + +```glsl +#uicontrol transferFunction (window=[lower, higher], controlPoints=[[input, hexColorString, opacity]], channel=[], defaultColor="#rrggbb") +#uicontrol transferFunction colormap(window=[0, 100], controlPoints=[[10.0, "#000000", 0.0], [100.0, "#ffffff", 1.0]], channel=[], defaultColor="#00ffaa") +``` + +The following parameters are supported: + +- `window`: Optional. The portion of the input range to view the transfer function over. + Must be specified as an array. May be overridden using the UI control. Defaults to the min and max + of the control point input values, if control points are specified, or otherwise to the full range of the + data type for integer data types, and `[0, 1]` for float32. It is not valid to specify an + inverted interval like `[50, 20]`, or an interval where the start and end points are the same, e.g. `[20, 20]`. + +- `controlPoints`: Optional. The points which define the input to output mapping. + Must be specified as an array, with each value in the array of the form `[inputValue, hexStringColor, floatOpacity]`. + The default transfer function is a simple interpolation from transparent black to fully opaque white. + +- `channel`: Optional. The channel to perform the mapping on. + If the rank of the channel coordinate space is 1, may be specified as a single number, + e.g. `channel=2`. Otherwise, must be specified as an array, e.g. `channel=[2, 3]`. May be + overriden using the UI control. If not specified, defaults to all-zero channel coordinates. + +- `defaultColor`: Optional. The default color for new control points added via the UI control. + Defaults to `#ffffff`, and must be specified as a hex string if provided `#rrggbb`. + ## API ### Retrieving voxel channel value diff --git a/src/sliceview/volume/renderlayer.ts b/src/sliceview/volume/renderlayer.ts index 2a8fa2de0..a01325eb1 100644 --- a/src/sliceview/volume/renderlayer.ts +++ b/src/sliceview/volume/renderlayer.ts @@ -582,6 +582,7 @@ void main() { const endShader = () => { if (shader === null) return; + shader.unbindTransferFunctionTextures(); if (prevChunkFormat !== null) { prevChunkFormat!.endDrawing(gl, shader); } diff --git a/src/util/array.spec.ts b/src/util/array.spec.ts index d9b2a5c73..6319ca8f8 100644 --- a/src/util/array.spec.ts +++ b/src/util/array.spec.ts @@ -22,6 +22,7 @@ import { spliceArray, tile2dArray, transposeArray2d, + findClosestMatchInSortedArray, } from "#src/util/array.js"; describe("partitionArray", () => { @@ -206,3 +207,24 @@ describe("getMergeSplices", () => { ]); }); }); + +describe("findClosestMatchInSortedArray", () => { + const compare = (a: number, b: number) => a - b; + it("works for empty array", () => { + expect(findClosestMatchInSortedArray([], 0, compare)).toEqual(-1); + }); + it("works for simple examples", () => { + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 0, compare)).toEqual(0); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 1, compare)).toEqual(1); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 2, compare)).toEqual(2); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 3, compare)).toEqual(3); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 4, compare)).toEqual(3); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], -1, compare)).toEqual(0); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 1.5, compare)).toEqual( + 1, + ); + expect(findClosestMatchInSortedArray([0, 1, 2, 3], 1.6, compare)).toEqual( + 2, + ); + }); +}); diff --git a/src/util/array.ts b/src/util/array.ts index 93f628b77..c18e90cc8 100644 --- a/src/util/array.ts +++ b/src/util/array.ts @@ -184,6 +184,39 @@ export function binarySearch( return ~low; } +/** + * Returns the index of the element in `haystack` that is closest to `needle`, according to + * `compare`. If there are multiple elements that are equally close, the index of the first such + * element encountered is returned. If `haystack` is empty, returns -1. + */ +export function findClosestMatchInSortedArray( + haystack: ArrayLike, + needle: T, + compare: (a: T, b: T) => number, + low = 0, + high = haystack.length, +): number { + let bestIndex = -1; + let bestDistance = Infinity; + while (low < high) { + const mid = (low + high - 1) >> 1; + const compareResult = compare(needle, haystack[mid]); + if (compareResult > 0) { + low = mid + 1; + } else if (compareResult < 0) { + high = mid; + } else { + return mid; + } + const distance = Math.abs(compareResult); + if (distance < bestDistance) { + bestDistance = distance; + bestIndex = mid; + } + } + return bestIndex; +} + /** * Returns the first index in `[begin, end)` for which `predicate` is `true`, or returns `end` if no * such index exists. diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 889f608c3..4361b1f2b 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -570,6 +570,7 @@ void main() { const endShader = () => { if (shader === null) return; + shader.unbindTransferFunctionTextures(); if (prevChunkFormat !== null) { prevChunkFormat!.endDrawing(gl, shader); } diff --git a/src/webgl/rectangle_grid_buffer.spec.ts b/src/webgl/rectangle_grid_buffer.spec.ts new file mode 100644 index 000000000..5d8a9697a --- /dev/null +++ b/src/webgl/rectangle_grid_buffer.spec.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect } from "vitest"; +import { createGriddedRectangleArray } from "#src/webgl/rectangle_grid_buffer.js"; + +describe("createGriddedRectangleArray", () => { + it("creates a set of two squares for grid size=2 and rectangle width&height=2", () => { + const result = createGriddedRectangleArray(2, -1, 1, 1, -1); + expect(result).toEqual( + new Float32Array([ + -1, 1, 0, 1, 0, -1 /* triangle in top right for first grid */, -1, 1, 0, + -1, -1, -1 /* triangle in bottom left for first grid */, 0, 1, 1, 1, 1, + -1 /* triangle in top right for second grid */, 0, 1, 1, -1, 0, + -1 /* triangle in bottom left for second grid */, + ]), + ); + const resultReverse = createGriddedRectangleArray(2, 1, -1, -1, 1); + expect(resultReverse).toEqual( + new Float32Array([ + 1, -1, 0, -1, 0, 1 /* triangle in top right for first grid */, 1, -1, 0, + 1, 1, 1 /* triangle in bottom left for first grid */, 0, -1, -1, -1, -1, + 1 /* triangle in top right for second grid */, 0, -1, -1, 1, 0, + 1 /* triangle in bottom left for second grid */, + ]), + ); + }); +}); diff --git a/src/webgl/rectangle_grid_buffer.ts b/src/webgl/rectangle_grid_buffer.ts new file mode 100644 index 000000000..acf8e848f --- /dev/null +++ b/src/webgl/rectangle_grid_buffer.ts @@ -0,0 +1,80 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import { VERTICES_PER_QUAD } from "#src/webgl/quad.js"; + +/** + * Create a Float32Array of vertices gridded in a rectangle + * Only grids along the x-axis are created, the y-axis is assumed to be the same for all grids + */ +export function createGriddedRectangleArray( + numGrids: number, + startX = -1, + endX = 1, + startY = 1, + endY = -1, +): Float32Array { + const result = new Float32Array(numGrids * VERTICES_PER_QUAD * 2); + const step = (endX - startX) / numGrids; + let currentx = startX; + for (let i = 0; i < numGrids; ++i) { + const index = i * VERTICES_PER_QUAD * 2; + + // Triangle 1 - top-left, top-right, bottom-right + result[index] = currentx; // top-left x + result[index + 1] = startY; // top-left y + result[index + 2] = currentx + step; // top-right x + result[index + 3] = startY; // top-right y + result[index + 4] = currentx + step; // bottom-right x + result[index + 5] = endY; // bottom-right y + + // Triangle 2 - top-left, bottom-right, bottom-left + result[index + 6] = currentx; // top-left x + result[index + 7] = startY; // top-left y + result[index + 8] = currentx + step; // bottom-right x + result[index + 9] = endY; // bottom-right y + result[index + 10] = currentx; // bottom-left x + result[index + 11] = endY; // bottom-left y + currentx += step; + } + return result; +} + +/** + * Get a buffer of vertices representing a rectangle that is gridded + * along the x dimension, useful for drawing grids, such as a lookup table / heatmap + */ +export function getGriddedRectangleBuffer( + gl: GL, + numGrids: number, + startX = -1, + endX = 1, + startY = 1, + endY = -1, +) { + return getMemoizedBuffer( + gl, + WebGL2RenderingContext.ARRAY_BUFFER, + createGriddedRectangleArray, + numGrids, + startX, + endX, + startY, + endY, + ).value; +} diff --git a/src/webgl/shader.ts b/src/webgl/shader.ts index 7d10c8d69..f87187c46 100644 --- a/src/webgl/shader.ts +++ b/src/webgl/shader.ts @@ -14,8 +14,13 @@ * limitations under the License. */ +import type { DataType } from "#src/util/data_type.js"; import { RefCounted } from "#src/util/disposable.js"; import type { GL } from "#src/webgl/context.js"; +import type { + ControlPointTexture, + SortedControlPoints, +} from "#src/widget/transfer_function.js"; const DEBUG_SHADER = false; @@ -164,6 +169,10 @@ export class ShaderProgram extends RefCounted { textureUnits: Map; vertexShaderInputBinders: { [name: string]: VertexShaderInputBinder } = {}; vertexDebugOutputs?: VertexDebugOutput[]; + transferFunctionTextures: Map = new Map< + any, + ControlPointTexture + >(); constructor( public gl: GL, @@ -237,7 +246,7 @@ export class ShaderProgram extends RefCounted { return this.attributes.get(name)!; } - textureUnit(symbol: symbol): number { + textureUnit(symbol: symbol | string): number { return this.textureUnits.get(symbol)!; } @@ -246,6 +255,41 @@ export class ShaderProgram extends RefCounted { this.gl.useProgram(this.program); } + bindAndUpdateTransferFunctionTexture( + symbol: symbol | string, + sortedControlPoints: SortedControlPoints, + dataType: DataType, + lookupTableSize: number, + ) { + const textureUnit = this.textureUnits.get(symbol); + if (textureUnit === undefined) { + throw new Error(`Invalid texture unit symbol: ${symbol.toString()}`); + } + const texture = this.transferFunctionTextures.get(symbol); + if (texture === undefined) { + throw new Error( + `Invalid transfer function texture symbol: ${symbol.toString()}`, + ); + } + return texture.updateAndActivate({ + textureUnit, + sortedControlPoints, + dataType, + lookupTableSize, + }); + } + + unbindTransferFunctionTextures() { + const gl = this.gl; + for (const key of this.transferFunctionTextures.keys()) { + const value = this.textureUnits.get(key); + if (value !== undefined) { + this.gl.activeTexture(gl.TEXTURE0 + value); + this.gl.bindTexture(gl.TEXTURE_2D, null); + } + } + } + disposed() { const { gl } = this; gl.deleteShader(this.vertexShader); @@ -257,6 +301,7 @@ export class ShaderProgram extends RefCounted { this.gl = undefined; this.attributes = undefined; this.uniforms = undefined; + this.transferFunctionTextures = undefined; } } @@ -448,7 +493,7 @@ export class ShaderBuilder { private uniforms = new Array(); private attributes = new Array(); private initializers: Array = []; - private textureUnits = new Map(); + private textureUnits = new Map(); private vertexDebugOutputs: VertexDebugOutput[] = []; constructor(public gl: GL) {} @@ -461,7 +506,7 @@ export class ShaderBuilder { this.vertexDebugOutputs.push({ typeName, name }); } - allocateTextureUnit(symbol: symbol, count = 1) { + allocateTextureUnit(symbol: symbol | string, count = 1) { if (this.textureUnits.has(symbol)) { throw new Error("Duplicate texture unit symbol: " + symbol.toString()); } @@ -474,7 +519,7 @@ export class ShaderBuilder { addTextureSampler( samplerType: ShaderSamplerType, name: string, - symbol: symbol, + symbol: symbol | string, extent?: number, ) { const textureUnit = this.allocateTextureUnit(symbol, extent); diff --git a/src/webgl/shader_ui_controls.browser_test.ts b/src/webgl/shader_ui_controls.browser_test.ts index 09d70c10c..a5cea04d8 100644 --- a/src/webgl/shader_ui_controls.browser_test.ts +++ b/src/webgl/shader_ui_controls.browser_test.ts @@ -16,11 +16,20 @@ import { expect, describe, it } from "vitest"; import { DataType } from "#src/util/data_type.js"; -import { vec3 } from "#src/util/geom.js"; +import { vec3, vec4 } from "#src/util/geom.js"; +import { defaultDataTypeRange } from "#src/util/lerp.js"; +import { Uint64 } from "#src/util/uint64.js"; import { + TrackableTransferFunctionParameters, parseShaderUiControls, + parseTransferFunctionParameters, stripComments, } from "#src/webgl/shader_ui_controls.js"; +import type { TransferFunctionParameters } from "#src/widget/transfer_function.js"; +import { + ControlPoint, + SortedControlPoints, +} from "#src/widget/transfer_function.js"; describe("stripComments", () => { it("handles code without comments", () => { @@ -562,4 +571,499 @@ void main() { ]), }); }); + it("handles transfer function control without channel", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.UINT8]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT8, channelRank: 0 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT8, + default: { + sortedControlPoints: new SortedControlPoints([], DataType.UINT8), + channel: [], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control without channel (rank 1)", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.UINT16]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT16, channelRank: 1 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT16, + default: { + sortedControlPoints: new SortedControlPoints([], DataType.UINT16), + channel: [0], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control with channel (rank 0)", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[], channel=[]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.UINT64]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT64, channelRank: 0 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT64, + default: { + sortedControlPoints: new SortedControlPoints([], DataType.UINT64), + channel: [], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control with non-array channel (rank 1)", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[], channel=1) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.FLOAT32]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.FLOAT32, channelRank: 1 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.FLOAT32, + default: { + sortedControlPoints: new SortedControlPoints( + [], + DataType.FLOAT32, + ), + channel: [1], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control with array channel (rank 1)", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[], channel=[1]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.FLOAT32]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.FLOAT32, channelRank: 1 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.FLOAT32, + default: { + sortedControlPoints: new SortedControlPoints( + [], + DataType.FLOAT32, + ), + channel: [1], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control with array channel (rank 2)", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[], channel=[1,2]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const range = defaultDataTypeRange[DataType.FLOAT32]; + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.FLOAT32, channelRank: 2 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.FLOAT32, + default: { + sortedControlPoints: new SortedControlPoints( + [], + DataType.FLOAT32, + ), + channel: [1, 2], + defaultColor: vec3.fromValues(1, 1, 1), + window: range, + }, + }, + ], + ]), + }); + }); + it("handles transfer function control with all properties non uint64 data", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[[200, "#00ff00", 0.1], [100, "#ff0000", 0.5], [0, "#000000", 0.0]], defaultColor="#0000ff", window=[0, 1000], channel=[]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const controlPoints = [ + new ControlPoint(0, vec4.fromValues(0, 0, 0, 0)), + new ControlPoint(200, vec4.fromValues(0, 255, 0, 26)), + new ControlPoint(100, vec4.fromValues(255, 0, 0, 128)), + ]; + const sortedControlPoints = new SortedControlPoints( + controlPoints, + DataType.UINT32, + ); + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT32, channelRank: 0 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT32, + default: { + sortedControlPoints, + channel: [], + defaultColor: vec3.fromValues(0, 0, 1), + window: [0, 1000], + }, + }, + ], + ]), + }); + expect(sortedControlPoints.range).toEqual([0, 200]); + }); + it("handles transfer function control with all properties uint64 data", () => { + const code = ` +#uicontrol transferFunction colormap(controlPoints=[["18446744073709551615", "#00ff00", 0.1], ["9223372111111111111", "#ff0000", 0.5], [0, "#000000", 0.0]], defaultColor="#0000ff", channel=[], window=[0, 2000]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const controlPoints = [ + new ControlPoint( + Uint64.parseString("9223372111111111111"), + vec4.fromValues(255, 0, 0, 128), + ), + new ControlPoint(Uint64.fromNumber(0), vec4.fromValues(0, 0, 0, 0)), + new ControlPoint( + Uint64.parseString("18446744073709551615"), + vec4.fromValues(0, 255, 0, 26), + ), + ]; + const sortedControlPoints = new SortedControlPoints( + controlPoints, + DataType.UINT64, + ); + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT64, channelRank: 0 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT64, + default: { + sortedControlPoints: sortedControlPoints, + channel: [], + defaultColor: vec3.fromValues(0, 0, 1), + window: [Uint64.fromNumber(0), Uint64.fromNumber(2000)], + }, + }, + ], + ]), + }); + }); + it("creates a default transfer function if no control points are provided", () => { + const code = ` +#uicontrol transferFunction colormap(window=[30, 200]) +void main() { +} +`; + const newCode = ` + +void main() { +} +`; + const window = [30, 200]; + const firstInput = window[0] + (window[1] - window[0]) * 0.4; + const secondInput = window[0] + (window[1] - window[0]) * 0.7; + const controlPoints = [ + new ControlPoint(Math.round(firstInput), vec4.fromValues(0, 0, 0, 0)), + new ControlPoint( + Math.round(secondInput), + vec4.fromValues(255, 255, 255, 255), + ), + ]; + const sortedControlPoints = new SortedControlPoints( + controlPoints, + DataType.UINT8, + ); + expect( + parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT8, channelRank: 0 }, + }), + ).toEqual({ + source: code, + code: newCode, + errors: [], + controls: new Map([ + [ + "colormap", + { + type: "transferFunction", + dataType: DataType.UINT8, + default: { + sortedControlPoints: sortedControlPoints, + channel: [], + defaultColor: vec3.fromValues(1, 1, 1), + window, + }, + }, + ], + ]), + }); + }); +}); + +describe("parseTransferFunctionParameters", () => { + it("parses transfer function from JSON", () => { + const code = ` +#uicontrol transferFunction tf +void main() { +} +`; + const parsed_val = parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT8, channelRank: 0 }, + }); + const default_val = parsed_val.controls.get("tf")!.default; + const json = { + controlPoints: [ + [150, "#ffffff", 1], + [0, "#000000", 0], + ], + defaultColor: "#ff0000", + window: [0, 200], + }; + const parsed = parseTransferFunctionParameters( + json, + DataType.UINT8, + default_val as TransferFunctionParameters, + ); + expect(parsed).toEqual({ + sortedControlPoints: new SortedControlPoints( + [ + new ControlPoint(0, vec4.fromValues(0, 0, 0, 0)), + new ControlPoint(150, vec4.fromValues(255, 255, 255, 255)), + ], + DataType.UINT8, + ), + channel: [], + defaultColor: vec3.fromValues(1, 0, 0), + window: [0, 200], + }); + }); + it("writes transfer function to JSON and detects changes from default", () => { + const code = ` +#uicontrol transferFunction tf +void main() { +} +`; + const parsed_val = parseShaderUiControls(code, { + imageData: { dataType: DataType.UINT64, channelRank: 0 }, + }); + const default_val = parsed_val.controls.get("tf")! + .default as TransferFunctionParameters; + const transferFunctionParameters = new TrackableTransferFunctionParameters( + DataType.UINT64, + default_val, + ); + expect(transferFunctionParameters.toJSON()).toEqual(undefined); + + // Test setting a new control point + const sortedControlPoints = new SortedControlPoints( + [ + new ControlPoint(Uint64.fromNumber(0), vec4.fromValues(0, 0, 0, 10)), + new ControlPoint( + Uint64.parseString("18446744073709551615"), + vec4.fromValues(255, 255, 255, 255), + ), + ], + DataType.UINT64, + ); + transferFunctionParameters.value = { + ...default_val, + sortedControlPoints, + }; + expect(transferFunctionParameters.toJSON()).toEqual({ + channel: undefined, + defaultColor: undefined, + window: undefined, + controlPoints: [ + ["0", "#000000", 0.0392156862745098], + ["18446744073709551615", "#ffffff", 1], + ], + }); + + // Test setting a new default color + transferFunctionParameters.value = { + ...default_val, + defaultColor: vec3.fromValues(0, 1, 0), + }; + expect(transferFunctionParameters.toJSON()).toEqual({ + channel: undefined, + defaultColor: "#00ff00", + window: undefined, + controlPoints: undefined, + }); + + // Test setting a new window + transferFunctionParameters.value = { + ...default_val, + window: [0, 1000], + }; + expect(transferFunctionParameters.toJSON()).toEqual({ + channel: undefined, + defaultColor: undefined, + window: ["0", "1000"], + controlPoints: undefined, + }); + + // Test setting a new channel + transferFunctionParameters.value = { + ...default_val, + channel: [1], + }; + expect(transferFunctionParameters.toJSON()).toEqual({ + channel: [1], + defaultColor: undefined, + window: undefined, + controlPoints: undefined, + }); + }); }); diff --git a/src/webgl/shader_ui_controls.ts b/src/webgl/shader_ui_controls.ts index 7439a9750..df3e19034 100644 --- a/src/webgl/shader_ui_controls.ts +++ b/src/webgl/shader_ui_controls.ts @@ -27,11 +27,16 @@ import { TrackableValue, } from "#src/trackable_value.js"; import { arraysEqual, arraysEqualWithPredicate } from "#src/util/array.js"; -import { parseRGBColorSpecification, TrackableRGB } from "#src/util/color.js"; -import type { DataType } from "#src/util/data_type.js"; +import { + parseRGBColorSpecification, + serializeColor, + TrackableRGB, +} from "#src/util/color.js"; +import { DataType } from "#src/util/data_type.js"; import { RefCounted } from "#src/util/disposable.js"; -import type { vec3 } from "#src/util/geom.js"; +import { kZeroVec4, vec3, vec4 } from "#src/util/geom.js"; import { + parseArray, parseFixedLengthArray, verifyFiniteFloat, verifyInt, @@ -41,16 +46,19 @@ import { } from "#src/util/json.js"; import type { DataTypeInterval } from "#src/util/lerp.js"; import { + computeLerp, convertDataTypeInterval, dataTypeIntervalToJson, defaultDataTypeRange, normalizeDataTypeInterval, parseDataTypeInterval, + parseDataTypeValue, parseUnknownDataTypeInterval, validateDataTypeInterval, } from "#src/util/lerp.js"; import { NullarySignal } from "#src/util/signal.js"; import type { Trackable } from "#src/util/trackable.js"; +import type { Uint64 } from "#src/util/uint64.js"; import type { GL } from "#src/webgl/context.js"; import type { HistogramChannelSpecification } from "#src/webgl/empirical_cdf.js"; import { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; @@ -59,6 +67,13 @@ import { enableLerpShaderFunction, } from "#src/webgl/lerp.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; +import type { TransferFunctionParameters } from "#src/widget/transfer_function.js"; +import { + defineTransferFunctionShader, + enableTransferFunctionShader, + SortedControlPoints, + ControlPoint, +} from "#src/widget/transfer_function.js"; export interface ShaderSliderControl { type: "slider"; @@ -98,12 +113,19 @@ export interface ShaderCheckboxControl { default: boolean; } +export interface ShaderTransferFunctionControl { + type: "transferFunction"; + dataType: DataType; + default: TransferFunctionParameters; +} + export type ShaderUiControl = | ShaderSliderControl | ShaderColorControl | ShaderImageInvlerpControl | ShaderPropertyInvlerpControl - | ShaderCheckboxControl; + | ShaderCheckboxControl + | ShaderTransferFunctionControl; export interface ShaderControlParseError { line: number; @@ -564,6 +586,101 @@ function parsePropertyInvlerpDirective( }; } +function parseTransferFunctionDirective( + valueType: string, + parameters: DirectiveParameters, + dataContext: ShaderDataContext, +): DirectiveParseResult { + const imageData = dataContext.imageData; + const dataType = imageData?.dataType; + const channelRank = imageData?.channelRank; + const errors = []; + let channel = new Array(channelRank).fill(0); + let defaultColor = vec3.fromValues(1.0, 1.0, 1.0); + let window: DataTypeInterval | undefined; + let sortedControlPoints = new SortedControlPoints( + [], + dataType !== undefined ? dataType : DataType.FLOAT32, + ); + let specifedPoints = false; + if (valueType !== "transferFunction") { + errors.push("type must be transferFunction"); + } + if (dataType === undefined) { + errors.push("image data must be provided to use a transfer function"); + } + for (const [key, value] of parameters) { + try { + switch (key) { + case "channel": { + channel = parseInvlerpChannel(value, channel.length); + break; + } + case "defaultColor": { + defaultColor = parseRGBColorSpecification(value); + break; + } + case "window": { + if (dataType !== undefined) { + window = validateDataTypeInterval( + parseDataTypeInterval(value, dataType), + ); + } + break; + } + case "controlPoints": { + specifedPoints = true; + if (dataType !== undefined) { + sortedControlPoints = parseTransferFunctionControlPoints( + value, + dataType, + ); + } + break; + } + default: + errors.push(`Invalid parameter: ${key}`); + break; + } + } catch (e) { + errors.push(`Invalid ${key} value: ${e.message}`); + } + } + + if (window === undefined) { + window = sortedControlPoints.range; + } + // Set a simple black to white transfer function if no control points are specified. + if ( + sortedControlPoints.length === 0 && + !specifedPoints && + dataType !== undefined + ) { + const startPoint = computeLerp(window, dataType, 0.4) as number; + const endPoint = computeLerp(window, dataType, 0.7) as number; + sortedControlPoints.addPoint(new ControlPoint(startPoint, kZeroVec4)); + sortedControlPoints.addPoint( + new ControlPoint(endPoint, vec4.fromValues(255, 255, 255, 255)), + ); + } + if (errors.length > 0) { + return { errors }; + } + return { + control: { + type: "transferFunction", + dataType, + default: { + sortedControlPoints, + channel, + defaultColor, + window, + }, + } as ShaderTransferFunctionControl, + errors: undefined, + }; +} + export interface ImageDataSpecification { dataType: DataType; channelRank: number; @@ -586,6 +703,7 @@ const controlParsers = new Map< ["color", parseColorDirective], ["invlerp", parseInvlerpDirective], ["checkbox", parseCheckboxDirective], + ["transferFunction", parseTransferFunctionDirective], ]); export function parseShaderUiControls( @@ -708,6 +826,18 @@ float ${uName}() { builder.addVertexCode(code); break; } + case "transferFunction": { + builder.addFragmentCode(`#define ${name} ${uName}\n`); + builder.addFragmentCode( + defineTransferFunctionShader( + builder, + uName, + control.dataType, + builderValue.channel, + ), + ); + break; + } default: { builder.addUniform(`highp ${control.valueType}`, uName); builder.addVertexCode(`#define ${name} ${uName}\n`); @@ -917,6 +1047,182 @@ class TrackablePropertyInvlerpParameters extends TrackableValue { + // Validate input length and types + const allowedInput = + dataType === DataType.UINT64 + ? typeof x[0] === "string" || typeof x[0] === "number" + : typeof x[0] === "number"; + if ( + x.length !== 3 || + !allowedInput || + typeof x[1] !== "string" || + typeof x[2] !== "number" + ) { + throw new Error( + `Expected array of length 3 (x, "#RRGGBB", A), but received: ${JSON.stringify( + x, + )}`, + ); + } + const inputValue = parseDataTypeValue(dataType, x[0]); + + if (x[1].length !== 7 || x[1][0] !== "#") { + throw new Error( + `Expected #RRGGBB, but received: ${JSON.stringify(x[1])}`, + ); + } + if (x[2] < 0 || x[2] > 1) { + throw new Error( + `Expected opacity in range [0, 1], but received: ${JSON.stringify( + x[2], + )}`, + ); + } + const color = parseRGBColorSpecification(x[1]); + function floatToUint8(float: number) { + return Math.min(255, Math.max(Math.round(float * 255), 0)); + } + return new ControlPoint( + inputValue, + vec4.fromValues( + floatToUint8(color[0]), + floatToUint8(color[1]), + floatToUint8(color[2]), + floatToUint8(x[2]), + ), + ); + }); + return new SortedControlPoints(parsedPoints, dataType); +} + +export function parseTransferFunctionParameters( + obj: unknown, + dataType: DataType, + defaultValue: TransferFunctionParameters, +): TransferFunctionParameters { + if (obj === undefined) return defaultValue; + verifyObject(obj); + const sortedControlPoints = verifyOptionalObjectProperty( + obj, + "controlPoints", + (x) => parseTransferFunctionControlPoints(x, dataType), + defaultValue.sortedControlPoints, + ); + const window = verifyOptionalObjectProperty( + obj, + "window", + (x) => parseDataTypeInterval(x, dataType), + defaultValue.window, + ); + return { + sortedControlPoints, + channel: verifyOptionalObjectProperty( + obj, + "channel", + (x) => parseInvlerpChannel(x, defaultValue.channel.length), + defaultValue.channel, + ), + defaultColor: verifyOptionalObjectProperty( + obj, + "defaultColor", + (x) => parseRGBColorSpecification(x), + defaultValue.defaultColor, + ), + window, + }; +} + +function copyTransferFunctionParameters( + defaultValue: TransferFunctionParameters, +) { + return { + ...defaultValue, + sortedControlPoints: defaultValue.sortedControlPoints.copy(), + }; +} + +export class TrackableTransferFunctionParameters extends TrackableValue { + constructor( + public dataType: DataType, + public defaultValue: TransferFunctionParameters, + ) { + // Create a copy of the default value to enable detecting changes + // to the control points in the trackable value. + const defaultValueCopy = copyTransferFunctionParameters(defaultValue); + super(defaultValueCopy, (obj) => + parseTransferFunctionParameters(obj, dataType, defaultValue), + ); + } + + controlPointsToJson(controlPoints: ControlPoint[], dataType: DataType) { + function inputToJson(inputValue: number | Uint64) { + if (dataType === DataType.UINT64) { + return (inputValue as Uint64).toJSON(); + } + return inputValue; + } + + return controlPoints.map((x) => [ + inputToJson(x.inputValue), + serializeColor( + vec3.fromValues( + x.outputColor[0] / 255, + x.outputColor[1] / 255, + x.outputColor[2] / 255, + ), + ), + x.outputColor[3] / 255, + ]); + } + + toJSON() { + const { + value: { channel, sortedControlPoints, defaultColor, window }, + dataType, + defaultValue, + } = this; + const windowJson = dataTypeIntervalToJson( + window, + dataType, + defaultValue.window, + ); + const channelJson = arraysEqual(defaultValue.channel, channel) + ? undefined + : channel; + const colorJson = arraysEqual(defaultValue.defaultColor, defaultColor) + ? undefined + : serializeColor(defaultColor); + const controlPointsJson = arraysEqualWithPredicate( + defaultValue.sortedControlPoints.controlPoints, + sortedControlPoints.controlPoints, + (a, b) => + arraysEqual(a.outputColor, b.outputColor) && + a.inputValue === b.inputValue, + ) + ? undefined + : this.controlPointsToJson(sortedControlPoints.controlPoints, dataType); + if ( + channelJson === undefined && + colorJson === undefined && + controlPointsJson === undefined && + windowJson === undefined + ) { + return undefined; + } + return { + channel: channelJson, + defaultColor: colorJson, + controlPoints: controlPointsJson, + window: windowJson, + }; + } +} + function getControlTrackable(control: ShaderUiControl): { trackable: TrackableValueInterface; getBuilderValue: (value: any) => any; @@ -974,6 +1280,17 @@ function getControlTrackable(control: ShaderUiControl): { trackable: new TrackableBoolean(control.default), getBuilderValue: (value) => ({ value }), }; + case "transferFunction": + return { + trackable: new TrackableTransferFunctionParameters( + control.dataType, + control.default, + ), + getBuilderValue: (value: TransferFunctionParameters) => ({ + channel: value.channel, + dataType: control.dataType, + }), + }; } } @@ -1346,6 +1663,13 @@ function setControlInShader( case "checkbox": // Value is hard-coded in shader. break; + case "transferFunction": + enableTransferFunctionShader( + shader, + uName, + control.dataType, + value.sortedControlPoints, + ); } } diff --git a/src/widget/invlerp.ts b/src/widget/invlerp.ts index 312e4de6a..263f620b7 100644 --- a/src/widget/invlerp.ts +++ b/src/widget/invlerp.ts @@ -657,14 +657,14 @@ function createRangeBoundInputs( return { container, inputs, spacers }; } -function updateInputBoundWidth(inputElement: HTMLInputElement) { +export function updateInputBoundWidth(inputElement: HTMLInputElement) { updateInputFieldWidth( inputElement, Math.max(1, inputElement.value.length + 0.1), ); } -function updateInputBoundValue( +export function updateInputBoundValue( inputElement: HTMLInputElement, bound: number | Uint64, ) { diff --git a/src/widget/shader_controls.ts b/src/widget/shader_controls.ts index 3f18f8300..aa19a7719 100644 --- a/src/widget/shader_controls.ts +++ b/src/widget/shader_controls.ts @@ -43,6 +43,7 @@ import { colorLayerControl } from "#src/widget/layer_control_color.js"; import { propertyInvlerpLayerControl } from "#src/widget/layer_control_property_invlerp.js"; import { rangeLayerControl } from "#src/widget/layer_control_range.js"; import { Tab } from "#src/widget/tab_view.js"; +import { transferFunctionLayerControl } from "#src/widget/transfer_function.js"; export interface LegendShaderOptions extends ParameterizedEmitterDependentShaderOptions { @@ -114,6 +115,15 @@ function getShaderLayerControlFactory( legendShaderOptions: layerShaderControls.legendShaderOptions, })); } + case "transferFunction": { + return transferFunctionLayerControl(() => ({ + dataType: control.dataType, + watchableValue: controlState.trackable, + channelCoordinateSpaceCombiner: + shaderControlState.channelCoordinateSpaceCombiner, + defaultChannel: control.default.channel, + })); + } } } diff --git a/src/widget/transfer_function.browser_test.ts b/src/widget/transfer_function.browser_test.ts new file mode 100644 index 000000000..f9a81233b --- /dev/null +++ b/src/widget/transfer_function.browser_test.ts @@ -0,0 +1,327 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect } from "vitest"; +import { TrackableValue } from "#src/trackable_value.js"; +import { DataType } from "#src/util/data_type.js"; +import { vec3, vec4 } from "#src/util/geom.js"; +import { defaultDataTypeRange } from "#src/util/lerp.js"; + +import { Uint64 } from "#src/util/uint64.js"; +import { getShaderType } from "#src/webgl/shader_lib.js"; +import { fragmentShaderTest } from "#src/webgl/shader_testing.js"; +import type { TransferFunctionParameters } from "#src/widget/transfer_function.js"; +import { + SortedControlPoints, + ControlPoint, + LookupTable, + TransferFunction, + NUM_COLOR_CHANNELS, + defineTransferFunctionShader, + enableTransferFunctionShader, +} from "#src/widget/transfer_function.js"; + +const FIXED_TRANSFER_FUNCTION_LENGTH = 1024; + +function makeTransferFunction(controlPoints: ControlPoint[]) { + const sortedControlPoints = new SortedControlPoints( + controlPoints, + DataType.UINT8, + ); + return new TransferFunction( + DataType.UINT8, + new TrackableValue( + { + sortedControlPoints, + window: defaultDataTypeRange[DataType.UINT8], + defaultColor: vec3.fromValues(0, 0, 0), + channel: [], + }, + (x) => x, + ), + ); +} + +describe("lerpBetweenControlPoints", () => { + const output = new Uint8Array( + NUM_COLOR_CHANNELS * FIXED_TRANSFER_FUNCTION_LENGTH, + ); + it("returns transparent black when given no control points for base classes", () => { + const controlPoints: ControlPoint[] = []; + const sortedControlPoints = new SortedControlPoints( + controlPoints, + DataType.UINT8, + ); + const lookupTable = new LookupTable(FIXED_TRANSFER_FUNCTION_LENGTH); + lookupTable.updateFromControlPoints(sortedControlPoints); + + expect(output.every((value) => value === 0)).toBeTruthy(); + }); + it("returns transparent black when given no control points for the transfer function class", () => { + const transferFunction = makeTransferFunction([]); + expect( + transferFunction.lookupTable.outputValues.every((value) => value === 0), + ).toBeTruthy(); + }); + it("returns transparent black up to the first control point, and the last control point value after", () => { + const controlPoints: ControlPoint[] = [ + new ControlPoint(120, vec4.fromValues(21, 22, 254, 210)), + ]; + const transferFunction = makeTransferFunction(controlPoints); + const output = transferFunction.lookupTable.outputValues; + const firstPointTransferIndex = + transferFunction.sortedControlPoints.controlPoints[0].transferFunctionIndex( + transferFunction.sortedControlPoints.range, + transferFunction.size, + ); + + expect( + output + .slice(0, NUM_COLOR_CHANNELS * firstPointTransferIndex) + .every((value) => value === 0), + ).toBeTruthy(); + const endPiece = output.slice(NUM_COLOR_CHANNELS * firstPointTransferIndex); + const color = controlPoints[0].outputColor; + expect( + endPiece.every( + (value, index) => value === color[index % NUM_COLOR_CHANNELS], + ), + ).toBeTruthy(); + }); + it("correctly interpolates between three control points", () => { + function toLookupTableIndex( + transferFunction: TransferFunction, + index: number, + ) { + return transferFunction.sortedControlPoints.controlPoints[ + index + ].transferFunctionIndex( + transferFunction.sortedControlPoints.range, + transferFunction.size, + ); + } + const controlPoints: ControlPoint[] = [ + new ControlPoint(140, vec4.fromValues(0, 0, 0, 0)), + new ControlPoint(120, vec4.fromValues(21, 22, 254, 210)), + new ControlPoint(200, vec4.fromValues(255, 255, 255, 255)), + ]; + const transferFunction = makeTransferFunction(controlPoints); + const output = transferFunction.lookupTable.outputValues; + const firstPointTransferIndex = toLookupTableIndex(transferFunction, 0); + const secondPointTransferIndex = toLookupTableIndex(transferFunction, 1); + const thirdPointTransferIndex = toLookupTableIndex(transferFunction, 2); + const size = transferFunction.size; + const range = transferFunction.range as [number, number]; + expect(firstPointTransferIndex).toBe( + Math.floor(((120 - range[0]) / (range[1] - range[0])) * (size - 1)), + ); + expect(secondPointTransferIndex).toBe( + Math.floor(((140 - range[0]) / (range[1] - range[0])) * (size - 1)), + ); + expect(thirdPointTransferIndex).toBe( + Math.floor(((200 - range[0]) / (range[1] - range[0])) * (size - 1)), + ); + + // Transparent black up to the first control point + expect( + output + .slice(0, NUM_COLOR_CHANNELS * firstPointTransferIndex) + .every((value) => value === 0), + ).toBeTruthy(); + // The last control point value after the last control point + expect( + output + .slice(NUM_COLOR_CHANNELS * thirdPointTransferIndex) + .every((value) => value === 255), + ).toBeTruthy(); + + // Performs linear interpolation between the first and second control points + const firstColor = + transferFunction.sortedControlPoints.controlPoints[0].outputColor; + const secondColor = + transferFunction.sortedControlPoints.controlPoints[1].outputColor; + const firstToSecondDifference = + secondPointTransferIndex - firstPointTransferIndex; + for ( + let i = firstPointTransferIndex * NUM_COLOR_CHANNELS; + i < secondPointTransferIndex * NUM_COLOR_CHANNELS; + i++ + ) { + const t = + Math.floor(i / NUM_COLOR_CHANNELS - firstPointTransferIndex) / + firstToSecondDifference; + const difference = + secondColor[i % NUM_COLOR_CHANNELS] - + firstColor[i % NUM_COLOR_CHANNELS]; + const expectedValue = firstColor[i % NUM_COLOR_CHANNELS] + t * difference; + // If the decimal part is 0.5, it could be rounded up or down depending on precision. + const decimalPart = expectedValue - Math.floor(expectedValue); + if (Math.abs(decimalPart - 0.5) < 0.001) { + expect([Math.floor(expectedValue), Math.ceil(expectedValue)]).toContain( + output[i], + ); + } else { + expect(output[i]).toBe(Math.round(expectedValue)); + } + } + + // Performs linear interpolation between the second and third control points + const thirdColor = + transferFunction.sortedControlPoints.controlPoints[2].outputColor; + const secondToThirdDifference = + thirdPointTransferIndex - secondPointTransferIndex; + for ( + let i = secondPointTransferIndex * NUM_COLOR_CHANNELS; + i < thirdPointTransferIndex * NUM_COLOR_CHANNELS; + i++ + ) { + const t = + Math.floor(i / NUM_COLOR_CHANNELS - secondPointTransferIndex) / + secondToThirdDifference; + const difference = + thirdColor[i % NUM_COLOR_CHANNELS] - + secondColor[i % NUM_COLOR_CHANNELS]; + const expectedValue = + secondColor[i % NUM_COLOR_CHANNELS] + t * difference; + // If the decimal part is 0.5, it could be rounded up or down depending on precision. + const decimalPart = expectedValue - Math.floor(expectedValue); + if (Math.abs(decimalPart - 0.5) < 0.001) { + expect([Math.floor(expectedValue), Math.ceil(expectedValue)]).toContain( + output[i], + ); + } else { + expect(output[i]).toBe(Math.round(expectedValue)); + } + } + }); +}); + +const textureSizes = { + [DataType.UINT8]: 0xff, + [DataType.INT8]: 0xff, + [DataType.UINT16]: 200, + [DataType.INT16]: 8192, + [DataType.UINT32]: 0xffff, + [DataType.INT32]: 0xffff, + [DataType.UINT64]: 0xffff, + [DataType.FLOAT32]: 0xffff, +}; + +describe("compute transfer function on GPU", () => { + for (const dataType of Object.values(DataType)) { + if (typeof dataType === "string") continue; + const range = defaultDataTypeRange[dataType]; + const controlPoints = new SortedControlPoints( + [ + new ControlPoint(range[0], vec4.fromValues(0, 0, 0, 0)), + new ControlPoint(range[1], vec4.fromValues(255, 255, 255, 255)), + ], + dataType, + ); + it(`computes transfer function between transparent black and opaque white on GPU for ${DataType[dataType]}`, () => { + const shaderType = getShaderType(dataType); + fragmentShaderTest( + { inputValue: dataType }, + { + val1: "float", + val2: "float", + val3: "float", + val4: "float", + val5: "float", + }, + (tester) => { + const { builder } = tester; + builder.addFragmentCode(` +${shaderType} getInterpolatedDataValue() { + return inputValue; +} +${shaderType} getDataValue() { + return inputValue; +} +`); + builder.addFragmentCode( + defineTransferFunctionShader( + builder, + "doTransferFunction", + dataType, + [], + ), + ); + builder.setFragmentMain(` +vec4 result = doTransferFunction(inputValue); +val1 = result.r; +val2 = result.g; +val3 = result.b; +val4 = result.a; +val5 = uTransferFunctionEnd_doTransferFunction; +`); + const { shader } = tester; + const testShader = (point: any) => { + enableTransferFunctionShader( + shader, + "doTransferFunction", + dataType, + controlPoints, + textureSizes[dataType], + ); + tester.execute({ inputValue: point }); + const values = tester.values; + return { + color: vec4.fromValues( + values.val1, + values.val2, + values.val3, + values.val4, + ), + size: values.val5, + }; + }; + const minValue = defaultDataTypeRange[dataType][0]; + const maxValue = defaultDataTypeRange[dataType][1]; + const gl = tester.gl; + const usedSize = Math.min( + textureSizes[dataType], + gl.getParameter(gl.MAX_TEXTURE_SIZE), + ); + { + const { color, size } = testShader(minValue); + expect(size).toBe(usedSize - 1); + expect(color).toEqual(vec4.fromValues(0, 0, 0, 0)); + } + { + const { color, size } = testShader(maxValue); + expect(size).toBe(usedSize - 1); + expect(color).toEqual(vec4.fromValues(1, 1, 1, 1)); + } + let position: number | Uint64; + if (dataType !== DataType.UINT64) { + const minValueNumber = minValue as number; + const maxValueNumber = maxValue as number; + position = (maxValueNumber + minValueNumber) / 2; + } else { + const value = (maxValue as Uint64).toNumber() / 2; + position = Uint64.fromNumber(value); + } + const { color, size } = testShader(position); + expect(size).toBe(usedSize - 1); + for (let i = 0; i < 3; i++) { + expect(color[i]).toBeCloseTo(0.5); + } + }, + ); + }); + } +}); diff --git a/src/widget/transfer_function.css b/src/widget/transfer_function.css new file mode 100644 index 000000000..d402128d3 --- /dev/null +++ b/src/widget/transfer_function.css @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.neuroglancer-transfer-function-panel { + height: 60px; + border: 1px solid #666; + margin-top: 5px; +} + +.neuroglancer-transfer-function-color-picker { + text-align: right; +} + +.neuroglancer-transfer-function-widget-bound { + background-color: transparent; + border-color: transparent; + box-shadow: none; + border: 0; + margin: 0; + font-family: monospace; + font-size: medium; + color: cyan; +} + +.neuroglancer-transfer-function-window-bounds { + display: flex; + justify-content: space-between; +} diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts new file mode 100644 index 000000000..9f2fffed3 --- /dev/null +++ b/src/widget/transfer_function.ts @@ -0,0 +1,1721 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/widget/transfer_function.css"; + +import type { CoordinateSpaceCombiner } from "#src/coordinate_transform.js"; +import type { DisplayContext } from "#src/display_context.js"; +import { IndirectRenderedPanel } from "#src/display_context.js"; +import type { UserLayer } from "#src/layer/index.js"; +import { Position } from "#src/navigation_state.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; +import { makeCachedDerivedWatchableValue } from "#src/trackable_value.js"; +import type { ToolActivation } from "#src/ui/tool.js"; +import { + arraysEqual, + arraysEqualWithPredicate, + findClosestMatchInSortedArray, +} from "#src/util/array.js"; +import { DATA_TYPE_SIGNED, DataType } from "#src/util/data_type.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { + EventActionMap, + registerActionListener, +} from "#src/util/event_action_map.js"; +import { kZeroVec4, vec3, vec4 } from "#src/util/geom.js"; +import type { DataTypeInterval } from "#src/util/lerp.js"; +import { + computeInvlerp, + computeLerp, + defaultDataTypeRange, + parseDataTypeValue, +} from "#src/util/lerp.js"; +import { MouseEventBinder } from "#src/util/mouse_bindings.js"; +import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; +import type { Uint64 } from "#src/util/uint64.js"; +import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; +import { + defineInvlerpShaderFunction, + enableLerpShaderFunction, +} from "#src/webgl/lerp.js"; +import { + defineLineShader, + drawLines, + initializeLineShader, + VERTICES_PER_LINE, +} from "#src/webgl/lines.js"; +import { drawQuads } from "#src/webgl/quad.js"; +import { createGriddedRectangleArray } from "#src/webgl/rectangle_grid_buffer.js"; +import type { ShaderCodePart, ShaderProgram } from "#src/webgl/shader.js"; +import { ShaderBuilder } from "#src/webgl/shader.js"; +import { getShaderType } from "#src/webgl/shader_lib.js"; +import { setRawTextureParameters } from "#src/webgl/texture.js"; +import { ColorWidget } from "#src/widget/color.js"; +import { + getUpdatedRangeAndWindowParameters, + updateInputBoundValue, + updateInputBoundWidth, +} from "#src/widget/invlerp.js"; +import type { + LayerControlFactory, + LayerControlTool, +} from "#src/widget/layer_control.js"; +import { PositionWidget } from "#src/widget/position_widget.js"; +import { Tab } from "#src/widget/tab_view.js"; + +const TRANSFER_FUNCTION_PANEL_SIZE = 512; +export const NUM_COLOR_CHANNELS = 4; +const POSITION_VALUES_PER_LINE = 4; // x1, y1, x2, y2 +const CONTROL_POINT_X_GRAB_DISTANCE = 0.05; +const TRANSFER_FUNCTION_BORDER_WIDTH = 0.05; + +const transferFunctionSamplerTextureUnit = Symbol( + "transferFunctionSamplerTexture", +); + +const defaultTransferFunctionSizes: Record = { + [DataType.UINT8]: 256, + [DataType.INT8]: 256, + [DataType.UINT16]: 8192, + [DataType.INT16]: 8192, + [DataType.UINT32]: 8192, + [DataType.INT32]: 8192, + [DataType.UINT64]: 8192, + [DataType.FLOAT32]: 8192, +}; + +/** + * Options to update a lookup table texture with a direct lookup table + */ +export interface LookupTableTextureOptions { + /** A lookup table is a series of color values (0 - 255) for each index in the transfer function texture + */ + lookupTable: LookupTable; + /** textureUnit to update with the new transfer function texture data */ + textureUnit: number | undefined; +} + +/** + * Options to update a transfer function texture using control points + */ +export interface ControlPointTextureOptions { + /** controlPoints will be used to generate a lookup table as a first step */ + sortedControlPoints: SortedControlPoints; + /** textureUnit to update with the new transfer function texture data */ + textureUnit: number | undefined; + /** Data type of the control points */ + dataType: DataType; + /** Lookup table number of elements*/ + lookupTableSize: number; +} + +export interface TransferFunctionParameters { + sortedControlPoints: SortedControlPoints; + window: DataTypeInterval; + channel: number[]; + defaultColor: vec3; +} + +interface CanvasPosition { + normalizedX: number; + normalizedY: number; +} + +/** + * Transfer functions are controlled via a set of control points + * with an input value and an output RGBA color (Uint8). + * These control points are interpolated between to form a lookup table + * which maps an input data value to an RGBA color. + * Such a lookup table is used to form a texture, which can be sampled + * from during rendering. + */ +export class ControlPoint { + constructor( + public inputValue: number | Uint64, + public outputColor: vec4 = kZeroVec4, + ) {} + + /** Convert the input value to a normalized value between 0 and 1 */ + normalizedInput(range: DataTypeInterval): number { + return computeInvlerp(range, this.inputValue); + } + + /** Convert the input value to an integer index into the transfer function lookup texture */ + transferFunctionIndex( + dataRange: DataTypeInterval, + transferFunctionSize: number, + ): number { + return Math.floor( + this.normalizedInput(dataRange) * (transferFunctionSize - 1), + ); + } + interpolateColor(other: ControlPoint, t: number): vec4 { + const outputColor = vec4.create(); + for (let i = 0; i < 4; ++i) { + outputColor[i] = computeLerp( + [this.outputColor[i], other.outputColor[i]], + DataType.UINT8, + t, + ) as number; + } + return outputColor; + } + static copyFrom(other: ControlPoint) { + const inputValue = other.inputValue; + const outputColor = vec4.clone(other.outputColor); + return new ControlPoint(inputValue, outputColor); + } +} + +export class SortedControlPoints { + public range: DataTypeInterval; + constructor( + public controlPoints: ControlPoint[] = [], + public dataType: DataType, + private autoComputeRange: boolean = true, + ) { + this.controlPoints = controlPoints; + this.range = defaultDataTypeRange[dataType]; + this.sortAndComputeRange(); + } + get length() { + return this.controlPoints.length; + } + addPoint(controlPoint: ControlPoint) { + const { inputValue, outputColor } = controlPoint; + const exactMatch = this.controlPoints.findIndex( + (point) => point.inputValue === inputValue, + ); + if (exactMatch !== -1) { + this.updatePointColor(exactMatch, outputColor); + } + const newPoint = new ControlPoint(inputValue, outputColor); + this.controlPoints.push(newPoint); + this.sortAndComputeRange(); + } + removePoint(index: number) { + this.controlPoints.splice(index, 1); + this.computeRange(); + } + updatePoint(index: number, controlPoint: ControlPoint): number { + this.controlPoints[index] = controlPoint; + const value = controlPoint.inputValue; + const outputValue = controlPoint.outputColor; + this.sortAndComputeRange(); + // Return the index of the original point after sorting + for (let i = 0; i < this.controlPoints.length; ++i) { + if ( + this.controlPoints[i].inputValue === value && + arraysEqual(this.controlPoints[i].outputColor, outputValue) + ) { + return i; + } + } + return -1; + } + updatePointColor(index: number, color: vec4 | vec3) { + let outputColor = vec4.create(); + if (color.length === 3) { + const opacity = this.controlPoints[index].outputColor[3]; + outputColor = vec4.fromValues(color[0], color[1], color[2], opacity); + } else { + outputColor = vec4.clone(color as vec4); + } + this.controlPoints[index].outputColor = outputColor; + } + findNearestControlPointIndex(inputValue: number | Uint64) { + const controlPoint = new ControlPoint(inputValue); + const valueToFind = controlPoint.normalizedInput(this.range); + return this.findNearestControlPointIndexByNormalizedInput(valueToFind); + } + findNearestControlPointIndexByNormalizedInput(normalizedInput: number) { + return findClosestMatchInSortedArray( + this.controlPoints.map((point) => point.normalizedInput(this.range)), + normalizedInput, + (a, b) => a - b, + ); + } + private sortAndComputeRange() { + this.controlPoints.sort( + (a, b) => a.normalizedInput(this.range) - b.normalizedInput(this.range), + ); + this.computeRange(); + } + private computeRange() { + if (this.autoComputeRange) { + if (this.controlPoints.length == 0) { + this.range = defaultDataTypeRange[this.dataType]; + } else if (this.controlPoints.length === 1) { + this.range = [ + this.controlPoints[0].inputValue, + defaultDataTypeRange[this.dataType][1], + ] as DataTypeInterval; + } else { + this.range = [ + this.controlPoints[0].inputValue, + this.controlPoints[this.controlPoints.length - 1].inputValue, + ] as DataTypeInterval; + } + } + if (this.range[0] === this.range[1]) { + this.range = defaultDataTypeRange[this.dataType]; + } + } + copy() { + const copy = new SortedControlPoints( + [], + this.dataType, + this.autoComputeRange, + ); + copy.range = this.range; + copy.controlPoints = this.controlPoints.map((point) => + ControlPoint.copyFrom(point), + ); + return copy; + } +} + +export class LookupTable { + outputValues: Uint8Array; + constructor(public lookupTableSize: number) { + this.outputValues = new Uint8Array( + lookupTableSize * NUM_COLOR_CHANNELS, + ).fill(0); + } + + resize(newSize: number) { + this.lookupTableSize = newSize; + this.outputValues = new Uint8Array(newSize * NUM_COLOR_CHANNELS).fill(0); + } + + /** + * Fill a lookup table with color values between control points via linear interpolation. + * Everything before the first point is transparent, + * everything after the last point has the color of the last point. + * + * @param controlPoints The control points to interpolate between + * @param dataRange The range of the input data space + */ + updateFromControlPoints( + sortedControlPoints: SortedControlPoints, + window: DataTypeInterval | undefined = undefined, + ) { + const range = window ? window : sortedControlPoints.range; + const { controlPoints } = sortedControlPoints; + const out = this.outputValues; + const size = this.lookupTableSize; + function addLookupValue(index: number, color: vec4) { + out[index] = color[0]; + out[index + 1] = color[1]; + out[index + 2] = color[2]; + out[index + 3] = color[3]; + } + /** + * Convert the control point input value to an index in the transfer function lookup table + */ + function toTransferFunctionSpace(controlPoint: ControlPoint) { + return controlPoint.transferFunctionIndex(range, size); + } + + // If no control points - return all transparent + if (controlPoints.length === 0) { + out.fill(0); + return; + } + + // If first control point not at 0 - fill in transparent values + // up to the first point + const firstInputValue = toTransferFunctionSpace(controlPoints[0]); + if (firstInputValue > 0) { + const transparent = vec4.fromValues(0, 0, 0, 0); + for (let i = 0; i < firstInputValue; ++i) { + const index = i * NUM_COLOR_CHANNELS; + addLookupValue(index, transparent); + } + } + + // Interpolate between control points and fill to end with last color + let controlPointIndex = 0; + for (let i = firstInputValue; i < size; ++i) { + const currentPoint = controlPoints[controlPointIndex]; + const lookupIndex = i * NUM_COLOR_CHANNELS; + if (controlPointIndex === controlPoints.length - 1) { + addLookupValue(lookupIndex, currentPoint.outputColor); + } else { + const nextPoint = controlPoints[controlPointIndex + 1]; + const currentPointIndex = toTransferFunctionSpace(currentPoint); + const nextPointIndex = toTransferFunctionSpace(nextPoint); + const t = + (i - currentPointIndex) / (nextPointIndex - currentPointIndex); + const lerpedColor = currentPoint.interpolateColor(nextPoint, t); + addLookupValue(lookupIndex, lerpedColor); + if (i >= nextPointIndex) { + controlPointIndex++; + } + } + } + } + static equal(a: LookupTable, b: LookupTable) { + return arraysEqual(a.outputValues, b.outputValues); + } + copy() { + const copy = new LookupTable(this.lookupTableSize); + copy.outputValues.set(this.outputValues); + return copy; + } +} + +/** + * Handles a linked lookup table and control points for a transfer function. + */ +export class TransferFunction extends RefCounted { + lookupTable: LookupTable; + constructor( + public dataType: DataType, + public trackable: WatchableValueInterface, + size: number = defaultTransferFunctionSizes[dataType], + ) { + super(); + this.lookupTable = new LookupTable(size); + this.updateLookupTable(); + } + get sortedControlPoints() { + return this.trackable.value.sortedControlPoints; + } + get range() { + return this.sortedControlPoints.range; + } + get size() { + return this.lookupTable.lookupTableSize; + } + updateLookupTable(window: DataTypeInterval | undefined = undefined) { + this.lookupTable.updateFromControlPoints(this.sortedControlPoints, window); + } + addPoint(controlPoint: ControlPoint) { + this.sortedControlPoints.addPoint(controlPoint); + } + updatePoint(index: number, controlPoint: ControlPoint): number { + return this.sortedControlPoints.updatePoint(index, controlPoint); + } + removePoint(index: number) { + this.sortedControlPoints.removePoint(index); + } + updatePointColor(index: number, color: vec4 | vec3) { + this.sortedControlPoints.updatePointColor(index, color); + } + findNearestControlPointIndex( + normalizedInputValue: number, + dataWindow: DataTypeInterval, + ) { + const absoluteValue = computeLerp( + dataWindow, + this.dataType, + normalizedInputValue, + ); + return this.sortedControlPoints.findNearestControlPointIndex(absoluteValue); + } +} + +abstract class BaseLookupTexture extends RefCounted { + texture: WebGLTexture | null = null; + protected width: number; + protected height = 1; + protected priorOptions: + | LookupTableTextureOptions + | ControlPointTextureOptions + | undefined = undefined; + constructor(public gl: GL | null) { + super(); + } + /** + * Compare the existing options to the new options to determine if the texture needs to be updated + */ + abstract optionsEqual( + newOptions: LookupTableTextureOptions | ControlPointTextureOptions, + ): boolean; + abstract createLookupTable( + options: LookupTableTextureOptions | ControlPointTextureOptions, + ): LookupTable; + abstract setOptions( + options: LookupTableTextureOptions | ControlPointTextureOptions, + ): void; + updateAndActivate( + options: LookupTableTextureOptions | ControlPointTextureOptions, + ) { + const { gl } = this; + if (gl === null) return; + let { texture } = this; + + function activateAndBindTexture(gl: GL, textureUnit: number | undefined) { + if (textureUnit === undefined) { + throw new Error( + "Texture unit must be defined for transfer function texture", + ); + } + gl.activeTexture(WebGL2RenderingContext.TEXTURE0 + textureUnit); + gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, texture); + } + // If the texture is already up to date, just bind and activate it + if (texture !== null && this.optionsEqual(options)) { + activateAndBindTexture(gl, options.textureUnit); + return this.width * this.height; + } + // If the texture has not been created yet, create it + if (texture === null) { + texture = this.texture = gl.createTexture(); + } + // Update the texture + activateAndBindTexture(gl, options.textureUnit); + setRawTextureParameters(gl); + const lookupTable = this.createLookupTable(options); + + gl.texImage2D( + WebGL2RenderingContext.TEXTURE_2D, + 0, + WebGL2RenderingContext.RGBA, + this.width, + this.height, + 0, + WebGL2RenderingContext.RGBA, + WebGL2RenderingContext.UNSIGNED_BYTE, + lookupTable.outputValues, + ); + + // Update the prior options to the current options for future comparisons + this.setOptions(options); + return this.width * this.height; + } + setTextureWidthAndHeightFromSize(size: number) { + this.width = size; + } + disposed() { + this.gl?.deleteTexture(this.texture); + this.texture = null; + this.priorOptions = undefined; + super.disposed(); + } +} + +/** + * Represent the underlying transfer function lookup table as a texture + */ +class DirectLookupTableTexture extends BaseLookupTexture { + texture: WebGLTexture | null = null; + protected priorOptions: LookupTableTextureOptions | undefined = undefined; + + constructor(public gl: GL | null) { + super(gl); + } + optionsEqual(newOptions: LookupTableTextureOptions) { + const existingOptions = this.priorOptions; + if (existingOptions === undefined) return false; + const lookupTableEqual = LookupTable.equal( + existingOptions.lookupTable, + newOptions.lookupTable, + ); + const textureUnitEqual = + existingOptions.textureUnit === newOptions.textureUnit; + return lookupTableEqual && textureUnitEqual; + } + createLookupTable(options: LookupTableTextureOptions): LookupTable { + this.setTextureWidthAndHeightFromSize(options.lookupTable.lookupTableSize); + return options.lookupTable; + } + setOptions(options: LookupTableTextureOptions) { + this.priorOptions = { + ...options, + lookupTable: options.lookupTable.copy(), + }; + } +} + +export class ControlPointTexture extends BaseLookupTexture { + protected priorOptions: ControlPointTextureOptions | undefined; + constructor(public gl: GL | null) { + super(gl); + } + optionsEqual(newOptions: ControlPointTextureOptions): boolean { + const existingOptions = this.priorOptions; + if (existingOptions === undefined) return false; + const controlPointsEqual = arraysEqualWithPredicate( + existingOptions.sortedControlPoints.controlPoints, + newOptions.sortedControlPoints.controlPoints, + (a, b) => + a.inputValue === b.inputValue && + arraysEqual(a.outputColor, b.outputColor), + ); + const textureUnitEqual = + existingOptions.textureUnit === newOptions.textureUnit; + const dataTypeEqual = existingOptions.dataType === newOptions.dataType; + return controlPointsEqual && textureUnitEqual && dataTypeEqual; + } + setOptions(options: ControlPointTextureOptions) { + this.priorOptions = { + ...options, + sortedControlPoints: options.sortedControlPoints.copy(), + }; + } + createLookupTable(options: ControlPointTextureOptions): LookupTable { + const lookupTableSize = this.ensureTextureSize(options.lookupTableSize); + if (lookupTableSize === undefined) return new LookupTable(0); + this.setTextureWidthAndHeightFromSize(lookupTableSize); + const lookupTable = new LookupTable(lookupTableSize); + const sortedControlPoints = options.sortedControlPoints; + lookupTable.updateFromControlPoints(sortedControlPoints); + return lookupTable; + } + ensureTextureSize(size: number) { + const gl = this.gl; + if (gl === null) return; + const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + const tableTextureSize = Math.min(size, maxTextureSize); + return tableTextureSize; + } +} + +/** + * Display the UI canvas for the transfer function widget and + * handle shader updates for elements of the canvas + */ +class TransferFunctionPanel extends IndirectRenderedPanel { + texture: DirectLookupTableTexture; + private textureVertexBuffer: Buffer; + private textureVertexBufferArray: Float32Array; + private controlPointsVertexBuffer: Buffer; + private controlPointsPositionArray = new Float32Array(); + private controlPointsColorBuffer: Buffer; + private controlPointsColorArray = new Float32Array(); + private linePositionBuffer: Buffer; + private linePositionArray = new Float32Array(); + get drawOrder() { + return 1; + } + transferFunction = this.registerDisposer( + new TransferFunction( + this.parent.dataType, + this.parent.trackable, + TRANSFER_FUNCTION_PANEL_SIZE, + ), + ); + controller = this.registerDisposer( + new TransferFunctionController( + this.element, + this.parent.dataType, + this.transferFunction, + () => this.parent.trackable.value, + (value: TransferFunctionParameters) => { + this.parent.trackable.value = value; + }, + ), + ); + constructor(public parent: TransferFunctionWidget) { + super(parent.display, document.createElement("div"), parent.visibility); + const { element, gl } = this; + element.classList.add("neuroglancer-transfer-function-panel"); + this.textureVertexBufferArray = createGriddedRectangleArray( + TRANSFER_FUNCTION_PANEL_SIZE, + ); + this.texture = this.registerDisposer(new DirectLookupTableTexture(gl)); + + function createBuffer(dataArray: Float32Array) { + return getMemoizedBuffer( + gl, + WebGL2RenderingContext.ARRAY_BUFFER, + () => dataArray, + ).value; + } + this.textureVertexBuffer = this.registerDisposer( + createBuffer(this.textureVertexBufferArray), + ); + this.controlPointsVertexBuffer = this.registerDisposer( + createBuffer(this.controlPointsPositionArray), + ); + this.controlPointsColorBuffer = this.registerDisposer( + createBuffer(this.controlPointsColorArray), + ); + this.linePositionBuffer = this.registerDisposer( + createBuffer(this.linePositionArray), + ); + } + + updateTransferFunctionPointsAndLines() { + // Normalize position to [-1, 1] for shader (x axis) + const window = this.parent.trackable.value.window; + function normalizeInput(input: number | Uint64) { + const lerpedInput = computeInvlerp(window, input); + return lerpedInput * 2 - 1; + } + // Normalize opacity to [-1, 1] for shader (y axis) + function normalizeOpacity(opacity: number) { + return (opacity / 255) * 2 - 1; + } + // Normalize color to [0, 1] for shader (color channels) + function normalizeColor(colorComponent: number) { + return colorComponent / 255; + } + function addLine( + array: Float32Array, + index: number, + positions: vec4, + ): number { + for (let i = 0; i < VERTICES_PER_LINE; ++i) { + array[index++] = positions[0]; + array[index++] = positions[1]; + array[index++] = positions[2]; + array[index++] = positions[3]; + } + return index; + } + function isInWindow(normalizedInput: number) { + return normalizedInput >= -1 && normalizedInput <= 1; + } + + const { transferFunction } = this; + const { controlPoints } = + transferFunction.trackable.value.sortedControlPoints; + let numLines = Math.max(controlPoints.length - 1, 0); + const colorChannels = NUM_COLOR_CHANNELS - 1; // ignore alpha + const colorArray = new Float32Array(controlPoints.length * colorChannels); + const positionArray = new Float32Array(controlPoints.length * 2); + let linePositionArrayIndex = 0; + let lineFromLeftEdge = null; + let lineToRightEdge = null; + // Map all control points to normalized values for the shader + const normalizedControlPoints = controlPoints.map((point) => { + const input = normalizeInput(point.inputValue); + const output = normalizeOpacity(point.outputColor[3]); + return { input, output }; + }); + + // Create start and end lines if there are any control points + if (controlPoints.length > 0) { + // Try to find the first and last point in the window + + const { + firstPointIndexInWindow, + lastPointIndexInWindow, + pointClosestToLeftEdge, + pointClosestToRightEdge, + } = findPointsNearWindowBounds(); + // If there are no points in the window, check if everything is left or right of the window + // Draw a single line from the left edge to the right edge if all points are left of the window + if (firstPointIndexInWindow === null) { + const allPointsLeftOfWindow = + normalizedControlPoints[controlPoints.length - 1].input < -1; + const allPointsRightOfWindow = normalizedControlPoints[0].input > 1; + if (allPointsLeftOfWindow) { + drawHorizontalLineFromPointOutsideLeftWindow(); + } + // There are no points in the window, but points on either side + // Draw lines from the leftmost and rightmost points starting + // from the left edge and ending at the right edge via interpolation + else if (!allPointsRightOfWindow && controlPoints.length > 1) { + drawLineBetweenPointsBothOutsideWindow( + pointClosestToLeftEdge, + pointClosestToRightEdge, + ); + } + } else { + const firstPointInWindow = + normalizedControlPoints[firstPointIndexInWindow]; + if (firstPointInWindow.input > -1) { + // If there is a value to the left, draw a line from the point outside the window to the first point in the window + if (firstPointIndexInWindow > 0) { + drawLineBetweenPointInWindowAndLeftPointOutsideWindow( + firstPointIndexInWindow, + firstPointInWindow, + ); + } + // If the first point in the window is the leftmost point, draw a 0 line up to the point + else { + lineFromLeftEdge = vec4.fromValues( + firstPointInWindow.input, + -1, + firstPointInWindow.input, + firstPointInWindow.output, + ); + } + numLines += 1; + } + // Need to draw a line from the last control point in the window to the right edge + const lastPointInWindow = + normalizedControlPoints[lastPointIndexInWindow!]; + if (lastPointInWindow.input < 1) { + // If there is a value to the right, draw a line from the last point in the window to the point outside the window + if (lastPointIndexInWindow! < controlPoints.length - 1) { + drawLineBetweenPointInWindowAndRightPointOutsideWindow( + lastPointIndexInWindow, + lastPointInWindow, + ); + } + // If the last point in the window is the rightmost point, draw a line from the point to the right edge + else { + lineToRightEdge = vec4.fromValues( + lastPointInWindow.input, + lastPointInWindow.output, + 1, + lastPointInWindow.output, + ); + } + numLines += 1; + } + } + } + + const lines: vec4[] = []; + // Update points and draw lines between control points + for (let i = 0; i < controlPoints.length; ++i) { + const colorIndex = i * colorChannels; + const positionIndex = i * 2; + const inputValue = normalizedControlPoints[i].input; + const outputValue = normalizedControlPoints[i].output; + const { outputColor } = controlPoints[i]; + colorArray[colorIndex] = normalizeColor(outputColor[0]); + colorArray[colorIndex + 1] = normalizeColor(outputColor[1]); + colorArray[colorIndex + 2] = normalizeColor(outputColor[2]); + positionArray[positionIndex] = inputValue; + positionArray[positionIndex + 1] = outputValue; + + // Don't create a line for the last point + if (i === controlPoints.length - 1) break; + if (!(isInWindow(inputValue) && isInWindow(outputValue))) continue; + numLines += 1; + const lineBetweenPoints = vec4.fromValues( + inputValue, + outputValue, + normalizedControlPoints[i + 1].input, + normalizedControlPoints[i + 1].output, + ); + lines.push(lineBetweenPoints); + } + + // Create and fill the line position array + const linePositionArray = new Float32Array( + numLines * POSITION_VALUES_PER_LINE * VERTICES_PER_LINE, + ); + + if (lineFromLeftEdge !== null) { + linePositionArrayIndex = addLine( + linePositionArray, + linePositionArrayIndex, + lineFromLeftEdge, + ); + } + + for (const lineBetweenPoints of lines) { + linePositionArrayIndex = addLine( + linePositionArray, + linePositionArrayIndex, + lineBetweenPoints, + ); + } + + // Draw a horizontal line out from the last point + if (lineToRightEdge !== null) { + addLine(linePositionArray, linePositionArrayIndex, lineToRightEdge); + } + + // Update buffers + this.controlPointsColorArray = colorArray; + this.controlPointsPositionArray = positionArray; + this.linePositionArray = linePositionArray; + this.controlPointsVertexBuffer.setData(this.controlPointsPositionArray); + this.controlPointsColorBuffer.setData(this.controlPointsColorArray); + this.linePositionBuffer.setData(this.linePositionArray); + + function drawLineBetweenPointInWindowAndRightPointOutsideWindow( + lastPointIndexInWindow: number | null, + lastPointInWindow: { input: number; output: number }, + ) { + const pointAfterWindow = + normalizedControlPoints[lastPointIndexInWindow! + 1]; + const interpFactor = computeInvlerp( + [lastPointInWindow.input, pointAfterWindow.input], + 1, + ); + const lineEndY = computeLerp( + [lastPointInWindow.output, pointAfterWindow.output], + DataType.FLOAT32, + interpFactor, + ) as number; + lineToRightEdge = vec4.fromValues( + lastPointInWindow.input, + lastPointInWindow.output, + 1, + lineEndY, + ); + } + + function drawLineBetweenPointInWindowAndLeftPointOutsideWindow( + firstPointIndexInWindow: number, + firstPointInWindow: { input: number; output: number }, + ) { + const pointBeforeWindow = + normalizedControlPoints[firstPointIndexInWindow - 1]; + const interpFactor = computeInvlerp( + [pointBeforeWindow.input, firstPointInWindow.input], + -1, + ); + const lineStartY = computeLerp( + [pointBeforeWindow.output, firstPointInWindow.output], + DataType.FLOAT32, + interpFactor, + ) as number; + lineFromLeftEdge = vec4.fromValues( + -1, + lineStartY, + firstPointInWindow.input, + firstPointInWindow.output, + ); + } + + function drawLineBetweenPointsBothOutsideWindow( + pointClosestToLeftEdge: { input: number; output: number } | null, + pointClosestToRightEdge: { input: number; output: number } | null, + ) { + numLines += 1; + if (pointClosestToLeftEdge === null || pointClosestToRightEdge === null) { + throw new Error( + "Could not find points closest to the left and right edges", + ); + } + const leftInterpFactor = computeInvlerp( + [pointClosestToLeftEdge.input, pointClosestToRightEdge.input], + -1, + ); + const rightInterpFactor = computeInvlerp( + [pointClosestToLeftEdge.input, pointClosestToRightEdge.input], + 1, + ); + const leftLineY = computeLerp( + [pointClosestToLeftEdge.output, pointClosestToRightEdge.output], + DataType.FLOAT32, + leftInterpFactor, + ) as number; + const rightLineY = computeLerp( + [pointClosestToLeftEdge.output, pointClosestToRightEdge.output], + DataType.FLOAT32, + rightInterpFactor, + ) as number; + lineFromLeftEdge = vec4.fromValues(-1, leftLineY, 1, rightLineY); + } + + function findPointsNearWindowBounds() { + let firstPointIndexInWindow = null; + let lastPointIndexInWindow = null; + let pointClosestToLeftEdge = null; + let pointClosestToRightEdge = null; + for (let i = 0; i < controlPoints.length; ++i) { + const point = normalizedControlPoints[i]; + if (isInWindow(point.input)) { + firstPointIndexInWindow = firstPointIndexInWindow ?? i; + lastPointIndexInWindow = i; + } + if (point.input < -1) { + pointClosestToLeftEdge = point; + } else if (point.input > 1) { + pointClosestToRightEdge = point; + break; + } + } + return { + firstPointIndexInWindow, + lastPointIndexInWindow, + pointClosestToLeftEdge, + pointClosestToRightEdge, + }; + } + + function drawHorizontalLineFromPointOutsideLeftWindow() { + const indexOfReferencePoint = controlPoints.length - 1; + numLines += 1; + const referenceOpacity = + normalizedControlPoints[indexOfReferencePoint].output; + lineFromLeftEdge = vec4.fromValues( + -1, + referenceOpacity, + 1, + referenceOpacity, + ); + } + } + + private transferFunctionLineShader = this.registerDisposer( + (() => { + const builder = new ShaderBuilder(this.gl); + defineLineShader(builder); + builder.addAttribute("vec4", "aLineStartEnd"); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.addVarying("float", "vColor"); + builder.setVertexMain(` +vec4 start = vec4(aLineStartEnd[0], aLineStartEnd[1], 0.0, 1.0); +vec4 end = vec4(aLineStartEnd[2], aLineStartEnd[3], 0.0, 1.0); +emitLine(start, end, 1.0); +`); + builder.setFragmentMain(` +out_color = vec4(0.0, 1.0, 1.0, getLineAlpha()); +`); + return builder.build(); + })(), + ); + + private transferFunctionShader = this.registerDisposer( + (() => { + const builder = new ShaderBuilder(this.gl); + builder.addAttribute("vec2", "aVertexPosition"); + builder.addVarying("vec2", "vTexCoord"); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.addTextureSampler( + "sampler2D", + "uSampler", + transferFunctionSamplerTextureUnit, + ); + builder.addUniform("float", "uTransferFunctionEnd"); + builder.setVertexMain(` +gl_Position = vec4(aVertexPosition, 0.0, 1.0); +vTexCoord = (aVertexPosition + 1.0) / 2.0; +`); + builder.setFragmentMain(` +ivec2 texel = ivec2(floor(vTexCoord.x * uTransferFunctionEnd), 0); +out_color = texelFetch(uSampler, texel, 0); +`); + return builder.build(); + })(), + ); + + private controlPointsShader = this.registerDisposer( + (() => { + const builder = new ShaderBuilder(this.gl); + builder.addAttribute("vec2", "aVertexPosition"); + builder.addAttribute("vec3", "aVertexColor"); + builder.addVarying("vec3", "vColor"); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.setVertexMain(` +gl_Position = vec4(aVertexPosition, 0.0, 1.0); +gl_PointSize = 14.0; +vColor = aVertexColor; +`); + // Draw control points as circles with a border + // The border is white if the color is dark, black if the color is light + builder.setFragmentMain(` +float vColorSum = vColor.r + vColor.g + vColor.b; +vec3 bordercolor = vec3(0.0, 0.0, 0.0); +if (vColorSum < 0.4) { + bordercolor = vec3(1.0, 1.0, 1.0); +} +float dist = distance(gl_PointCoord, vec2(0.5, 0.5)); +float alpha = smoothstep(0.25, 0.4, dist); +vec4 tempColor = vec4(mix(vColor, bordercolor, alpha), 1.0); +alpha = 1.0 - smoothstep(0.4, 0.5, dist); +out_color = tempColor * alpha; +`); + return builder.build(); + })(), + ); + + drawIndirect() { + const { + transferFunctionLineShader, + gl, + transferFunctionShader, + controlPointsShader, + } = this; + this.setGLLogicalViewport(); + gl.clearColor(0.0, 0.0, 0.0, 0.0); + gl.clear(WebGL2RenderingContext.COLOR_BUFFER_BIT); + gl.enable(WebGL2RenderingContext.BLEND); + gl.blendFunc( + WebGL2RenderingContext.SRC_ALPHA, + WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, + ); + gl.disable(WebGL2RenderingContext.DEPTH_TEST); + gl.disable(WebGL2RenderingContext.STENCIL_TEST); + { + // Draw transfer function texture + transferFunctionShader.bind(); + const aVertexPosition = + transferFunctionShader.attribute("aVertexPosition"); + gl.uniform1f( + transferFunctionShader.uniform("uTransferFunctionEnd"), + TRANSFER_FUNCTION_PANEL_SIZE - 1, + ); + this.textureVertexBuffer.bindToVertexAttrib( + aVertexPosition, + /*components=*/ 2, + /*attributeType=*/ WebGL2RenderingContext.FLOAT, + ); + const textureUnit = transferFunctionShader.textureUnit( + transferFunctionSamplerTextureUnit, + ); + this.texture.updateAndActivate({ + lookupTable: this.transferFunction.lookupTable, + textureUnit, + }); + drawQuads(this.gl, TRANSFER_FUNCTION_PANEL_SIZE, 1); + gl.disableVertexAttribArray(aVertexPosition); + gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, null); + } + // Draw lines and control points on top of transfer function - if there are any + if (this.controlPointsPositionArray.length > 0) { + const { renderViewport } = this; + + // Draw transfer function lerp indicator lines + transferFunctionLineShader.bind(); + const aLineStartEnd = + transferFunctionLineShader.attribute("aLineStartEnd"); + this.linePositionBuffer.bindToVertexAttrib( + aLineStartEnd, + /*components=*/ 4, + /*attributeType=*/ WebGL2RenderingContext.FLOAT, + ); + initializeLineShader( + transferFunctionLineShader, + { + width: renderViewport.logicalWidth, + height: renderViewport.logicalHeight, + }, + /*featherWidthInPixels=*/ 1, + ); + drawLines( + gl, + this.linePositionArray.length / + (VERTICES_PER_LINE * POSITION_VALUES_PER_LINE), + 1, + ); + gl.disableVertexAttribArray(aLineStartEnd); + + // Draw control points of the transfer function + controlPointsShader.bind(); + const aVertexPosition = controlPointsShader.attribute("aVertexPosition"); + this.controlPointsVertexBuffer.bindToVertexAttrib( + aVertexPosition, + /*components=*/ 2, + /*attributeType=*/ WebGL2RenderingContext.FLOAT, + ); + const aVertexColor = controlPointsShader.attribute("aVertexColor"); + this.controlPointsColorBuffer.bindToVertexAttrib( + aVertexColor, + /*components=*/ 3, + /*attributeType=*/ WebGL2RenderingContext.FLOAT, + ); + gl.drawArrays(gl.POINTS, 0, this.controlPointsPositionArray.length / 2); + gl.disableVertexAttribArray(aVertexPosition); + gl.disableVertexAttribArray(aVertexColor); + } + gl.disable(WebGL2RenderingContext.BLEND); + } + update() { + this.transferFunction.updateLookupTable(this.parent.trackable.value.window); + this.updateTransferFunctionPointsAndLines(); + } + isReady() { + return true; + } +} + +/** + * Create the bounds on the UI window inputs for the transfer function widget + */ +function createWindowBoundInputs( + dataType: DataType, + model: WatchableValueInterface, +) { + function createWindowBoundInput(endpoint: number): HTMLInputElement { + const e = document.createElement("input"); + e.addEventListener("focus", () => { + e.select(); + }); + e.classList.add("neuroglancer-transfer-function-widget-bound"); + e.type = "text"; + e.spellcheck = false; + e.autocomplete = "off"; + e.title = `${ + endpoint === 0 ? "Lower" : "Upper" + } window for transfer function`; + return e; + } + + const container = document.createElement("div"); + container.classList.add("neuroglancer-transfer-function-window-bounds"); + const inputs = [createWindowBoundInput(0), createWindowBoundInput(1)]; + for (let endpointIndex = 0; endpointIndex < 2; ++endpointIndex) { + const input = inputs[endpointIndex]; + input.addEventListener("input", () => { + updateInputBoundWidth(input); + }); + input.addEventListener("change", () => { + const existingBounds = model.value.window; + const intervals = { range: existingBounds, window: existingBounds }; + try { + const value = parseDataTypeValue(dataType, input.value); + const window = getUpdatedRangeAndWindowParameters( + intervals, + "window", + endpointIndex, + value, + /*fitRangeInWindow=*/ true, + ).window; + if (window[0] === window[1]) { + throw new Error("Window bounds cannot be equal"); + } + model.value = { ...model.value, window }; + } catch { + updateInputBoundValue(input, existingBounds[endpointIndex]); + } + }); + } + container.appendChild(inputs[0]); + container.appendChild(inputs[1]); + return { + container, + inputs, + }; +} + +const inputEventMap = EventActionMap.fromObject({ + "shift?+mousedown0": { action: "add-or-drag-point" }, + "shift+dblclick0": { action: "remove-point" }, + "shift?+mousedown2": { action: "change-point-color" }, +}); + +/** + * Controller for the transfer function widget. Handles mouse events and updates to the model. + */ +class TransferFunctionController extends RefCounted { + private currentGrabbedControlPointIndex = -1; + constructor( + public element: HTMLElement, + public dataType: DataType, + private transferFunction: TransferFunction, + public getModel: () => TransferFunctionParameters, + public setModel: (value: TransferFunctionParameters) => void, + ) { + super(); + element.title = inputEventMap.describe(); + this.registerDisposer(new MouseEventBinder(element, inputEventMap)); + registerActionListener( + element, + "add-or-drag-point", + (actionEvent) => { + const mouseEvent = actionEvent.detail; + this.updateValue(this.addControlPoint(mouseEvent)); + startRelativeMouseDrag(mouseEvent, (newEvent: MouseEvent) => { + this.updateValue(this.moveControlPoint(newEvent)); + }); + }, + ); + registerActionListener( + element, + "remove-point", + (actionEvent) => { + const mouseEvent = actionEvent.detail; + const nearestIndex = this.findControlPointIfNearCursor(mouseEvent); + if (nearestIndex !== -1) { + this.transferFunction.removePoint(nearestIndex); + this.updateValue({ + ...this.getModel(), + sortedControlPoints: + this.transferFunction.trackable.value.sortedControlPoints, + }); + } + }, + ); + registerActionListener( + element, + "change-point-color", + (actionEvent) => { + const mouseEvent = actionEvent.detail; + const nearestIndex = this.findControlPointIfNearCursor(mouseEvent); + if (nearestIndex !== -1) { + const color = this.transferFunction.trackable.value.defaultColor; + const colorInAbsoluteValue = + this.convertPanelSpaceColorToAbsoluteValue(color); + this.transferFunction.updatePointColor( + nearestIndex, + colorInAbsoluteValue, + ); + this.updateValue({ + ...this.getModel(), + sortedControlPoints: + this.transferFunction.trackable.value.sortedControlPoints, + }); + } + }, + ); + } + updateValue(value: TransferFunctionParameters | undefined) { + if (value === undefined) return; + this.setModel(value); + } + convertPanelSpaceInputToAbsoluteValue(inputValue: number) { + return computeLerp( + this.transferFunction.trackable.value.window, + this.dataType, + inputValue, + ); + } + convertPanelSpaceColorToAbsoluteValue(color: vec3 | vec4) { + if (color.length === 3) { + // If color is vec3 + return vec3.fromValues( + Math.round(color[0] * 255), + Math.round(color[1] * 255), + Math.round(color[2] * 255), + ); + } else { + // If color is vec4 + return vec4.fromValues( + Math.round(color[0] * 255), + Math.round(color[1] * 255), + Math.round(color[2] * 255), + Math.round(color[3] * 255), + ); + } + } + addControlPoint(event: MouseEvent): TransferFunctionParameters | undefined { + const color = this.transferFunction.trackable.value.defaultColor; + const nearestIndex = this.findControlPointIfNearCursor(event); + if (nearestIndex !== -1) { + this.currentGrabbedControlPointIndex = nearestIndex; + return undefined; + } + const position = this.getControlPointPosition(event); + if (position === undefined) return undefined; + const { normalizedX, normalizedY } = position; + const outputColor = vec4.fromValues( + color[0], + color[1], + color[2], + normalizedY, + ); + this.transferFunction.addPoint( + new ControlPoint( + this.convertPanelSpaceInputToAbsoluteValue(normalizedX), + this.convertPanelSpaceColorToAbsoluteValue(outputColor) as vec4, + ), + ); + this.currentGrabbedControlPointIndex = + this.findControlPointIfNearCursor(event); + return { + ...this.getModel(), + sortedControlPoints: + this.transferFunction.trackable.value.sortedControlPoints, + }; + } + moveControlPoint(event: MouseEvent): TransferFunctionParameters | undefined { + if (this.currentGrabbedControlPointIndex !== -1) { + const position = this.getControlPointPosition(event); + if (position === undefined) return undefined; + const { normalizedX, normalizedY } = position; + const newColor = + this.transferFunction.trackable.value.sortedControlPoints.controlPoints[ + this.currentGrabbedControlPointIndex + ].outputColor; + newColor[3] = Math.round(normalizedY * 255); + this.currentGrabbedControlPointIndex = this.transferFunction.updatePoint( + this.currentGrabbedControlPointIndex, + new ControlPoint( + this.convertPanelSpaceInputToAbsoluteValue(normalizedX), + newColor, + ), + ); + return { + ...this.getModel(), + sortedControlPoints: + this.transferFunction.trackable.value.sortedControlPoints, + }; + } + return undefined; + } + getControlPointPosition(event: MouseEvent): CanvasPosition | undefined { + const clientRect = this.element.getBoundingClientRect(); + let normalizedX = (event.clientX - clientRect.left) / clientRect.width; + let normalizedY = (clientRect.bottom - event.clientY) / clientRect.height; + if ( + normalizedX < 0 || + normalizedX > 1 || + normalizedY < 0 || + normalizedY > 1 + ) + return undefined; + + // Near the borders of the transfer function, snap the control point to the border + if (normalizedX < TRANSFER_FUNCTION_BORDER_WIDTH / 3) { + normalizedX = 0.0; + } else if (normalizedX > 1 - TRANSFER_FUNCTION_BORDER_WIDTH / 3) { + normalizedX = 1.0; + } + if (normalizedY < TRANSFER_FUNCTION_BORDER_WIDTH) { + normalizedY = 0.0; + } else if (normalizedY > 1 - TRANSFER_FUNCTION_BORDER_WIDTH) { + normalizedY = 1.0; + } + + return { normalizedX, normalizedY }; + } + /** + * Find the nearest control point to the cursor or -1 if no control point is near the cursor. + * If multiple control points are near the cursor in X, the control point with the smallest + * distance in the Y direction is returned. + */ + findControlPointIfNearCursor(event: MouseEvent) { + const { transferFunction } = this; + const { window } = transferFunction.trackable.value; + const numControlPoints = + transferFunction.sortedControlPoints.controlPoints.length; + function convertControlPointInputToPanelSpace(controlPointIndex: number) { + if (controlPointIndex < 0 || controlPointIndex >= numControlPoints) { + return null; + } + return computeInvlerp( + window, + transferFunction.sortedControlPoints.controlPoints[controlPointIndex] + .inputValue, + ); + } + function convertControlPointOpacityToPanelSpace(controlPointIndex: number) { + if (controlPointIndex < 0 || controlPointIndex >= numControlPoints) { + return null; + } + return ( + transferFunction.sortedControlPoints.controlPoints[controlPointIndex] + .outputColor[3] / 255 + ); + } + const position = this.getControlPointPosition(event); + if (position === undefined) return -1; + const mouseXPosition = position.normalizedX; + const mouseYPosition = position.normalizedY; + const nearestControlPointIndex = + transferFunction.findNearestControlPointIndex(mouseXPosition, window); + if (nearestControlPointIndex === -1) { + return -1; + } + const nearestControlPointPanelPosition = + convertControlPointInputToPanelSpace(nearestControlPointIndex)!; + if ( + Math.abs(mouseXPosition - nearestControlPointPanelPosition) > + CONTROL_POINT_X_GRAB_DISTANCE + ) { + return -1; + } + // If points are nearby in X space, use Y space to break ties + const possibleMatches: [number, number][] = [ + [ + nearestControlPointIndex, + Math.abs( + convertControlPointOpacityToPanelSpace(nearestControlPointIndex)! - + mouseYPosition, + ), + ], + ]; + const nextPosition = convertControlPointInputToPanelSpace( + nearestControlPointIndex + 1, + ); + const nextDistance = + nextPosition !== null + ? Math.abs(nextPosition - mouseXPosition) + : Infinity; + if (nextDistance <= CONTROL_POINT_X_GRAB_DISTANCE) { + possibleMatches.push([ + nearestControlPointIndex + 1, + Math.abs( + convertControlPointOpacityToPanelSpace( + nearestControlPointIndex + 1, + )! - mouseYPosition, + ), + ]); + } + + const previousPosition = convertControlPointInputToPanelSpace( + nearestControlPointIndex - 1, + ); + const previousDistance = + previousPosition !== null + ? Math.abs(previousPosition - mouseXPosition) + : Infinity; + if (previousDistance <= CONTROL_POINT_X_GRAB_DISTANCE) { + possibleMatches.push([ + nearestControlPointIndex - 1, + Math.abs( + convertControlPointOpacityToPanelSpace( + nearestControlPointIndex - 1, + )! - mouseYPosition, + ), + ]); + } + const bestMatch = possibleMatches.sort((a, b) => a[1] - b[1])[0][0]; + return bestMatch; + } +} + +/** + * Widget for the transfer function. Creates the UI elements required for the transfer function. + */ +class TransferFunctionWidget extends Tab { + private transferFunctionPanel = this.registerDisposer( + new TransferFunctionPanel(this), + ); + + window = createWindowBoundInputs(this.dataType, this.trackable); + constructor( + visibility: WatchableVisibilityPriority, + public display: DisplayContext, + public dataType: DataType, + public trackable: WatchableValueInterface, + ) { + super(visibility); + const { element } = this; + element.classList.add("neuroglancer-transfer-function-widget"); + element.appendChild(this.transferFunctionPanel.element); + + // Range bounds element + element.appendChild(this.window.container); + this.window.container.dispatchEvent(new Event("change")); + + // Color picker element + const colorPickerDiv = document.createElement("div"); + colorPickerDiv.classList.add("neuroglancer-transfer-function-color-picker"); + const colorPicker = this.registerDisposer( + new ColorWidget( + makeCachedDerivedWatchableValue( + (x: TransferFunctionParameters) => x.defaultColor, + [trackable], + ), + () => vec3.fromValues(1, 1, 1), + ), + ); + colorPicker.element.title = "Transfer Function Color Picker"; + colorPicker.element.id = "neuroglancer-tf-color-widget"; + colorPicker.element.addEventListener("change", () => { + trackable.value = { + ...this.trackable.value, + defaultColor: colorPicker.model.value, + }; + }); + colorPicker.element.addEventListener("input", () => { + trackable.value = { + ...this.trackable.value, + defaultColor: colorPicker.model.value, + }; + }); + colorPickerDiv.appendChild(colorPicker.element); + + element.appendChild(colorPickerDiv); + this.updateControlPointsAndDraw(); + this.registerDisposer( + this.trackable.changed.add(() => { + this.updateControlPointsAndDraw(); + }), + ); + updateInputBoundValue( + this.window.inputs[0], + this.trackable.value.window[0], + ); + updateInputBoundValue( + this.window.inputs[1], + this.trackable.value.window[1], + ); + } + updateView() { + this.transferFunctionPanel.scheduleRedraw(); + } + updateControlPointsAndDraw() { + this.transferFunctionPanel.update(); + this.updateView(); + } +} + +/** + * Create a shader function for the transfer function to grab the nearest lookup table value + */ +export function defineTransferFunctionShader( + builder: ShaderBuilder, + name: string, + dataType: DataType, + channel: number[], +) { + builder.addUniform("highp float", `uTransferFunctionEnd_${name}`); + builder.addTextureSampler( + "sampler2D", + `uTransferFunctionSampler_${name}`, + `TransferFunction.${name}`, + ); + const invlerpShaderCode = defineInvlerpShaderFunction( + builder, + name, + dataType, + true, + ) as ShaderCodePart[]; + const shaderType = getShaderType(dataType); + // Use ${name}_ to avoid name collisions with other shader functions in the case of FLOAT32 dtype + let code = ` +vec4 ${name}_(float inputValue) { + int index = clamp(int(round(inputValue * uTransferFunctionEnd_${name})), 0, int(uTransferFunctionEnd_${name})); + return texelFetch(uTransferFunctionSampler_${name}, ivec2(index, 0), 0); +} +vec4 ${name}(${shaderType} inputValue) { + float v = computeInvlerp(inputValue, uLerpParams_${name}); + defaultMaxProjectionIntensity = v; + return v < 0.0 ? vec4(0.0, 0.0, 0.0, 0.0) : ${name}_(clamp(v, 0.0, 1.0)); +} +vec4 ${name}() { + return ${name}(getDataValue(${channel.join(",")})); +} +`; + if (dataType !== DataType.UINT64 && dataType !== DataType.FLOAT32) { + const scalarType = DATA_TYPE_SIGNED[dataType] ? "int" : "uint"; + code += ` +vec4 ${name}(${scalarType} inputValue) { + return ${name}(${shaderType}(inputValue)); +} +`; + } + return [ + invlerpShaderCode[0], + invlerpShaderCode[1], + invlerpShaderCode[2], + code, + ]; +} + +/** + * Create a lookup table and bind that lookup table to a shader via uniforms + */ +export function enableTransferFunctionShader( + shader: ShaderProgram, + name: string, + dataType: DataType, + sortedControlPoints: SortedControlPoints, + lookupTableSize: number = defaultTransferFunctionSizes[dataType], +) { + const { gl } = shader; + const texture = shader.transferFunctionTextures.get( + `TransferFunction.${name}`, + ); + // Create a lookup table texture if it does not exist + if (texture === undefined) { + shader.transferFunctionTextures.set( + `TransferFunction.${name}`, + new ControlPointTexture(gl), + ); + } + const textureSize = shader.bindAndUpdateTransferFunctionTexture( + `TransferFunction.${name}`, + sortedControlPoints, + dataType, + lookupTableSize, + ); + if (textureSize === undefined) { + throw new Error("Failed to create transfer function texture"); + } + + // Bind the length of the lookup table to the shader as a uniform + gl.uniform1f(shader.uniform(`uTransferFunctionEnd_${name}`), textureSize - 1); + + // Use the lerp shader function to grab an index into the lookup table + const interval = sortedControlPoints.range; + enableLerpShaderFunction(shader, name, dataType, interval); +} + +/** + * Behaviour of the transfer function widget in the tool popup window + */ +export function activateTransferFunctionTool( + activation: ToolActivation, + control: TransferFunctionWidget, +) { + activation.bindInputEventMap(inputEventMap); + control; +} + +/** + * Create a layer control factory for the transfer function widget + */ +export function transferFunctionLayerControl( + getter: (layer: LayerType) => { + watchableValue: WatchableValueInterface; + defaultChannel: number[]; + channelCoordinateSpaceCombiner: CoordinateSpaceCombiner | undefined; + dataType: DataType; + }, +): LayerControlFactory { + return { + makeControl: (layer, context, options) => { + const { + watchableValue, + channelCoordinateSpaceCombiner, + defaultChannel, + dataType, + } = getter(layer); + + // Setup the ability to change the channel through the UI here + // but only if the data has multiple channels + if ( + channelCoordinateSpaceCombiner !== undefined && + defaultChannel.length !== 0 + ) { + const position = context.registerDisposer( + new Position(channelCoordinateSpaceCombiner.combined), + ); + const positiionWidget = context.registerDisposer( + new PositionWidget(position, channelCoordinateSpaceCombiner, { + copyButton: false, + }), + ); + context.registerDisposer( + position.changed.add(() => { + const value = position.value; + const newChannel = Array.from(value, (x) => Math.floor(x)); + const oldParams = watchableValue.value; + if (!arraysEqual(oldParams.channel, newChannel)) { + watchableValue.value = { + ...watchableValue.value, + channel: newChannel, + }; + } + }), + ); + const updatePosition = () => { + const value = position.value; + const params = watchableValue.value; + if (!arraysEqual(params.channel, value)) { + value.set(params.channel); + position.changed.dispatch(); + } + }; + updatePosition(); + context.registerDisposer(watchableValue.changed.add(updatePosition)); + options.labelContainer.appendChild(positiionWidget.element); + } + const control = context.registerDisposer( + new TransferFunctionWidget( + options.visibility, + options.display, + dataType, + watchableValue, + ), + ); + return { control, controlElement: control.element }; + }, + activateTool: (activation, control) => { + activateTransferFunctionTool(activation, control); + }, + }; +} From e7a19f5f6dc0308d3646d0a74d33ebc6d8b03f35 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 29 May 2024 19:34:52 +0200 Subject: [PATCH 03/45] fix: update transfer function points in JSON in all cases (#594) --- src/webgl/shader_ui_controls.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webgl/shader_ui_controls.ts b/src/webgl/shader_ui_controls.ts index df3e19034..b046fb3b1 100644 --- a/src/webgl/shader_ui_controls.ts +++ b/src/webgl/shader_ui_controls.ts @@ -1155,7 +1155,7 @@ export class TrackableTransferFunctionParameters extends TrackableValue - parseTransferFunctionParameters(obj, dataType, defaultValue), + parseTransferFunctionParameters(obj, dataType, defaultValueCopy), ); } From 453cc01fb746dbe2667d720e8e7e2dae0dfbb937 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 29 May 2024 15:13:36 -0700 Subject: [PATCH 04/45] fix(sliceview): fix picking when determinant of transform is negative Previously, for purpose of "picking" the data value at the mouse position, visible layers were incorrectly ordered by the raw determinant of the "chunk to layer coordinate" transform matrix, in order to attempt to select the finest resolution source that is visible. However, this did not take into account that the determinant may be negative depending on how dimensions are ordered, leading to incorrectly choosing the coarsest rather than finest resolution source. Fixes https://github.com/google/neuroglancer/issues/539. --- src/sliceview/renderlayer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sliceview/renderlayer.ts b/src/sliceview/renderlayer.ts index e9e7046bf..ad52ba48c 100644 --- a/src/sliceview/renderlayer.ts +++ b/src/sliceview/renderlayer.ts @@ -163,8 +163,8 @@ export abstract class SliceViewRenderLayer< // Sort by volume scaling factor. visibleSourcesList_.sort((a, b) => { return ( - a.chunkTransform.chunkToLayerTransformDet - - b.chunkTransform.chunkToLayerTransformDet + Math.abs(a.chunkTransform.chunkToLayerTransformDet) - + Math.abs(b.chunkTransform.chunkToLayerTransformDet) ); }); } From 22b49f956ab077831b0052fd57164725f2cc34d8 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Tue, 11 Jun 2024 14:12:17 -0400 Subject: [PATCH 05/45] feat: add version.json to add another way to identify deployed version (#597) --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f211774c..c33f5d19e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,6 +40,7 @@ jobs: run: | build_info="{'tag':'$(git describe --always --tags)', 'url':'https://github.com/google/neuroglancer/commit/$(git rev-parse HEAD)', 'timestamp':'$(date)'}" npm run build -- --no-typecheck --no-lint --define NEUROGLANCER_BUILD_INFO="${build_info}" + echo $build_info > ./dist/client/version.json shell: bash - name: Build Python client bundles run: npm run build-python -- --no-typecheck --no-lint From 5b304a1e96de19ddc5081d611b3968f5fad6c75a Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Tue, 11 Jun 2024 14:13:03 -0400 Subject: [PATCH 06/45] fix(ui): increase z-index for layer data source dropdowns, which were appearing below pinned panels (#595) --- src/ui/layer_data_sources_tab.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/layer_data_sources_tab.css b/src/ui/layer_data_sources_tab.css index 55a466827..0fa84d0b2 100644 --- a/src/ui/layer_data_sources_tab.css +++ b/src/ui/layer_data_sources_tab.css @@ -25,6 +25,7 @@ flex-direction: column; flex: 1; height: 0px; + z-index: 1; } .neuroglancer-layer-data-source-url-input input.autocomplete-input { From f1fd3b6556d6465f522389f3d9d57e87af3d2d1a Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Tue, 11 Jun 2024 14:13:57 -0400 Subject: [PATCH 07/45] chore: output declaration files for neuroglancer packages (#576) * chore: output declaration files for neuroglancer when installed with NPM Add --declaration flag to build-package.ts to optionally output typescript declaration files Enable flag for npm prepare script * fix: improve declarations by using tsconfig.json * always generate declaration files when building packages * remove unnecessary use of ts.createCompilerHost --- build_tools/build-package.ts | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts index 1407c7cbc..32c80a00b 100644 --- a/build_tools/build-package.ts +++ b/build_tools/build-package.ts @@ -14,10 +14,24 @@ import fs from "node:fs/promises"; import path from "node:path"; import esbuild from "esbuild"; import { glob } from "glob"; +import ts from "typescript"; import yargs from "yargs"; const rootDir = path.resolve(import.meta.dirname, ".."); +function buildDeclarationFiles( + fileNames: string[], + options: ts.CompilerOptions, +): void { + options = { + ...options, + declaration: true, + emitDeclarationOnly: true, + }; + const program = ts.createProgram(fileNames, options); + program.emit(); +} + async function buildPackage(options: { inplace?: boolean }) { const { inplace = false } = options; @@ -45,13 +59,32 @@ async function buildPackage(options: { inplace?: boolean }) { nodir: true, }); + const entryPoints = typescriptSources.map((name) => + path.resolve(srcDir, name), + ); + await esbuild.build({ - entryPoints: typescriptSources.map((name) => path.resolve(srcDir, name)), + entryPoints, outbase: srcDir, bundle: false, outdir: libDir, }); + let compilerOptionsFromConfigFile: ts.CompilerOptions = {}; + const configFileName = ts.findConfigFile("../", ts.sys.fileExists); + if (configFileName) { + const configFile = ts.readConfigFile(configFileName, ts.sys.readFile); + compilerOptionsFromConfigFile = ts.parseJsonConfigFileContent( + configFile.config, + ts.sys, + "./", + ).options; + } + buildDeclarationFiles(entryPoints, { + ...compilerOptionsFromConfigFile, + outDir: libDir, + }); + const otherSources = await glob(["**/*.{css,js,html,wasm}"], { cwd: srcDir, nodir: true, From 6a39a637b68f0cd509a7368c4aee59ef2ef33966 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Tue, 11 Jun 2024 20:49:35 +0200 Subject: [PATCH 08/45] fix: with a float window the control point sorting does not error (#596) --- src/widget/transfer_function.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 9f2fffed3..1d47f3581 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -262,9 +262,16 @@ export class SortedControlPoints { if (this.controlPoints.length == 0) { this.range = defaultDataTypeRange[this.dataType]; } else if (this.controlPoints.length === 1) { + let rangeEnd = defaultDataTypeRange[this.dataType][1]; + if ( + this.dataType === DataType.FLOAT32 && + rangeEnd <= this.controlPoints[0].inputValue + ) { + rangeEnd = (this.controlPoints[0].inputValue as number) + 1; + } this.range = [ this.controlPoints[0].inputValue, - defaultDataTypeRange[this.dataType][1], + rangeEnd, ] as DataTypeInterval; } else { this.range = [ From 861995067b18936318e0f7d695fa9e3b706e788f Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Tue, 11 Jun 2024 14:51:22 -0400 Subject: [PATCH 09/45] fix(datasource/graphene) merge and multicut tool fixes (#565) * fixed graphene merge tool clear all button was not deleting the line segments * fixed bug when clearing merge tool when there is an active merge segment * removed delay between removing old root ids and adding new root ids for a merge * fix(datasource/graphene) multicut tool was not updating 2d visualization for previously unloaded chunks (as new equivalences were loaded) * temp fix - unlocking merge submission when loading state (usually reloading) --- src/datasource/graphene/frontend.ts | 35 +++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 211007803..04a1281b6 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -15,6 +15,7 @@ */ import "#src/datasource/graphene/graphene.css"; +import { debounce } from "lodash-es"; import { AnnotationDisplayState, AnnotationLayerState, @@ -935,7 +936,7 @@ class MergeState extends RefCounted implements Trackable { ERROR_JSON_KEY, verifyString, ); - const locked = verifyObjectProperty(obj, LOCKED_JSON_KEY, verifyBoolean); + const locked = false; // TODO(chrisj) verifyObjectProperty(obj, LOCKED_JSON_KEY, verifyBoolean); const sink = restoreSegmentSelection(obj[SINK_JSON_KEY]); const source = restoreSegmentSelection(obj[SOURCE_JSON_KEY]); return { @@ -1531,11 +1532,11 @@ class GraphConnection extends SegmentationGraphSourceConnection { segmentsToAdd.push(submission.mergedRoot); } } + const latestRoots = + await this.graph.graphServer.filterLatestRoots(segmentsToAdd); const segmentsState = this.layer.displayState.segmentationGroupState.value; const { visibleSegments, selectedSegments } = segmentsState; selectedSegments.delete(segmentsToRemove); - const latestRoots = - await this.graph.graphServer.filterLatestRoots(segmentsToAdd); this.meshAddNewSegments(latestRoots); selectedSegments.add(latestRoots); visibleSegments.add(latestRoots); @@ -2196,7 +2197,6 @@ class MulticutSegmentsTool extends LayerTool { displayState.baseSegmentHighlighting.value = priorBaseSegmentHighlighting; displayState.highlightColor.value = priorHighlightColor; }); - const resetMulticutDisplay = () => { resetTemporaryVisibleSegmentsState(segmentationGroupState); displayState.useTempSegmentStatedColors2d.value = false; @@ -2204,31 +2204,25 @@ class MulticutSegmentsTool extends LayerTool { displayState.tempSegmentDefaultColor2d.value = undefined; displayState.highlightColor.value = undefined; }; - const updateMulticutDisplay = () => { resetMulticutDisplay(); activeGroupIndicator.classList.toggle( "blueGroup", multicutState.blueGroup.value, ); - const focusSegment = multicutState.focusSegment.value; if (focusSegment === undefined) return; - displayState.baseSegmentHighlighting.value = true; displayState.highlightColor.value = multicutState.blueGroup.value ? BLUE_COLOR_HIGHTLIGHT : RED_COLOR_HIGHLIGHT; segmentsState.useTemporaryVisibleSegments.value = true; segmentsState.useTemporarySegmentEquivalences.value = true; - - // add to focus segments and temporary sets + // add focus segment and red/blue segments segmentsState.temporaryVisibleSegments.add(focusSegment); - for (const segment of multicutState.segments) { segmentsState.temporaryVisibleSegments.add(segment); } - // all other segments are added to the focus segment equivalences for (const equivalence of segmentsState.segmentEquivalences.setElements( focusSegment, @@ -2240,14 +2234,12 @@ class MulticutSegmentsTool extends LayerTool { ); } } - // set colors displayState.tempSegmentDefaultColor2d.value = MULTICUT_OFF_COLOR; displayState.tempSegmentStatedColors2d.value.set( focusSegment, TRANSPARENT_COLOR_PACKED, ); - for (const segment of multicutState.redSegments) { displayState.tempSegmentStatedColors2d.value.set( segment, @@ -2263,18 +2255,19 @@ class MulticutSegmentsTool extends LayerTool { displayState.useTempSegmentStatedColors2d.value = true; }; - updateMulticutDisplay(); - activation.registerDisposer( multicutState.changed.add(updateMulticutDisplay), ); - + activation.registerDisposer( + segmentationGroupState.segmentEquivalences.changed.add( + debounce(() => updateMulticutDisplay(), 0), + ), + ); activation.bindAction("swap-group", (event) => { event.stopPropagation(); multicutState.swapGroup(); }); - activation.bindAction("set-anchor", (event) => { event.stopPropagation(); const currentSegmentSelection = maybeGetSelection( @@ -2308,7 +2301,6 @@ class MulticutSegmentsTool extends LayerTool { } multicutState.activeGroup.add(currentSegmentSelection); }); - activation.bindAction("submit", (event) => { event.stopPropagation(); submitAction(); @@ -2488,7 +2480,12 @@ class MergeSegmentsTool extends LayerTool { text: "Clear", title: "Clear pending merges", onClick: () => { - merges.value = []; + lineTool.deactivate(); + for (const merge of merges.value) { + if (!merge.locked) { + graphConnection.deleteMergeSubmission(merge); + } + } }, }), ); From aef3d8bb16dcc7e2f8f40dac14a3566f5a3c0d57 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 12 Jun 2024 01:13:09 +0200 Subject: [PATCH 10/45] Feature - CDF in invlerp if only 3D view shown of image layer (#592) * refactor: move histogram shader code to cdf.ts * Revert "refactor: move histogram shader code to cdf.ts" This reverts commit a79e6bee21267cda339e307cbc43342e749cd293. * feat: grab global histogram specs from VR layer * temp: clear all histogram buffers as demo * feat: use VR layer visibility to also control hist showing * feat: only do VR hist drawing if no slice views * temp: shader for 3d invlerp * temp: more progress * temp: minimal shader to debug with * revert: remove in vertex * temp: compiling vertex shader for data access * temp: simple buffer output hist * fix: volume chunks work ok * fix: working hist for one chunk broken rendering though * fix: drawing works but very slow. Multi-pass probably better but then that's another pass * fix: working histogram 3d * fix: histogram data display of off invlerp range * feat: work towards multi-channel multi-invlerp support * fix: VR tool from Python * fix: VR sample works for multi-invlerp * fix: VR max projection works with data sampling * feat: add ability to only activate chunk textures * fix: more error checking in VR layer for histograms * chore: add comment * feat: detect camera move in perspective panel * refactor: rename code snippets in chunk * refactor: rename variable * refactor: clarify volume rendering code with histograms * fix: change histogram debug default to false * fix: correct fragment shader for regular chunk render * chore: add comment * feat: allow render context to know camera move * debug: add frame rate monitor to help compare performance * debug: track time for VR render * feat: faster histogram rendering by avoiding shader and buffer flippign * feat: don't render 3d histogram if camera movement * refactor: clarify chunk info storage for histograms * feat: variable samples for each histogram based on size and chunk amount * refactor: clean up for review * refactor: improve vertex shader tabbing * fix: re-enable depth test on restore buffers --- src/perspective_view/panel.ts | 25 ++ src/perspective_view/render_layer.ts | 15 + src/rendered_data_panel.ts | 3 + src/sliceview/uncompressed_chunk_format.ts | 34 +- src/sliceview/volume/frontend.ts | 6 +- src/volume_rendering/volume_render_layer.ts | 357 +++++++++++++++++++- 6 files changed, 423 insertions(+), 17 deletions(-) diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index a38bd43e2..ae852fcb3 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -81,6 +81,8 @@ import { MultipleScaleBarTextures } from "#src/widget/scale_bar.js"; import type { RPC } from "#src/worker_rpc.js"; import { SharedObject } from "#src/worker_rpc.js"; +const REDRAW_DELAY_AFTER_CAMERA_MOVE = 300; + export interface PerspectiveViewerState extends RenderedDataViewerState { wireFrame: WatchableValueInterface; orthographicProjection: TrackableBoolean; @@ -251,6 +253,7 @@ export class PerspectivePanel extends RenderedDataPanel { protected visibleLayerTracker: Owned< VisibleRenderLayerTracker >; + private redrawAfterMoveTimeOutId: number = -1; get rpc() { return this.sharedObject.rpc!; @@ -261,6 +264,9 @@ export class PerspectivePanel extends RenderedDataPanel { get displayDimensionRenderInfo() { return this.navigationState.displayDimensionRenderInfo; } + get isCameraMoving() { + return this.redrawAfterMoveTimeOutId !== -1; + } /** * If boolean value is true, sliceView is shown unconditionally, regardless of the value of @@ -417,6 +423,22 @@ export class PerspectivePanel extends RenderedDataPanel { this, ); + this.registerDisposer( + this.viewer.navigationState.changed.add(() => { + // Don't mark camera moving on picking requests + if (this.isMovingToMousePosition) { + return; + } + if (this.redrawAfterMoveTimeOutId !== -1) { + window.clearTimeout(this.redrawAfterMoveTimeOutId); + } + this.redrawAfterMoveTimeOutId = window.setTimeout(() => { + this.redrawAfterMoveTimeOutId = -1; + this.context.scheduleRedraw(); + }, REDRAW_DELAY_AFTER_CAMERA_MOVE); + }), + ); + registerActionListener( element, "rotate-via-mouse-drag", @@ -902,6 +924,8 @@ export class PerspectivePanel extends RenderedDataPanel { alreadyEmittedPickID: false, bindFramebuffer, frameNumber: this.context.frameNumber, + sliceViewsPresent: this.sliceViews.size > 0, + cameraMovementInProgress: this.isCameraMoving, }; mat4.copy( @@ -987,6 +1011,7 @@ export class PerspectivePanel extends RenderedDataPanel { }; gl.depthMask(true); bindMaxProjectionBuffer(); + renderContext.bindMaxProjectionBuffer = bindMaxProjectionBuffer; gl.clearColor(0.0, 0.0, 0.0, 0.0); gl.clearDepth(0.0); gl.clear( diff --git a/src/perspective_view/render_layer.ts b/src/perspective_view/render_layer.ts index c758e79d4..dd1ac960f 100644 --- a/src/perspective_view/render_layer.ts +++ b/src/perspective_view/render_layer.ts @@ -55,6 +55,21 @@ export interface PerspectiveViewRenderContext * Specifies the ID of the depth frame buffer texture to query during rendering. */ depthBufferTexture?: WebGLTexture | null; + + /** + * Specifies if there are any slice views + */ + sliceViewsPresent: boolean; + + /** + * Specifies if the camera is moving + */ + cameraMovementInProgress: boolean; + + /** + * Specifices how to bind the max projection buffer + */ + bindMaxProjectionBuffer?: () => void | undefined; } // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging diff --git a/src/rendered_data_panel.ts b/src/rendered_data_panel.ts index c62b6ec6f..9c2b95449 100644 --- a/src/rendered_data_panel.ts +++ b/src/rendered_data_panel.ts @@ -165,6 +165,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { pickRequestPending = false; private mouseStateForcer = () => this.blockOnPickRequest(); + protected isMovingToMousePosition: boolean = false; inputEventMap: EventActionMap; @@ -616,7 +617,9 @@ export abstract class RenderedDataPanel extends RenderedPanel { registerActionListener(element, "move-to-mouse-position", () => { const { mouseState } = this.viewer; if (mouseState.updateUnconditionally()) { + this.isMovingToMousePosition = true; this.navigationState.position.value = mouseState.position; + this.isMovingToMousePosition = false; } }); diff --git a/src/sliceview/uncompressed_chunk_format.ts b/src/sliceview/uncompressed_chunk_format.ts index 836bd2201..440e6c28d 100644 --- a/src/sliceview/uncompressed_chunk_format.ts +++ b/src/sliceview/uncompressed_chunk_format.ts @@ -139,7 +139,11 @@ export class ChunkFormat ); } - defineShader(builder: ShaderBuilder, numChannelDimensions: number) { + defineShader( + builder: ShaderBuilder, + numChannelDimensions: number, + inVertexShader: boolean = false, + ) { super.defineShader(builder, numChannelDimensions); const { textureDims } = this; const textureVecType = `ivec${this.textureDims}`; @@ -153,35 +157,39 @@ export class ChunkFormat "uVolumeChunkStrides", 4 + numChannelDimensions, ); - builder.addFragmentCode( - textureAccessHelper.getAccessor( - "readVolumeData", - "uVolumeChunkSampler", - this.dataType, - ), + const textureSamplerCode = textureAccessHelper.getAccessor( + "readVolumeData", + "uVolumeChunkSampler", + this.dataType, ); const shaderType = getShaderType(this.dataType); - let code = ` + let dataAccessCode = ` ${shaderType} getDataValueAt(highp ivec3 p`; for (let channelDim = 0; channelDim < numChannelDimensions; ++channelDim) { - code += `, highp int channelIndex${channelDim}`; + dataAccessCode += `, highp int channelIndex${channelDim}`; } - code += `) { + dataAccessCode += `) { highp ${textureVecType} offset = uVolumeChunkStrides[0] + p.x * uVolumeChunkStrides[1] + p.y * uVolumeChunkStrides[2] + p.z * uVolumeChunkStrides[3]; `; for (let channelDim = 0; channelDim < numChannelDimensions; ++channelDim) { - code += ` + dataAccessCode += ` offset += channelIndex${channelDim} * uVolumeChunkStrides[${4 + channelDim}]; `; } - code += ` + dataAccessCode += ` return readVolumeData(offset); } `; - builder.addFragmentCode(code); + if (inVertexShader) { + builder.addVertexCode(textureSamplerCode); + builder.addVertexCode(dataAccessCode); + } else { + builder.addFragmentCode(textureSamplerCode); + builder.addFragmentCode(dataAccessCode); + } } /** diff --git a/src/sliceview/volume/frontend.ts b/src/sliceview/volume/frontend.ts index d2427b905..dea825db8 100644 --- a/src/sliceview/volume/frontend.ts +++ b/src/sliceview/volume/frontend.ts @@ -52,7 +52,11 @@ export interface ChunkFormat { * * where value_type is `getShaderType(this.dataType)`. */ - defineShader: (builder: ShaderBuilder, numChannelDimensions: number) => void; + defineShader: ( + builder: ShaderBuilder, + numChannelDimensions: number, + inVertexShader?: boolean, + ) => void; /** * Called once per RenderLayer when starting to draw chunks, on the ChunkFormat of the first diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 4361b1f2b..6c7f40d45 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -53,6 +53,7 @@ import { makeCachedDerivedWatchableValue, registerNested, } from "#src/trackable_value.js"; +import type { RefCountedValue } from "#src/util/disposable.js"; import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; import { clampToInterval } from "#src/util/lerp.js"; import { getObjectId } from "#src/util/object_id.js"; @@ -72,6 +73,8 @@ import { drawBoxes, glsl_getBoxFaceVertexPosition, } from "#src/webgl/bounding_box.js"; +import type { Buffer } from "#src/webgl/buffer.js"; +import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { ParameterizedContextDependentShaderGetter, @@ -82,7 +85,16 @@ import { parameterizedContextDependentShaderGetter, shaderCodeWithLineDirective, } from "#src/webgl/dynamic_shader.js"; +import type { + HistogramChannelSpecification, + HistogramSpecifications, +} from "#src/webgl/empirical_cdf.js"; +import { + defineInvlerpShaderFunction, + enableLerpShaderFunction, +} from "#src/webgl/lerp.js"; import type { ShaderModule, ShaderProgram } from "#src/webgl/shader.js"; +import { getShaderType, glsl_simpleFloatHash } from "#src/webgl/shader_lib.js"; import type { ShaderControlsBuilderState, ShaderControlState, @@ -96,6 +108,13 @@ import { defineVertexId, VertexIdHelper } from "#src/webgl/vertex_id.js"; export const VOLUME_RENDERING_DEPTH_SAMPLES_DEFAULT_VALUE = 64; const VOLUME_RENDERING_DEPTH_SAMPLES_LOG_SCALE_ORIGIN = 1; const VOLUME_RENDERING_RESOLUTION_INDICATOR_BAR_HEIGHT = 10; +const HISTOGRAM_SAMPLES_PER_INSTANCE = 256; + +// Number of points to sample in computing the histogram. Increasing this increases the precision +// of the histogram but also slows down rendering. +// Here, we use 4096 samples per chunk to compute the histogram. +const NUM_HISTOGRAM_SAMPLES = 2 ** 14; +const DEBUG_HISTOGRAMS = false; const depthSamplerTextureUnit = Symbol("depthSamplerTextureUnit"); @@ -135,6 +154,15 @@ interface VolumeRenderingShaderParameters { mode: VolumeRenderingModes; } +interface StoredChunkInfoForHistogram { + chunk: VolumeChunk; + fixedPositionWithinChunk: Uint32Array; + chunkDisplayDimensionIndices: number[]; + channelToChunkDimensionIndices: readonly number[]; + chunkDataDisplaySize: vec3; + chunkFormat: ChunkFormat; +} + const tempMat4 = mat4.create(); const tempVisibleVolumetricClippingPlanes = new Float32Array(24); @@ -171,6 +199,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { mode: TrackableVolumeRenderingModeValue; backend: ChunkRenderLayerFrontend; private vertexIdHelper: VertexIdHelper; + private dataHistogramSpecifications: HistogramSpecifications; private shaderGetter: ParameterizedContextDependentShaderGetter< { emitter: ShaderModule; chunkFormat: ChunkFormat; wireFrame: boolean }, @@ -178,6 +207,12 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { VolumeRenderingShaderParameters >; + private histogramShaderGetter: ParameterizedContextDependentShaderGetter< + { chunkFormat: ChunkFormat }, + ShaderControlsBuilderState, + VolumeRenderingShaderParameters + >; + get gl() { return this.multiscaleSource.chunkManager.gl; } @@ -190,6 +225,12 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { return true; } + getDataHistogramCount() { + return this.dataHistogramSpecifications.visibleHistograms; + } + + private histogramIndexBuffer: RefCountedValue; + constructor(options: VolumeRenderingRenderLayerOptions) { super(); this.gain = options.gain; @@ -201,16 +242,37 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { this.depthSamplesTarget = options.depthSamplesTarget; this.chunkResolutionHistogram = options.chunkResolutionHistogram; this.mode = options.mode; + this.dataHistogramSpecifications = + this.shaderControlState.histogramSpecifications; + this.histogramIndexBuffer = this.registerDisposer( + getMemoizedBuffer( + this.gl, + WebGL2RenderingContext.ARRAY_BUFFER, + () => new Uint8Array(HISTOGRAM_SAMPLES_PER_INSTANCE), + ), + ); this.registerDisposer( this.chunkResolutionHistogram.visibility.add(this.visibility), ); + this.registerDisposer( + this.dataHistogramSpecifications.producerVisibility.add(this.visibility), + ); const extraParameters = this.registerDisposer( makeCachedDerivedWatchableValue( - (space: CoordinateSpace, mode: VolumeRenderingModes) => ({ + ( + space: CoordinateSpace, + mode: VolumeRenderingModes, + dataHistogramChannelSpecifications: HistogramChannelSpecification[], + ) => ({ numChannelDimensions: space.rank, mode, + dataHistogramChannelSpecifications, }), - [this.channelCoordinateSpace, this.mode], + [ + this.channelCoordinateSpace, + this.mode, + this.dataHistogramSpecifications.channels, + ], ), ); this.shaderGetter = parameterizedContextDependentShaderGetter( @@ -446,6 +508,119 @@ void main() { }, }, ); + this.histogramShaderGetter = parameterizedContextDependentShaderGetter( + this, + this.gl, + { + memoizeKey: "VolumeRenderingRenderLayerHistogram", + parameters: options.shaderControlState.builderState, + getContextKey: ({ chunkFormat }) => `${chunkFormat.shaderKey}`, + shaderError: options.shaderError, + extraParameters: extraParameters, + defineShader: ( + builder, + { chunkFormat }, + shaderBuilderState, + shaderParametersState, + ) => { + shaderBuilderState; + builder.addOutputBuffer("vec4", "outputValue", null); + builder.addUniform("highp vec3", "uChunkDataSize"); + builder.addUniform("highp int", "uHistogramIndex"); + builder.addAttribute("float", "aInput1"); + builder.addVertexCode(` +vec3 chunkSamplePosition; + `); + const numChannelDimensions = + shaderParametersState.numChannelDimensions; + chunkFormat.defineShader( + builder, + numChannelDimensions, + true /*inVertexShader*/, + ); + const { dataType } = chunkFormat; + let dataAccessChannelParams = ""; + let dataAccessChannelArgs = ""; + if (numChannelDimensions === 0) { + dataAccessChannelParams += "highp int ignoredChannelIndex"; + } else { + for ( + let channelDim = 0; + channelDim < numChannelDimensions; + ++channelDim + ) { + if (channelDim !== 0) dataAccessChannelParams += ", "; + dataAccessChannelParams += `highp int channelIndex${channelDim}`; + dataAccessChannelArgs += `, channelIndex${channelDim}`; + } + } + const dataAccessCode = ` +${getShaderType(dataType)} getDataValue(${dataAccessChannelParams}) { + highp ivec3 p = ivec3(max(vec3(0.0, 0.0, 0.0), min(floor(chunkSamplePosition), uChunkDataSize - 1.0))); + return getDataValueAt(p${dataAccessChannelArgs}); +}`; + builder.addVertexCode(dataAccessCode); + if (numChannelDimensions <= 1) { + builder.addVertexCode(` +${getShaderType(dataType)} getDataValue() { return getDataValue(0); } +`); + } + const dataHistogramChannelSpecifications = + shaderParametersState.dataHistogramChannelSpecifications; + const numHistograms = dataHistogramChannelSpecifications.length; + let histogramFetchCode = ` + float x; + switch (uHistogramIndex) {`; + for (let i = 0; i < numHistograms; ++i) { + const { channel } = dataHistogramChannelSpecifications[i]; + const getDataValueExpr = `getDataValue(${channel.join(",")})`; + const invlerpName = `invlerpForHistogram${i}`; + builder.addVertexCode( + defineInvlerpShaderFunction( + builder, + invlerpName, + dataType, + false /*clamp*/, + ), + ); + builder.addVertexCode(` +float getHistogramValue${i}() { + return invlerpForHistogram${i}(${getDataValueExpr}); +} +`); + histogramFetchCode += ` + case ${i}: + x = getHistogramValue${i}(); + break;`; + } + histogramFetchCode += ` + } +`; + builder.addVertexCode(glsl_simpleFloatHash); + builder.setVertexMain(` + vec3 rand3val = vec3( + simpleFloatHash(vec2(aInput1 + float(gl_VertexID), float(gl_InstanceID))), + simpleFloatHash(vec2(aInput1 + float(gl_VertexID) + 10.0, 5.0 + float(gl_InstanceID))), + simpleFloatHash(vec2(aInput1 + float(gl_VertexID) + 20.0, 15.0 + float(gl_InstanceID)))); + chunkSamplePosition = rand3val * (uChunkDataSize - 1.0); +${histogramFetchCode} + if (x == 0.0) { + gl_Position = vec4(2.0, 2.0, 2.0, 1.0); + } + else { + if (x < 0.0) x = 0.0; + else if (x > 1.0) x = 1.0; + else x = (1.0 + x * 253.0) / 255.0; + gl_Position = vec4(2.0 * (x * 255.0 + 0.5) / 256.0 - 1.0, 0.0, 0.0, 1.0); + } + gl_PointSize = 1.0;`); + builder.setFragmentMain(` +outputValue = vec4(1.0, 1.0, 1.0, 1.0); + `); + }, + }, + ); + this.vertexIdHelper = this.registerDisposer(VertexIdHelper.get(this.gl)); this.registerDisposer( @@ -568,6 +743,22 @@ void main() { this.chunkManager.chunkQueueManager.frameNumberCounter.frameNumber, ); + const restoreDrawingBuffers = () => { + if (isProjectionMode(this.mode.value)) { + gl.disable(WebGL2RenderingContext.BLEND); + if (renderContext.bindMaxProjectionBuffer !== undefined) { + renderContext.bindMaxProjectionBuffer(); + } else { + throw new Error( + "bindMaxProjectionBuffer is undefined in VolumeRenderingRenderLayer", + ); + } + } else { + renderContext.bindFramebuffer(); + } + gl.enable(WebGL2RenderingContext.DEPTH_TEST); + }; + const endShader = () => { if (shader === null) return; shader.unbindTransferFunctionTextures(); @@ -623,9 +814,16 @@ void main() { const chunkRank = this.multiscaleSource.rank; const chunkPosition = vec3.create(); + const needToDrawHistogram = + this.getDataHistogramCount() > 0 && + !renderContext.wireFrame && + !renderContext.sliceViewsPresent && + !renderContext.cameraMovementInProgress; + gl.enable(WebGL2RenderingContext.CULL_FACE); gl.cullFace(WebGL2RenderingContext.FRONT); + const chunkInfoForHistogram: StoredChunkInfoForHistogram[] = []; const pickId = isProjectionMode(this.mode.value) ? renderContext.pickIDs.register(this) : 0; @@ -803,11 +1001,22 @@ void main() { channelToChunkDimensionIndices, newSource, ); + if (needToDrawHistogram) { + chunkInfoForHistogram.push({ + chunk, + fixedPositionWithinChunk, + chunkDisplayDimensionIndices, + channelToChunkDimensionIndices, + chunkDataDisplaySize, + chunkFormat: prevChunkFormat, + }); + } } - newSource = false; gl.uniform3fv(shader.uniform("uTranslation"), chunkPosition); gl.uniform1ui(shader.uniform("uPickId"), pickId); drawBoxes(gl, 1, 1); + + newSource = false; ++presentCount; } else { ++notPresentCount; @@ -817,6 +1026,148 @@ void main() { gl.disable(WebGL2RenderingContext.CULL_FACE); endShader(); this.vertexIdHelper.disable(); + + if (needToDrawHistogram) { + let histogramShader: ShaderProgram | null = null; + let histogramShaderResult: ParameterizedShaderGetterResult< + ShaderControlsBuilderState, + VolumeRenderingShaderParameters + >; + const endHistogramShader = () => { + if (histogramShader === null) return; + histogramShader.unbindTransferFunctionTextures(); + if (prevChunkFormat !== null) { + prevChunkFormat!.endDrawing(gl, histogramShader); + } + }; + const determineNumHistogramInstances = ( + chunkDataSize: vec3, + numHistograms: number, + ) => { + const maxSamplesInChunk = Math.ceil( + chunkDataSize.reduce((a, b) => a * b, 1) / 2.0, + ); + const totalDesiredSamplesInChunk = + NUM_HISTOGRAM_SAMPLES / numHistograms; + const desiredSamples = Math.min( + maxSamplesInChunk, + totalDesiredSamplesInChunk, + ); + + // round to nearest multiple of NUM_HISTOGRAM_SAMPLES_PER_INSTANCE + return Math.max( + Math.round(desiredSamples / HISTOGRAM_SAMPLES_PER_INSTANCE), + 1, + ); + }; + + prevChunkFormat = null; + const { dataType, dataHistogramSpecifications } = this; + const histogramFramebuffers = + dataHistogramSpecifications.getFramebuffers(gl); + const numHistograms = this.getDataHistogramCount(); + for (let i = 0; i < numHistograms; ++i) { + histogramFramebuffers[i].bind(256, 1); + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.clear(WebGL2RenderingContext.COLOR_BUFFER_BIT); + } + const bounds = this.dataHistogramSpecifications.bounds.value; + // Blending on to accumulate histograms. + gl.enable(WebGL2RenderingContext.BLEND); + gl.disable(WebGL2RenderingContext.DEPTH_TEST); + for (let j = 0; j < presentCount; ++j) { + newSource = true; + const chunkInfo = chunkInfoForHistogram[j]; + const chunkFormat = chunkInfo.chunkFormat; + if (chunkFormat !== prevChunkFormat) { + prevChunkFormat = chunkFormat; + endHistogramShader(); + histogramShaderResult = this.histogramShaderGetter({ + chunkFormat: chunkFormat!, + }); + histogramShader = histogramShaderResult.shader; + if (histogramShader !== null) { + if (chunkFormat !== null) { + chunkFormat.beginDrawing(gl, histogramShader); + chunkFormat.beginSource(gl, histogramShader); + } + histogramShader.bind(); + } else { + break; + } + } + if (histogramShader === null) break; + gl.uniform3fv( + histogramShader.uniform("uChunkDataSize"), + chunkInfo.chunkDataDisplaySize, + ); + if (prevChunkFormat != null) { + prevChunkFormat.bindChunk( + gl, + histogramShader, + chunkInfo.chunk, + chunkInfo.fixedPositionWithinChunk, + chunkInfo.chunkDisplayDimensionIndices, + chunkInfo.channelToChunkDimensionIndices, + newSource, + ); + } + this.histogramIndexBuffer.value.bindToVertexAttrib( + histogramShader.attribute("aInput1"), + 1, + WebGL2RenderingContext.UNSIGNED_BYTE, + /*normalized=*/ true, + ); + + // Draw each histogram + const numInstances = determineNumHistogramInstances( + chunkInfo.chunkDataDisplaySize, + presentCount, + ); + for (let i = 0; i < numHistograms; ++i) { + histogramFramebuffers[i].bind(256, 1); + enableLerpShaderFunction( + histogramShader, + `invlerpForHistogram${i}`, + dataType, + bounds[i], + ); + gl.uniform1i(histogramShader.uniform("uHistogramIndex"), i); + gl.drawArraysInstanced( + WebGL2RenderingContext.POINTS, + 0, + HISTOGRAM_SAMPLES_PER_INSTANCE, + numInstances, + ); + } + newSource = false; + } + + if (needToDrawHistogram && DEBUG_HISTOGRAMS) { + const histogramFrameBuffers = + this.dataHistogramSpecifications.getFramebuffers(gl); + for (let i = 0; i < numHistograms; ++i) { + histogramFrameBuffers[i].bind(256, 1); + const tempBuffer = new Float32Array(256 * 4); + gl.readPixels( + 0, + 0, + 256, + 1, + WebGL2RenderingContext.RGBA, + WebGL2RenderingContext.FLOAT, + tempBuffer, + ); + const tempBuffer2 = new Float32Array(256); + for (let j = 0; j < 256; ++j) { + tempBuffer2[j] = tempBuffer[j * 4]; + } + console.log("histogram%d", i, tempBuffer2.join(" ")); + } + } + endHistogramShader(); + restoreDrawingBuffers(); + } } isReady( From dabc3ca4eb2ec060c7fb20a914bc0b98fb54ffc7 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 13 Jun 2024 12:34:07 -0700 Subject: [PATCH 11/45] fix: fix intermittent stalling/failing of chunk priority updates This fixes the longstanding bug whereby, seemingly at random, new chunks would no longer load until layer visibility is toggled. The issue was due to order dependence in signal dispatching in response to changes to the DisplayDimensionRenderInfo. Previously, DisplayDimensionRenderInfo was synchronized between the main UI thread and the chunk worker thread in a fragile way: the transformed sources computed for a layer in the UI thread were implicitly associated with a particular `DisplayDimensionRenderInfo` value, but this value was not transmitted with the sources, and instead was relied on being synchronized independently. This commit instead ensures that the associated `DisplayDimensionRenderInfo` value is always sent along with the transformed sources, which avoids this order dependence. --- src/annotation/backend.ts | 27 ++++++++------------- src/navigation_state.ts | 13 ++++++++++ src/sliceview/backend.ts | 5 ++-- src/sliceview/base.ts | 21 ++++++++++------ src/sliceview/frontend.ts | 1 + src/volume_rendering/backend.ts | 18 +++++++++----- src/volume_rendering/volume_render_layer.ts | 1 + 7 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index 779678863..febc1812d 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -43,7 +43,7 @@ import { } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; -import { displayDimensionRenderInfosEqual } from "#src/navigation_state.js"; +import { validateDisplayDimensionRenderInfoProperty } from "#src/navigation_state.js"; import type { RenderedViewBackend, RenderLayerBackendAttachment, @@ -412,22 +412,15 @@ class AnnotationSpatiallyIndexedRenderLayerBackend extends withChunkManager( } const attachmentState = attachment.state! as AnnotationRenderLayerAttachmentState; - const { transformedSources, displayDimensionRenderInfo } = - attachmentState; - if (transformedSources.length === 0) continue; - const viewDisplayDimensionRenderInfo = - view.projectionParameters.value.displayDimensionRenderInfo; - if (displayDimensionRenderInfo !== viewDisplayDimensionRenderInfo) { - if ( - !displayDimensionRenderInfosEqual( - displayDimensionRenderInfo, - viewDisplayDimensionRenderInfo, - ) - ) { - continue; - } - attachmentState.displayDimensionRenderInfo = - viewDisplayDimensionRenderInfo; + const { transformedSources } = attachmentState; + if ( + transformedSources.length === 0 || + !validateDisplayDimensionRenderInfoProperty( + attachmentState, + view.projectionParameters.value.displayDimensionRenderInfo, + ) + ) { + continue; } const priorityTier = getPriorityTier(visibility); const basePriority = getBasePriority(visibility); diff --git a/src/navigation_state.ts b/src/navigation_state.ts index e129dd951..e66b785a8 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -1432,6 +1432,19 @@ export function displayDimensionRenderInfosEqual( ); } +export function validateDisplayDimensionRenderInfoProperty( + obj: { displayDimensionRenderInfo: DisplayDimensionRenderInfo }, + expected: DisplayDimensionRenderInfo, +): boolean { + const actual = obj.displayDimensionRenderInfo; + if (actual === expected) return true; + if (displayDimensionRenderInfosEqual(actual, expected)) { + obj.displayDimensionRenderInfo = expected; + return true; + } + return false; +} + export class WatchableDisplayDimensionRenderInfo extends RefCounted { changed = new NullarySignal(); private curRelativeDisplayScales: RelativeDisplayScales = diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index 5b301288b..f95e2062b 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -65,6 +65,7 @@ import { registerSharedObject, SharedObjectCounterpart, } from "#src/worker_rpc.js"; +import type { DisplayDimensionRenderInfo } from "src/navigation_state"; export const BASE_PRIORITY = -1e12; export const SCALE_PRIORITY_MULTIPLIER = 1e9; @@ -255,8 +256,8 @@ export class SliceViewBackend extends SliceViewIntermediateBase { SliceViewRenderLayerBackend, SliceViewChunkSourceBackend >[][], + displayDimensionRenderInfo: DisplayDimensionRenderInfo, ) { - const { displayDimensionRenderInfo } = this.projectionParameters.value; let layerInfo = this.visibleLayers.get(layer); if (layerInfo === undefined) { layerInfo = { @@ -334,7 +335,7 @@ registerRPC(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, function (x) { SliceViewChunkSourceBackend, SliceViewRenderLayerBackend >(this, x.sources, layer); - obj.addVisibleLayer(layer, sources); + obj.addVisibleLayer(layer, sources, x.displayDimensionRenderInfo); }); registerRPC(SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, function (x) { const obj = this.get(x.id); diff --git a/src/sliceview/base.ts b/src/sliceview/base.ts index e1e24ae88..c71b81524 100644 --- a/src/sliceview/base.ts +++ b/src/sliceview/base.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import { + validateDisplayDimensionRenderInfoProperty, + type DisplayDimensionRenderInfo, +} from "#src/navigation_state.js"; import { ProjectionParameters } from "#src/projection_parameters.js"; import { getChunkPositionFromCombinedGlobalLocalPositions } from "#src/render_coordinate_transform.js"; import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; @@ -289,8 +292,9 @@ function visibleSourcesInvalidated( ) { if ( oldValue.displayDimensionRenderInfo !== newValue.displayDimensionRenderInfo - ) + ) { return true; + } if (oldValue.pixelSize !== newValue.pixelSize) return true; const { viewMatrix: oldViewMatrix } = oldValue; const { viewMatrix: newViewMatrix } = newValue; @@ -347,14 +351,15 @@ export class SliceViewBase< this.projectionParameters.value.displayDimensionRenderInfo; const { visibleLayers } = this; - for (const [ - renderLayer, - { allSources, visibleSources, displayDimensionRenderInfo }, - ] of visibleLayers) { + for (const [renderLayer, visibleLayerSources] of visibleLayers) { + const { allSources, visibleSources } = visibleLayerSources; visibleSources.length = 0; if ( - displayDimensionRenderInfo !== curDisplayDimensionRenderInfo || - allSources.length === 0 + allSources.length === 0 || + !validateDisplayDimensionRenderInfoProperty( + visibleLayerSources, + curDisplayDimensionRenderInfo, + ) ) { continue; } diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index 7218c8b4b..dd20d2a6b 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -453,6 +453,7 @@ export class SliceView extends Base { rpcMessage.sources = serializeAllTransformedSources( layerInfo.allSources, ); + rpcMessage.displayDimensionRenderInfo = displayDimensionRenderInfo; this.flushBackendProjectionParameters(); rpc.invoke(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, rpcMessage); changed = true; diff --git a/src/volume_rendering/backend.ts b/src/volume_rendering/backend.ts index 83963430f..e58ba4777 100644 --- a/src/volume_rendering/backend.ts +++ b/src/volume_rendering/backend.ts @@ -16,7 +16,10 @@ import { withChunkManager } from "#src/chunk_manager/backend.js"; import { ChunkState } from "#src/chunk_manager/base.js"; -import type { DisplayDimensionRenderInfo } from "#src/navigation_state.js"; +import { + type DisplayDimensionRenderInfo, + validateDisplayDimensionRenderInfoProperty, +} from "#src/navigation_state.js"; import type { RenderedViewBackend, RenderLayerBackendAttachment, @@ -113,12 +116,16 @@ class VolumeRenderingRenderLayerBackend extends withChunkManager( if (visibility === Number.NEGATIVE_INFINITY) { continue; } - const { transformedSources, displayDimensionRenderInfo } = + const state = attachment.state as VolumeRenderingRenderLayerAttachmentState; + const { transformedSources } = state; + if ( transformedSources.length === 0 || - displayDimensionRenderInfo !== - view.projectionParameters.value.displayDimensionRenderInfo + !validateDisplayDimensionRenderInfoProperty( + state, + view.projectionParameters.value.displayDimensionRenderInfo, + ) ) { continue; } @@ -193,7 +200,6 @@ registerRPC(VOLUME_RENDERING_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, function (x) { VolumeChunkSource, VolumeRenderingRenderLayerBackend >(this, x.sources, layer); - attachment.state!.displayDimensionRenderInfo = - attachment.view.projectionParameters.value.displayDimensionRenderInfo; + attachment.state!.displayDimensionRenderInfo = x.displayDimensionRenderInfo; layer.chunkManager.scheduleUpdateChunkPriorities(); }); diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 6c7f40d45..a298b6c5a 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -694,6 +694,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); layer: this.backend.rpcId, view: attachment.view.rpcId, sources: serializeAllTransformedSources(transformedSources), + displayDimensionRenderInfo, }, ); this.redrawNeeded.dispatch(); From b0d32910b69020400514e7baaea8ad9904ceb4d2 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 20 Jun 2024 15:12:55 -0700 Subject: [PATCH 12/45] 2.40.0 --- examples/parcel/parcel-project-built/package-lock.json | 2 +- examples/parcel/parcel-project-source/package-lock.json | 3 +-- examples/vite/vite-project-built/package-lock.json | 2 +- examples/vite/vite-project-source/package-lock.json | 3 +-- examples/webpack/webpack-project-built/package-lock.json | 2 +- examples/webpack/webpack-project-source/package-lock.json | 3 +-- package-lock.json | 4 ++-- package.json | 2 +- 8 files changed, 9 insertions(+), 12 deletions(-) diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 222221599..9b17691ee 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -19,7 +19,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index 391b16715..c291bffa6 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -18,8 +18,7 @@ } }, "../../..": { - "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index 6041fb8b1..db9eb331b 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -17,7 +17,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 7ca661ddf..d4960f6b2 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -16,8 +16,7 @@ } }, "../../..": { - "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index c742aa826..9e16cdb7f 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -23,7 +23,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index c5ca7d5ec..e7d9c4f5e 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -23,8 +23,7 @@ } }, "../../..": { - "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/package-lock.json b/package-lock.json index 259af2be6..7e973dd57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "neuroglancer", - "version": "2.39.2", + "version": "2.40.0", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/package.json b/package.json index df22736d1..01b2d77ae 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "neuroglancer", "description": "Visualization tool for 3-D volumetric data.", "license": "Apache-2.0", - "version": "2.39.2", + "version": "2.40.0", "repository": { "type": "git", "url": "git+https://github.com/google/neuroglancer.git" From c9081c0d530a6b9edad182d799f4f87a8557404f Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 3 Jul 2024 21:47:34 +0200 Subject: [PATCH 13/45] Feature - adaptive downsampling of volume rendering based on framerate (#591) --- python/neuroglancer/viewer_state.py | 4 + src/data_panel_layout.ts | 2 + src/display_context.ts | 37 +++ src/layer_group_viewer.ts | 4 + src/layer_groups_layout.ts | 1 + src/perspective_view/panel.ts | 222 +++++++++++++--- src/perspective_view/render_layer.ts | 2 +- src/rendered_data_panel.ts | 17 +- src/sliceview/panel.ts | 2 + src/ui/viewer_settings.ts | 1 + src/util/framerate.spec.ts | 128 ++++++++++ src/util/framerate.ts | 264 ++++++++++++++++++++ src/viewer.ts | 2 + src/volume_rendering/volume_render_layer.ts | 2 +- 14 files changed, 652 insertions(+), 36 deletions(-) create mode 100644 src/util/framerate.spec.ts create mode 100644 src/util/framerate.ts diff --git a/python/neuroglancer/viewer_state.py b/python/neuroglancer/viewer_state.py index a2b14edba..3573cdf70 100644 --- a/python/neuroglancer/viewer_state.py +++ b/python/neuroglancer/viewer_state.py @@ -1668,6 +1668,10 @@ class ViewerState(JsonObjectWrapper): show_axis_lines = showAxisLines = wrapped_property( "showAxisLines", optional(bool, True) ) + wire_frame = wireFrame = wrapped_property("wireFrame", optional(bool, False)) + enable_adaptive_downsampling = enableAdaptiveDownsampling = wrapped_property( + "enableAdaptiveDownsampling", optional(bool, True) + ) show_scale_bar = showScaleBar = wrapped_property( "showScaleBar", optional(bool, True) ) diff --git a/src/data_panel_layout.ts b/src/data_panel_layout.ts index e35846805..7154a5785 100644 --- a/src/data_panel_layout.ts +++ b/src/data_panel_layout.ts @@ -92,6 +92,7 @@ export interface ViewerUIState showPerspectiveSliceViews: TrackableBoolean; showAxisLines: TrackableBoolean; wireFrame: TrackableBoolean; + enableAdaptiveDownsampling: TrackableBoolean; showScaleBar: TrackableBoolean; scaleBarOptions: TrackableValue; visibleLayerRoles: WatchableSet; @@ -174,6 +175,7 @@ export function getCommonViewerState(viewer: ViewerUIState) { layerManager: viewer.layerManager, showAxisLines: viewer.showAxisLines, wireFrame: viewer.wireFrame, + enableAdaptiveDownsampling: viewer.enableAdaptiveDownsampling, visibleLayerRoles: viewer.visibleLayerRoles, selectedLayer: viewer.selectedLayer, visibility: viewer.visibility, diff --git a/src/display_context.ts b/src/display_context.ts index e71e77670..d25d9e9c2 100644 --- a/src/display_context.ts +++ b/src/display_context.ts @@ -14,11 +14,14 @@ * limitations under the License. */ +import { debounce } from "lodash-es"; + import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; import { TrackableValue } from "#src/trackable_value.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import type { Borrowed } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; +import { FramerateMonitor } from "#src/util/framerate.js"; import type { mat4 } from "#src/util/geom.js"; import { parseFixedLengthArray, verifyFloat01 } from "#src/util/json.js"; import { NullarySignal } from "#src/util/signal.js"; @@ -26,6 +29,8 @@ import type { WatchableVisibilityPriority } from "#src/visibility_priority/front import type { GL } from "#src/webgl/context.js"; import { initializeWebGL } from "#src/webgl/context.js"; +const DELAY_AFTER_CONTINUOUS_CAMERA_MOTION_MS = 300; + export class RenderViewport { // Width of visible portion of panel in canvas pixels. width = 0; @@ -390,12 +395,17 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { gl: GL; updateStarted = new NullarySignal(); updateFinished = new NullarySignal(); + continuousCameraMotionStarted = new NullarySignal(); + continuousCameraMotionFinished = new NullarySignal(); changed = this.updateFinished; panels = new Set(); canvasRect: DOMRect | undefined; rootRect: DOMRect | undefined; resizeGeneration = 0; boundsGeneration = -1; + private framerateMonitor = new FramerateMonitor(); + + private continuousCameraMotionInProgress = false; // Panels ordered by `drawOrder`. If length is 0, needs to be recomputed. private orderedPanels: RenderedPanel[] = []; @@ -447,6 +457,25 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { private resizeObserver = new ResizeObserver(this.resizeCallback); + private debouncedEndContinuousCameraMotion = this.registerCancellable( + debounce(() => { + this.continuousCameraMotionInProgress = false; + this.continuousCameraMotionFinished.dispatch(); + }, DELAY_AFTER_CONTINUOUS_CAMERA_MOTION_MS), + ); + + flagContinuousCameraMotion() { + if (!this.continuousCameraMotionInProgress) { + this.continuousCameraMotionStarted.dispatch(); + } + this.continuousCameraMotionInProgress = true; + this.debouncedEndContinuousCameraMotion(); + } + + get isContinuousCameraMotionInProgress() { + return this.continuousCameraMotionInProgress; + } + constructor(public container: HTMLElement) { super(); const { canvas, resizeObserver } = this; @@ -557,6 +586,8 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { ++this.frameNumber; this.updateStarted.dispatch(); const gl = this.gl; + const ext = this.framerateMonitor.getTimingExtension(gl); + const query = this.framerateMonitor.startFrameTimeQuery(gl, ext); this.ensureBoundsUpdated(); this.gl.clearColor(0.0, 0.0, 0.0, 0.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); @@ -580,6 +611,8 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { gl.clear(gl.COLOR_BUFFER_BIT); this.gl.colorMask(true, true, true, true); this.updateFinished.dispatch(); + this.framerateMonitor.endFrameTimeQuery(gl, ext, query); + this.framerateMonitor.grabAnyFinishedQueryResults(gl); } getDepthArray(): Float32Array { @@ -607,4 +640,8 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { } return depthArray; } + + getLastFrameTimesInMs(numberOfFrames: number = 10) { + return this.framerateMonitor.getLastFrameTimesInMs(numberOfFrames); + } } diff --git a/src/layer_group_viewer.ts b/src/layer_group_viewer.ts index d19578524..dfca69cc0 100644 --- a/src/layer_group_viewer.ts +++ b/src/layer_group_viewer.ts @@ -94,6 +94,7 @@ export interface LayerGroupViewerState { mouseState: MouseSelectionState; showAxisLines: TrackableBoolean; wireFrame: TrackableBoolean; + enableAdaptiveDownsampling: TrackableBoolean; showScaleBar: TrackableBoolean; scaleBarOptions: TrackableScaleBarOptions; showPerspectiveSliceViews: TrackableBoolean; @@ -356,6 +357,9 @@ export class LayerGroupViewer extends RefCounted { get wireFrame() { return this.viewerState.wireFrame; } + get enableAdaptiveDownsampling() { + return this.viewerState.enableAdaptiveDownsampling; + } get showScaleBar() { return this.viewerState.showScaleBar; } diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index 8cde729c6..851b3ff27 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -407,6 +407,7 @@ function getCommonViewerState(viewer: Viewer) { mouseState: viewer.mouseState, showAxisLines: viewer.showAxisLines, wireFrame: viewer.wireFrame, + enableAdaptiveDownsampling: viewer.enableAdaptiveDownsampling, showScaleBar: viewer.showScaleBar, scaleBarOptions: viewer.scaleBarOptions, showPerspectiveSliceViews: viewer.showPerspectiveSliceViews, diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index ae852fcb3..269ff2dda 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -58,6 +58,10 @@ import type { TrackableRGB } from "#src/util/color.js"; import type { Owned } from "#src/util/disposable.js"; import type { ActionEvent } from "#src/util/event_action_map.js"; import { registerActionListener } from "#src/util/event_action_map.js"; +import { + DownsamplingBasedOnFrameRateCalculator, + FrameTimingMethod, +} from "#src/util/framerate.js"; import { kAxes, kZeroVec4, mat4, vec3, vec4 } from "#src/util/geom.js"; import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import type { @@ -81,10 +85,9 @@ import { MultipleScaleBarTextures } from "#src/widget/scale_bar.js"; import type { RPC } from "#src/worker_rpc.js"; import { SharedObject } from "#src/worker_rpc.js"; -const REDRAW_DELAY_AFTER_CAMERA_MOVE = 300; - export interface PerspectiveViewerState extends RenderedDataViewerState { wireFrame: WatchableValueInterface; + enableAdaptiveDownsampling: WatchableValueInterface; orthographicProjection: TrackableBoolean; showSliceViews: TrackableBoolean; showScaleBar: TrackableBoolean; @@ -102,6 +105,12 @@ export enum OffscreenTextures { NUM_TEXTURES = 3, } +enum TransparentRenderingState { + TRANSPARENT = 0, + VOLUME_RENDERING = 1, + MAX_PROJECTION = 2, +} + export const glsl_perspectivePanelEmit = ` void emit(vec4 color, highp uint pickId) { out_color = color; @@ -187,6 +196,20 @@ v4f_fragColor = vec4(accum.rgb / accum.a, revealage); `); } +// Copy the depth from opaque pass to the depth buffer for OIT. +// This copy is required because the OIT depth buffer might be +// smaller than the main depth buffer. +function defineDepthCopyShader(builder: ShaderBuilder) { + builder.addOutputBuffer("vec4", "v4f_fragData0", 0); + builder.addOutputBuffer("vec4", "v4f_fragData1", 1); + builder.setFragmentMain(` + v4f_fragData0 = vec4(0.0, 0.0, 0.0, 1.0); + v4f_fragData1 = vec4(0.0, 0.0, 0.0, 1.0); + vec4 v0 = getValue0(); + gl_FragDepth = 1.0 - v0.r; +`); +} + // Copy the max projection color to the OIT buffer function defineMaxProjectionColorCopyShader(builder: ShaderBuilder) { builder.addOutputBuffer("vec4", "v4f_fragData0", 0); @@ -253,7 +276,6 @@ export class PerspectivePanel extends RenderedDataPanel { protected visibleLayerTracker: Owned< VisibleRenderLayerTracker >; - private redrawAfterMoveTimeOutId: number = -1; get rpc() { return this.sharedObject.rpc!; @@ -264,9 +286,27 @@ export class PerspectivePanel extends RenderedDataPanel { get displayDimensionRenderInfo() { return this.navigationState.displayDimensionRenderInfo; } - get isCameraMoving() { - return this.redrawAfterMoveTimeOutId !== -1; + + // the frame rate calculator is used to determine if downsampling should be applied + // after a camera move + // if a high downsample rate is applied, it persists for a few frames + // to avoid flickering when the camera is moving + private frameRateCalculator = new DownsamplingBasedOnFrameRateCalculator( + 6 /* numberOfStoredFrameDeltas */, + 4 /* maxDownsamplingFactor */, + 8 /* desiredFrameTimingMs */, + 60 /* downsamplingPersistenceDurationInFrames */, + ); + private isCameraInContinuousMotion = false; + get shouldDownsample() { + return ( + this.viewer.enableAdaptiveDownsampling.value && + this.isCameraInContinuousMotion && + this.hasVolumeRendering + ); } + private hasVolumeRendering = false; + private hasTransparent = false; /** * If boolean value is true, sliceView is shown unconditionally, regardless of the value of @@ -316,6 +356,10 @@ export class PerspectivePanel extends RenderedDataPanel { | FramebufferConfiguration | undefined; + protected volumeRenderingConfiguration_: + | FramebufferConfiguration + | undefined; + protected maxProjectionConfiguration_: | FramebufferConfiguration | undefined; @@ -333,6 +377,9 @@ export class PerspectivePanel extends RenderedDataPanel { protected maxProjectionColorCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineMaxProjectionColorCopyShader, 2), ); + protected offscreenDepthCopyHelper = this.registerDisposer( + OffscreenCopyHelper.get(this.gl, defineDepthCopyShader, 1), + ); protected maxProjectionPickCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineMaxProjectionPickCopyShader, 2), ); @@ -424,18 +471,17 @@ export class PerspectivePanel extends RenderedDataPanel { ); this.registerDisposer( - this.viewer.navigationState.changed.add(() => { - // Don't mark camera moving on picking requests - if (this.isMovingToMousePosition) { - return; - } - if (this.redrawAfterMoveTimeOutId !== -1) { - window.clearTimeout(this.redrawAfterMoveTimeOutId); + this.context.continuousCameraMotionFinished.add(() => { + this.isCameraInContinuousMotion = false; + if (this.hasVolumeRendering) { + this.scheduleRedraw(); + this.frameRateCalculator.resetForNewFrameSet(); } - this.redrawAfterMoveTimeOutId = window.setTimeout(() => { - this.redrawAfterMoveTimeOutId = -1; - this.context.scheduleRedraw(); - }, REDRAW_DELAY_AFTER_CAMERA_MOVE); + }), + ); + this.registerDisposer( + this.context.continuousCameraMotionStarted.add(() => { + this.isCameraInContinuousMotion = true; }), ); @@ -444,6 +490,7 @@ export class PerspectivePanel extends RenderedDataPanel { "rotate-via-mouse-drag", (e: ActionEvent) => { startRelativeMouseDrag(e.detail, (_event, deltaX, deltaY) => { + this.context.flagContinuousCameraMotion(); this.navigationState.pose.rotateRelative( kAxes[1], ((deltaX / 4.0) * Math.PI) / 180.0, @@ -460,6 +507,7 @@ export class PerspectivePanel extends RenderedDataPanel { element, "rotate-in-plane-via-touchrotate", (e: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const { detail } = e; this.navigationState.pose.rotateRelative( kAxes[2], @@ -472,6 +520,7 @@ export class PerspectivePanel extends RenderedDataPanel { element, "rotate-out-of-plane-via-touchtranslate", (e: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const { detail } = e; this.navigationState.pose.rotateRelative( kAxes[1], @@ -746,6 +795,26 @@ export class PerspectivePanel extends RenderedDataPanel { return transparentConfiguration; } + private get volumeRenderingConfiguration() { + let volumeRenderingConfiguration = this.volumeRenderingConfiguration_; + if (volumeRenderingConfiguration === undefined) { + volumeRenderingConfiguration = this.volumeRenderingConfiguration_ = + this.registerDisposer( + new FramebufferConfiguration(this.gl, { + colorBuffers: makeTextureBuffers( + this.gl, + 2, + this.gl.RGBA32F, + this.gl.RGBA, + this.gl.FLOAT, + ), + depthBuffer: new DepthStencilRenderbuffer(this.gl), + }), + ); + } + return volumeRenderingConfiguration; + } + private get maxProjectionConfiguration() { let maxProjectionConfiguration = this.maxProjectionConfiguration_; if (maxProjectionConfiguration === undefined) { @@ -925,7 +994,8 @@ export class PerspectivePanel extends RenderedDataPanel { bindFramebuffer, frameNumber: this.context.frameNumber, sliceViewsPresent: this.sliceViews.size > 0, - cameraMovementInProgress: this.isCameraMoving, + isContinuousCameraMotionInProgress: + this.context.isContinuousCameraMotionInProgress, }; mat4.copy( @@ -935,10 +1005,10 @@ export class PerspectivePanel extends RenderedDataPanel { const { visibleLayers } = this.visibleLayerTracker; - let hasTransparent = false; + this.hasTransparent = false; let hasMaxProjection = false; - let hasAnnotation = false; + let hasVolumeRendering = false; // Draw fully-opaque layers first. for (const [renderLayer, attachment] of visibleLayers) { @@ -949,14 +1019,16 @@ export class PerspectivePanel extends RenderedDataPanel { hasAnnotation = true; } } else { - hasTransparent = true; + this.hasTransparent = true; if (renderLayer.isVolumeRendering) { + hasVolumeRendering = true; hasMaxProjection = hasMaxProjection || isProjectionLayer(renderLayer as VolumeRenderingRenderLayer); } } } + this.hasVolumeRendering = hasVolumeRendering; this.drawSliceViews(renderContext); if (hasAnnotation) { @@ -998,16 +1070,41 @@ export class PerspectivePanel extends RenderedDataPanel { /*dppass=*/ WebGL2RenderingContext.KEEP, ); - if (hasTransparent) { + if (this.hasTransparent) { //Draw transparent objects. + let volumeRenderingBufferWidth = width; + let volumeRenderingBufferHeight = height; + + if (this.shouldDownsample) { + this.frameRateCalculator.setFrameDeltas( + this.context.getLastFrameTimesInMs( + this.frameRateCalculator.numberOfStoredFrameDeltas, + ), + ); + const downsamplingFactor = + this.frameRateCalculator.calculateDownsamplingRate( + FrameTimingMethod.MEAN, + ); + if (downsamplingFactor > 1) { + const originalRatio = width / height; + volumeRenderingBufferWidth = Math.round(width / downsamplingFactor); + volumeRenderingBufferHeight = Math.round( + volumeRenderingBufferWidth / originalRatio, + ); + } + } + // Create max projection buffer if needed. let bindMaxProjectionBuffer: () => void = () => {}; let bindMaxProjectionPickingBuffer: () => void = () => {}; if (hasMaxProjection) { const { maxProjectionConfiguration } = this; bindMaxProjectionBuffer = () => { - maxProjectionConfiguration.bind(width, height); + maxProjectionConfiguration.bind( + volumeRenderingBufferWidth, + volumeRenderingBufferHeight, + ); }; gl.depthMask(true); bindMaxProjectionBuffer(); @@ -1021,7 +1118,10 @@ export class PerspectivePanel extends RenderedDataPanel { const { maxProjectionPickConfiguration } = this; bindMaxProjectionPickingBuffer = () => { - maxProjectionPickConfiguration.bind(width, height); + maxProjectionPickConfiguration.bind( + volumeRenderingBufferWidth, + volumeRenderingBufferHeight, + ); }; bindMaxProjectionPickingBuffer(); gl.clear( @@ -1030,15 +1130,37 @@ export class PerspectivePanel extends RenderedDataPanel { ); } - // Compute accumulate and revealage textures. - gl.depthMask(false); - gl.enable(WebGL2RenderingContext.BLEND); + let bindVolumeRenderingBuffer: () => void = () => {}; + if (hasVolumeRendering) { + bindVolumeRenderingBuffer = () => { + this.volumeRenderingConfiguration.bind( + volumeRenderingBufferWidth, + volumeRenderingBufferHeight, + ); + }; + bindVolumeRenderingBuffer(); + // Copy the depth buffer from the offscreen framebuffer to the volume rendering framebuffer. + gl.depthMask(true); + gl.clearDepth(1.0); + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.clear( + WebGL2RenderingContext.COLOR_BUFFER_BIT | + WebGL2RenderingContext.DEPTH_BUFFER_BIT, + ); + this.offscreenDepthCopyHelper.draw( + this.offscreenFramebuffer.colorBuffers[OffscreenTextures.Z].texture, + ); + } + const { transparentConfiguration } = this; renderContext.bindFramebuffer = () => { transparentConfiguration.bind(width, height); }; renderContext.bindFramebuffer(); - gl.clearDepth(1.0); + + // Compute accumulate and revealage textures. + gl.depthMask(false); + gl.enable(WebGL2RenderingContext.BLEND); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear(WebGL2RenderingContext.COLOR_BUFFER_BIT); renderContext.emitter = perspectivePanelEmitOIT; @@ -1049,6 +1171,8 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, ); renderContext.emitPickID = false; + let currentTransparentRenderingState = + TransparentRenderingState.TRANSPARENT; for (const [renderLayer, attachment] of visibleLayers) { if (renderLayer.isTransparent) { renderContext.depthBufferTexture = @@ -1063,8 +1187,14 @@ export class PerspectivePanel extends RenderedDataPanel { gl.depthMask(true); gl.disable(WebGL2RenderingContext.BLEND); gl.depthFunc(WebGL2RenderingContext.GREATER); - renderContext.emitter = maxProjectionEmit; - bindMaxProjectionBuffer(); + + if ( + currentTransparentRenderingState !== + TransparentRenderingState.MAX_PROJECTION + ) { + renderContext.emitter = maxProjectionEmit; + bindMaxProjectionBuffer(); + } renderLayer.draw(renderContext, attachment); // Copy max projection result to picking buffer @@ -1079,7 +1209,7 @@ export class PerspectivePanel extends RenderedDataPanel { // Copy max projection color result to the transparent buffer with OIT // Depth testing off to combine max layers into one color via blend - renderContext.bindFramebuffer(); + bindVolumeRenderingBuffer(); gl.depthMask(false); gl.disable(WebGL2RenderingContext.DEPTH_TEST); gl.enable(WebGL2RenderingContext.BLEND); @@ -1110,21 +1240,49 @@ export class PerspectivePanel extends RenderedDataPanel { gl.depthMask(false); gl.enable(WebGL2RenderingContext.DEPTH_TEST); gl.depthFunc(WebGL2RenderingContext.LESS); - renderContext.emitter = perspectivePanelEmitOIT; - renderContext.bindFramebuffer(); + + currentTransparentRenderingState = + TransparentRenderingState.MAX_PROJECTION; + } else if (renderLayer.isVolumeRendering) { + if ( + currentTransparentRenderingState !== + TransparentRenderingState.VOLUME_RENDERING + ) { + renderContext.emitter = perspectivePanelEmitOIT; + bindVolumeRenderingBuffer(); + } + currentTransparentRenderingState = + TransparentRenderingState.VOLUME_RENDERING; + renderLayer.draw(renderContext, attachment); } // Draw regular transparent layers else if (renderLayer.isTransparent) { + if ( + currentTransparentRenderingState !== + TransparentRenderingState.TRANSPARENT + ) { + renderContext.emitter = perspectivePanelEmitOIT; + renderContext.bindFramebuffer(); + } + currentTransparentRenderingState = + TransparentRenderingState.TRANSPARENT; renderLayer.draw(renderContext, attachment); } } // Copy transparent rendering result back to primary buffer. gl.disable(WebGL2RenderingContext.DEPTH_TEST); + gl.viewport(0, 0, width, height); this.offscreenFramebuffer.bindSingle(OffscreenTextures.COLOR); gl.blendFunc( WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, WebGL2RenderingContext.SRC_ALPHA, ); + if (hasVolumeRendering) { + this.transparencyCopyHelper.draw( + this.volumeRenderingConfiguration.colorBuffers[0].texture, + this.volumeRenderingConfiguration.colorBuffers[1].texture, + ); + } this.transparencyCopyHelper.draw( transparentConfiguration.colorBuffers[0].texture, transparentConfiguration.colorBuffers[1].texture, diff --git a/src/perspective_view/render_layer.ts b/src/perspective_view/render_layer.ts index dd1ac960f..7316717b6 100644 --- a/src/perspective_view/render_layer.ts +++ b/src/perspective_view/render_layer.ts @@ -64,7 +64,7 @@ export interface PerspectiveViewRenderContext /** * Specifies if the camera is moving */ - cameraMovementInProgress: boolean; + isContinuousCameraMotionInProgress: boolean; /** * Specifices how to bind the max projection buffer diff --git a/src/rendered_data_panel.ts b/src/rendered_data_panel.ts index 9c2b95449..271670287 100644 --- a/src/rendered_data_panel.ts +++ b/src/rendered_data_panel.ts @@ -447,6 +447,8 @@ export abstract class RenderedDataPanel extends RenderedPanel { this.attemptToIssuePickRequest(); } + protected isMovingToMousePositionOnPick = false; + constructor( context: Borrowed, element: HTMLElement, @@ -506,18 +508,22 @@ export abstract class RenderedDataPanel extends RenderedPanel { }); registerActionListener(element, "zoom-in", () => { + this.context.flagContinuousCameraMotion(); this.navigationState.zoomBy(0.5); }); registerActionListener(element, "zoom-out", () => { + this.context.flagContinuousCameraMotion(); this.navigationState.zoomBy(2.0); }); registerActionListener(element, "depth-range-decrease", () => { + this.context.flagContinuousCameraMotion(); this.navigationState.depthRange.value *= 0.5; }); registerActionListener(element, "depth-range-increase", () => { + this.context.flagContinuousCameraMotion(); this.navigationState.depthRange.value *= 2; }); @@ -529,11 +535,13 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, `rotate-relative-${axisName}${signStr}`, () => { + this.context.flagContinuousCameraMotion(); this.navigationState.pose.rotateRelative(kAxes[axis], sign * 0.1); }, ); const tempOffset = vec3.create(); registerActionListener(element, `${axisName}${signStr}`, () => { + this.context.flagContinuousCameraMotion(); const { navigationState } = this; const offset = tempOffset; offset[0] = 0; @@ -549,6 +557,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, "zoom-via-wheel", (event: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const e = event.detail; this.onMousemove(e, false); this.zoomByMouse(getWheelZoomAmount(e)); @@ -559,6 +568,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, "adjust-depth-range-via-wheel", (event: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const e = event.detail; this.navigationState.depthRange.value *= getWheelZoomAmount(e); }, @@ -569,6 +579,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { "translate-via-mouse-drag", (e: ActionEvent) => { startRelativeMouseDrag(e.detail, (_event, deltaX, deltaY) => { + this.context.flagContinuousCameraMotion(); this.translateByViewportPixels(deltaX, deltaY); }); }, @@ -578,6 +589,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, "translate-in-plane-via-touchtranslate", (e: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const { detail } = e; this.translateByViewportPixels(detail.deltaX, detail.deltaY); }, @@ -587,6 +599,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, "translate-z-via-touchtranslate", (e: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const { detail } = e; const { navigationState } = this; const offset = tempVec3; @@ -602,6 +615,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, `z+${amount}-via-wheel`, (event: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const e = event.detail; const { navigationState } = this; const offset = tempVec3; @@ -617,9 +631,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { registerActionListener(element, "move-to-mouse-position", () => { const { mouseState } = this.viewer; if (mouseState.updateUnconditionally()) { - this.isMovingToMousePosition = true; this.navigationState.position.value = mouseState.position; - this.isMovingToMousePosition = false; } }); @@ -737,6 +749,7 @@ export abstract class RenderedDataPanel extends RenderedPanel { element, "zoom-via-touchpinch", (e: ActionEvent) => { + this.context.flagContinuousCameraMotion(); const { detail } = e; this.handleMouseMove(detail.centerX, detail.centerY); const ratio = detail.prevDistance / detail.distance; diff --git a/src/sliceview/panel.ts b/src/sliceview/panel.ts index d44aa0143..172ee6f25 100644 --- a/src/sliceview/panel.ts +++ b/src/sliceview/panel.ts @@ -176,6 +176,7 @@ export class SliceViewPanel extends RenderedDataPanel { if (mouseState.updateUnconditionally()) { const initialPosition = Float32Array.from(mouseState.position); startRelativeMouseDrag(e.detail, (_event, deltaX, deltaY) => { + this.context.flagContinuousCameraMotion(); const { pose } = this.navigationState; const xAxis = vec3.transformQuat( tempVec3, @@ -210,6 +211,7 @@ export class SliceViewPanel extends RenderedDataPanel { const { mouseState } = this.viewer; this.handleMouseMove(detail.centerX, detail.centerY); if (mouseState.updateUnconditionally()) { + this.context.flagContinuousCameraMotion(); this.navigationState.pose.rotateAbsolute( this.sliceView.projectionParameters.value .viewportNormalInCanonicalCoordinates, diff --git a/src/ui/viewer_settings.ts b/src/ui/viewer_settings.ts index 5c41ad8fa..8744cb6f5 100644 --- a/src/ui/viewer_settings.ts +++ b/src/ui/viewer_settings.ts @@ -125,6 +125,7 @@ export class ViewerSettingsPanel extends SidePanel { ); addCheckbox("Wire frame rendering", viewer.wireFrame); addCheckbox("Enable prefetching", viewer.chunkQueueManager.enablePrefetch); + addCheckbox("Enable adaptive downsampling", viewer.enableAdaptiveDownsampling); const addColor = (label: string, value: WatchableValueInterface) => { const labelElement = document.createElement("label"); diff --git a/src/util/framerate.spec.ts b/src/util/framerate.spec.ts new file mode 100644 index 000000000..e3b548398 --- /dev/null +++ b/src/util/framerate.spec.ts @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, it, expect } from "vitest"; +import { + DownsamplingBasedOnFrameRateCalculator, + FrameTimingMethod, +} from "#src/util/framerate.js"; + +describe("FrameRateCounter", () => { + it("calculates valid fps for evenly spaced frames", () => { + const frameRateCounter = new DownsamplingBasedOnFrameRateCalculator(10); + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 100); + if (i === 0) { + expect(frameRateCounter.calculateFrameTimeInMs()).toEqual(0); + } else { + expect(frameRateCounter.calculateFrameTimeInMs()).toEqual(100); + } + } + }); + it("calculates valid fps for many frames", () => { + const frameRateCounter = new DownsamplingBasedOnFrameRateCalculator(9); + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 100); + } + frameRateCounter.resetForNewFrameSet(); + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 10); + } + expect(frameRateCounter.calculateFrameTimeInMs()).toEqual(10); + expect( + frameRateCounter.calculateFrameTimeInMs(FrameTimingMethod.MEDIAN), + ).toEqual(10); + }); + it("removes last frame after reset", () => { + const frameRateCounter = new DownsamplingBasedOnFrameRateCalculator(10); + expect(frameRateCounter.calculateFrameTimeInMs()).toEqual(0); + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 100); + } + expect(frameRateCounter.calculateFrameTimeInMs()).toEqual(100); + frameRateCounter.resetForNewFrameSet(); + for (let i = 0; i < 5; i++) { + frameRateCounter.addFrame(i * 200); + } + expect( + frameRateCounter.calculateFrameTimeInMs(FrameTimingMethod.MEAN), + ).toEqual(140); + expect( + frameRateCounter.calculateFrameTimeInMs(FrameTimingMethod.MAX), + ).toEqual(200); + }); + it("calculates a valid downsampling rate", () => { + const frameRateCounter = new DownsamplingBasedOnFrameRateCalculator( + 9, + 8, + 100, + 15, + ); + + // Without any frames, the downsampling rate is 4 + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); + + // 80ms / 100ms < 1, so no downsampling + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 80); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); + + // 400ms / 100ms = 4, so downsampling by 4 + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 400); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); + + // Better fps now, but the high rate persists for a while + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 50); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); + + // The downsampling rate will eventually drop + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 50); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); + + // If the frame rate is very bad, still caps at 8 + frameRateCounter.resetForNewFrameSet(); + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); + for (let i = 0; i < 9; i++) { + frameRateCounter.addFrame(i * 1000); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(8); + + // Reset the frame set + frameRateCounter.resetForNewFrameSet(); + // It should keep the downsampling rate from the previous frame set + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(8); + + // But a set of new frames will reset the downsampling rate + for (let i = 0; i < 10; i++) { + frameRateCounter.addFrame(i * 50); + frameRateCounter.calculateDownsamplingRate(); + } + // It won't happen immediately + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(8); + // But it will after the persistence duration + for (let i = 0; i < 15; i++) { + frameRateCounter.addFrame(i * 50); + } + expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); + }); +}); diff --git a/src/util/framerate.ts b/src/util/framerate.ts new file mode 100644 index 000000000..05f34bec2 --- /dev/null +++ b/src/util/framerate.ts @@ -0,0 +1,264 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export enum FrameTimingMethod { + MEDIAN = 0, + MEAN = 1, + MAX = 2, +} + +export class FramerateMonitor { + private timeElapsedQueries: (WebGLQuery | null)[] = []; + private warnedAboutMissingExtension = false; + private storedTimeDeltas: number[] = []; + + constructor( + private numStoredTimes: number = 10, + private queryPoolSize: number = 10, + ) { + if (this.queryPoolSize < 1) { + throw new Error( + `Query pool size must be at least 1, but got ${queryPoolSize}.`, + ); + } + } + + getTimingExtension(gl: WebGL2RenderingContext) { + const ext = gl.getExtension("EXT_disjoint_timer_query_webgl2"); + if (ext === null && !this.warnedAboutMissingExtension) { + console.log( + "EXT_disjoint_timer_query_webgl2 extension not available. " + + "Cannot measure frame time.", + ); + this.warnedAboutMissingExtension = true; + } + return ext; + } + + startFrameTimeQuery(gl: WebGL2RenderingContext, ext: any) { + if (ext === null) { + return null; + } + const query = gl.createQuery(); + if (query !== null) { + gl.beginQuery(ext.TIME_ELAPSED_EXT, query); + } + return query; + } + + endFrameTimeQuery( + gl: WebGL2RenderingContext, + ext: any, + query: WebGLQuery | null, + ) { + if (ext !== null && query !== null) { + gl.endQuery(ext.TIME_ELAPSED_EXT); + } + if (this.timeElapsedQueries.length >= this.queryPoolSize) { + const oldestQuery = this.timeElapsedQueries.shift(); + if (oldestQuery !== null && oldestQuery !== undefined) { + gl.deleteQuery(oldestQuery); + } + } + this.timeElapsedQueries.push(query); + } + + grabAnyFinishedQueryResults(gl: WebGL2RenderingContext) { + const deletedQueryIndices: number[] = []; + for (let i = 0; i < this.timeElapsedQueries.length; i++) { + const query = this.timeElapsedQueries[i]; + if (query !== null) { + const available = gl.getQueryParameter( + query, + gl.QUERY_RESULT_AVAILABLE, + ); + if (available) { + const result = gl.getQueryParameter(query, gl.QUERY_RESULT) / 1e6; + this.storedTimeDeltas.push(result); + gl.deleteQuery(query); + deletedQueryIndices.push(i); + } + } + } + for (let i = deletedQueryIndices.length - 1; i >= 0; i--) { + this.timeElapsedQueries.splice(i, 1); + } + if (this.storedTimeDeltas.length > this.numStoredTimes) { + this.storedTimeDeltas = this.storedTimeDeltas.slice(-this.numStoredTimes); + } + } + + getLastFrameTimesInMs(numberOfFrames: number = 10) { + return this.storedTimeDeltas.slice(-numberOfFrames); + } + + getQueries() { + return this.timeElapsedQueries; + } +} + +export class DownsamplingBasedOnFrameRateCalculator { + private lastFrameTime: number | null = null; + private frameDeltas: number[] = []; + private downsamplingRates: Map = new Map(); + private frameCount = 0; + + /** + * @param numberOfStoredFrameDeltas The number of frame deltas to store. Oldest frame deltas are removed. Must be at least 1. + * @param maxDownsamplingFactor The maximum factor for downsampling. Must be at least 2. + * @param desiredFrameTimingMs The desired frame timing in milliseconds. The downsampling rate is based on a comparison of the actual frame timing to this value. + * @param downsamplingPersistenceDurationInFrames The max number of frames over which a high downsampling rate persists. + */ + constructor( + public numberOfStoredFrameDeltas: number = 10, + private maxDownsamplingFactor: number = 8, + private desiredFrameTimingMs = 1000 / 60, + private downsamplingPersistenceDurationInFrames = 15, + ) { + this.validateConstructorArguments(); + for (let i = 1; i <= this.maxDownsamplingFactor; i *= 2) { + this.downsamplingRates.set(i, -Infinity); + } + } + + private validateConstructorArguments() { + this.numberOfStoredFrameDeltas = Math.max( + 1, + Math.round(this.numberOfStoredFrameDeltas), + ); + this.maxDownsamplingFactor = Math.max( + 2, + Math.round(this.maxDownsamplingFactor), + ); + } + + private storeFrameDelta(frameDelta: number) { + this.frameDeltas.push(frameDelta); + if (this.frameDeltas.length > this.numberOfStoredFrameDeltas) { + this.frameDeltas.shift(); + } + } + + private calculateMeanFrameTime(): number { + return ( + this.frameDeltas.reduce((a, b) => a + b, 0) / this.frameDeltas.length + ); + } + + private calculateMedianFrameTime(): number { + const sortedFrameDeltas = this.frameDeltas.slice().sort((a, b) => a - b); + const midpoint = Math.floor(sortedFrameDeltas.length / 2); + return sortedFrameDeltas.length % 2 === 1 + ? sortedFrameDeltas[midpoint] + : (sortedFrameDeltas[midpoint - 1] + sortedFrameDeltas[midpoint]) / 2; + } + + private calculateMaxFrameTime(): number { + return Math.max(...this.frameDeltas); + } + + private updateMaxTrackedDownsamplingRate(downsampleFactor: number) { + this.downsamplingRates.set(downsampleFactor, this.frameCount); + let maxTrackedDownsamplingRate = 1; + for (const [downsamplingRate, frameCount] of this.downsamplingRates) { + if ( + this.frameCount - frameCount <= + this.downsamplingPersistenceDurationInFrames + ) { + maxTrackedDownsamplingRate = downsamplingRate; + } + } + return maxTrackedDownsamplingRate; + } + + /* This doesn't reset stored frame deltas. Is usually called on a new continous camera move */ + resetForNewFrameSet() { + this.lastFrameTime = null; + this.frameCount = 0; + this.downsamplingRates.forEach((_, key) => { + this.downsamplingRates.set(key, -Infinity); + }); + } + + addFrame(timestamp: number = Date.now()) { + if (this.lastFrameTime !== null) { + const frameDelta = timestamp - this.lastFrameTime; + if (frameDelta > 0) { + this.storeFrameDelta(frameDelta); + } + } + this.lastFrameTime = timestamp; + this.frameCount++; + } + + calculateFrameTimeInMs( + method: FrameTimingMethod = FrameTimingMethod.MAX, + ): number { + if (this.frameDeltas.length === 0) { + return 0; + } + switch (method) { + case FrameTimingMethod.MEDIAN: + return this.calculateMedianFrameTime(); + case FrameTimingMethod.MEAN: + return this.calculateMeanFrameTime(); + case FrameTimingMethod.MAX: + return this.calculateMaxFrameTime(); + } + } + + /** Should be called once per frame for proper downsampling persistence */ + calculateDownsamplingRate( + method: FrameTimingMethod = FrameTimingMethod.MEAN, + ): number { + const calculatedFrameTime = this.calculateFrameTimeInMs(method); + if (calculatedFrameTime === 0) { + // Don't add this one to tracking, it's just to start the process + return Math.min(4, this.maxDownsamplingFactor); + } + let downsampleFactorBasedOnFramerate = Math.max( + calculatedFrameTime / this.desiredFrameTimingMs, + 1, + ); + // Round to the nearest power of 2. + downsampleFactorBasedOnFramerate = Math.min( + Math.pow(2, Math.round(Math.log2(downsampleFactorBasedOnFramerate))), + this.maxDownsamplingFactor, + ); + return this.updateMaxTrackedDownsamplingRate( + downsampleFactorBasedOnFramerate, + ); + } + + getFrameDeltas(): number[] { + return this.frameDeltas; + } + + getFrameCount(): number { + return this.frameCount; + } + + getDownsamplingRates(): Map { + return this.downsamplingRates; + } + + setFrameDeltas(frameDeltas: number[], incrementFrameCount = true) { + this.frameDeltas = frameDeltas.slice(-this.numberOfStoredFrameDeltas); + if (incrementFrameCount) { + this.frameCount++; + } + } +} diff --git a/src/viewer.ts b/src/viewer.ts index 465f56741..73a72f171 100644 --- a/src/viewer.ts +++ b/src/viewer.ts @@ -295,6 +295,7 @@ class TrackableViewerState extends CompoundTrackable { this.add("layers", viewer.layerSpecification); this.add("showAxisLines", viewer.showAxisLines); this.add("wireFrame", viewer.wireFrame); + this.add("enableAdaptiveDownsampling", viewer.enableAdaptiveDownsampling); this.add("showScaleBar", viewer.showScaleBar); this.add("showDefaultAnnotations", viewer.showDefaultAnnotations); @@ -458,6 +459,7 @@ export class Viewer extends RefCounted implements ViewerState { ); showAxisLines = new TrackableBoolean(true, true); wireFrame = new TrackableBoolean(false, false); + enableAdaptiveDownsampling = new TrackableBoolean(true, true); showScaleBar = new TrackableBoolean(true, true); showPerspectiveSliceViews = new TrackableBoolean(true, true); visibleLayerRoles = allRenderLayerRoles(); diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index a298b6c5a..66c486d2b 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -819,7 +819,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); this.getDataHistogramCount() > 0 && !renderContext.wireFrame && !renderContext.sliceViewsPresent && - !renderContext.cameraMovementInProgress; + !renderContext.isContinuousCameraMotionInProgress; gl.enable(WebGL2RenderingContext.CULL_FACE); gl.cullFace(WebGL2RenderingContext.FRONT); From 90cf144e28126ff66f1c5189ad2dcbc340063d10 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Mon, 22 Jul 2024 09:16:38 -0700 Subject: [PATCH 14/45] style: fix formatting --- .prettierignore | 2 ++ src/ui/viewer_settings.ts | 5 ++++- src/util/framerate.spec.ts | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.prettierignore b/.prettierignore index 56db52f7b..42541345d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ .parcel-cache dist /lib +/docs/_build/ +/.ruff_cache diff --git a/src/ui/viewer_settings.ts b/src/ui/viewer_settings.ts index 8744cb6f5..a0c936f94 100644 --- a/src/ui/viewer_settings.ts +++ b/src/ui/viewer_settings.ts @@ -125,7 +125,10 @@ export class ViewerSettingsPanel extends SidePanel { ); addCheckbox("Wire frame rendering", viewer.wireFrame); addCheckbox("Enable prefetching", viewer.chunkQueueManager.enablePrefetch); - addCheckbox("Enable adaptive downsampling", viewer.enableAdaptiveDownsampling); + addCheckbox( + "Enable adaptive downsampling", + viewer.enableAdaptiveDownsampling, + ); const addColor = (label: string, value: WatchableValueInterface) => { const labelElement = document.createElement("label"); diff --git a/src/util/framerate.spec.ts b/src/util/framerate.spec.ts index e3b548398..6f96a4bb0 100644 --- a/src/util/framerate.spec.ts +++ b/src/util/framerate.spec.ts @@ -71,10 +71,10 @@ describe("FrameRateCounter", () => { 100, 15, ); - + // Without any frames, the downsampling rate is 4 expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); - + // 80ms / 100ms < 1, so no downsampling for (let i = 0; i < 10; i++) { frameRateCounter.addFrame(i * 80); @@ -86,19 +86,19 @@ describe("FrameRateCounter", () => { frameRateCounter.addFrame(i * 400); } expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); - + // Better fps now, but the high rate persists for a while for (let i = 0; i < 10; i++) { frameRateCounter.addFrame(i * 50); } expect(frameRateCounter.calculateDownsamplingRate()).toEqual(4); - + // The downsampling rate will eventually drop for (let i = 0; i < 10; i++) { frameRateCounter.addFrame(i * 50); } expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); - + // If the frame rate is very bad, still caps at 8 frameRateCounter.resetForNewFrameSet(); expect(frameRateCounter.calculateDownsamplingRate()).toEqual(1); From 2b5650084b1dfff6313512feb790e1e48ec75ac4 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 11:30:49 -0700 Subject: [PATCH 15/45] chore: build with NumPy 2.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9f31a694b..3474d58d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = [ "setuptools>=64", "wheel", "setuptools_scm", - "oldest-supported-numpy", + "numpy>=2", ] [tool.ruff] From 1c2ef88a6dfa1845c902282ea2c931c57b3eca31 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 11:40:40 -0700 Subject: [PATCH 16/45] fix(python/ext): fix building with NumPy 2.0 --- python/ext/src/_neuroglancer.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/ext/src/_neuroglancer.cc b/python/ext/src/_neuroglancer.cc index 5e1eb3bf4..113692fb6 100644 --- a/python/ext/src/_neuroglancer.cc +++ b/python/ext/src/_neuroglancer.cc @@ -55,8 +55,9 @@ static int tp_init(Obj* self, PyObject* args, PyObject* kwds) { return -1; } auto* descr = PyArray_DESCR(array); + npy_intp elsize = PyDataType_ELSIZE(descr); if ((descr->kind != 'i' && descr->kind != 'u') || - (descr->elsize != 1 && descr->elsize != 2 && descr->elsize != 4 && descr->elsize != 8)) { + (elsize != 1 && elsize != 2 && elsize != 4 && elsize != 8)) { Py_DECREF(array); PyErr_SetString(PyExc_ValueError, "ndarray must have 8-, 16-, 32-, or 64-bit integer type"); return -1; @@ -65,15 +66,14 @@ static int tp_init(Obj* self, PyObject* args, PyObject* kwds) { npy_intp* dims = PyArray_DIMS(array); int64_t size_int64[] = {dims[2], dims[1], dims[0]}; npy_intp* strides_in_bytes = PyArray_STRIDES(array); - int64_t strides_in_elements[] = {strides_in_bytes[2] / descr->elsize, - strides_in_bytes[1] / descr->elsize, - strides_in_bytes[0] / descr->elsize}; + int64_t strides_in_elements[] = {strides_in_bytes[2] / elsize, strides_in_bytes[1] / elsize, + strides_in_bytes[0] / elsize}; meshing::OnDemandObjectMeshGenerator impl; Py_BEGIN_ALLOW_THREADS; - switch (descr->elsize) { + switch (elsize) { case 1: impl = meshing::OnDemandObjectMeshGenerator(static_cast(PyArray_DATA(array)), size_int64, strides_in_elements, voxel_size, From 33f5eb5e4ceef81d221436764bbdc438724abbcd Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 12:00:24 -0700 Subject: [PATCH 17/45] chore(github): skip WebGL tests on macos in github actions Chrome as launched by vitest/webdriverio currently does not support WebGL on macOS on github actions. See related bug: https://github.com/microsoft/playwright/issues/30585 --- .github/workflows/build.yml | 4 ++++ vitest.workspace.ts | 2 ++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c33f5d19e..f03241824 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,6 +50,10 @@ jobs: - uses: ./.github/actions/setup-firefox - name: Run JavaScript tests (including WebGL) run: npm test + if: ${{ runner.os != 'macOS' }} + - name: Run JavaScript tests (excluding WebGL) + run: npm test -- --project node + if: ${{ runner.os == 'macOS' }} - name: Run JavaScript benchmarks run: npm run benchmark - name: Upload NPM package as artifact diff --git a/vitest.workspace.ts b/vitest.workspace.ts index ada1a37b3..b3198993c 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -3,6 +3,7 @@ import { defineWorkspace } from "vitest/config"; export default defineWorkspace([ { test: { + name: "node", environment: "node", setupFiles: ["./build_tools/vitest/setup-crypto.ts"], include: ["src/**/*.spec.ts"], @@ -13,6 +14,7 @@ export default defineWorkspace([ }, { test: { + name: "browser", include: ["src/**/*.browser_test.ts"], benchmark: { include: [], From d33395b08ce2cb6c8b36ba7fefd6c9f93faeba96 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 12:38:34 -0700 Subject: [PATCH 18/45] chore(examples): update example deps and disable parcel testing --- .../parcel-project-built/package-lock.json | 7225 ++++++++++++++--- .../parcel/parcel-project-built/package.json | 4 +- .../parcel-project-source/package-lock.json | 7191 +++++++++++++--- .../parcel/parcel-project-source/package.json | 4 +- .../vite/vite-project-built/package-lock.json | 690 +- examples/vite/vite-project-built/package.json | 2 +- .../vite-project-source/package-lock.json | 690 +- .../vite/vite-project-source/package.json | 2 +- .../webpack-project-built/package-lock.json | 356 +- .../webpack-project-built/package.json | 8 +- .../webpack-project-source/package-lock.json | 640 +- .../webpack-project-source/package.json | 10 +- python/tests/client_test.py | 7 +- src/ui/layer_side_panel.ts | 4 +- 14 files changed, 14190 insertions(+), 2643 deletions(-) diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 9b17691ee..f9181ec6e 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -12,8 +12,8 @@ "neuroglancer": "file:../../../dist/package" }, "devDependencies": { - "@parcel/transformer-inline-string": "^2.11.0", - "parcel": "^2.11.0", + "@parcel/transformer-inline-string": "^2.12.0", + "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" } }, @@ -36,89 +36,37 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -126,8 +74,9 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -137,8 +86,9 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -150,29 +100,33 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -180,70 +134,6 @@ "node": ">=4" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@lezer/common": { "version": "1.2.1", "dev": true, @@ -295,20 +185,136 @@ ] }, "node_modules/@parcel/bundler-default": { - "version": "2.11.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.12.0.tgz", + "integrity": "sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/graph": "3.1.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-default/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -352,15 +358,16 @@ } }, "node_modules/@parcel/compressor-raw": { - "version": "2.11.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.12.0.tgz", + "integrity": "sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "@parcel/plugin": "2.12.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", @@ -368,70 +375,72 @@ } }, "node_modules/@parcel/config-default": { - "version": "2.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/bundler-default": "2.11.0", - "@parcel/compressor-raw": "2.11.0", - "@parcel/namer-default": "2.11.0", - "@parcel/optimizer-css": "2.11.0", - "@parcel/optimizer-htmlnano": "2.11.0", - "@parcel/optimizer-image": "2.11.0", - "@parcel/optimizer-svgo": "2.11.0", - "@parcel/optimizer-swc": "2.11.0", - "@parcel/packager-css": "2.11.0", - "@parcel/packager-html": "2.11.0", - "@parcel/packager-js": "2.11.0", - "@parcel/packager-raw": "2.11.0", - "@parcel/packager-svg": "2.11.0", - "@parcel/packager-wasm": "2.11.0", - "@parcel/reporter-dev-server": "2.11.0", - "@parcel/resolver-default": "2.11.0", - "@parcel/runtime-browser-hmr": "2.11.0", - "@parcel/runtime-js": "2.11.0", - "@parcel/runtime-react-refresh": "2.11.0", - "@parcel/runtime-service-worker": "2.11.0", - "@parcel/transformer-babel": "2.11.0", - "@parcel/transformer-css": "2.11.0", - "@parcel/transformer-html": "2.11.0", - "@parcel/transformer-image": "2.11.0", - "@parcel/transformer-js": "2.11.0", - "@parcel/transformer-json": "2.11.0", - "@parcel/transformer-postcss": "2.11.0", - "@parcel/transformer-posthtml": "2.11.0", - "@parcel/transformer-raw": "2.11.0", - "@parcel/transformer-react-refresh-wrap": "2.11.0", - "@parcel/transformer-svg": "2.11.0" + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.12.0.tgz", + "integrity": "sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.12.0", + "@parcel/compressor-raw": "2.12.0", + "@parcel/namer-default": "2.12.0", + "@parcel/optimizer-css": "2.12.0", + "@parcel/optimizer-htmlnano": "2.12.0", + "@parcel/optimizer-image": "2.12.0", + "@parcel/optimizer-svgo": "2.12.0", + "@parcel/optimizer-swc": "2.12.0", + "@parcel/packager-css": "2.12.0", + "@parcel/packager-html": "2.12.0", + "@parcel/packager-js": "2.12.0", + "@parcel/packager-raw": "2.12.0", + "@parcel/packager-svg": "2.12.0", + "@parcel/packager-wasm": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/resolver-default": "2.12.0", + "@parcel/runtime-browser-hmr": "2.12.0", + "@parcel/runtime-js": "2.12.0", + "@parcel/runtime-react-refresh": "2.12.0", + "@parcel/runtime-service-worker": "2.12.0", + "@parcel/transformer-babel": "2.12.0", + "@parcel/transformer-css": "2.12.0", + "@parcel/transformer-html": "2.12.0", + "@parcel/transformer-image": "2.12.0", + "@parcel/transformer-js": "2.12.0", + "@parcel/transformer-json": "2.12.0", + "@parcel/transformer-postcss": "2.12.0", + "@parcel/transformer-posthtml": "2.12.0", + "@parcel/transformer-raw": "2.12.0", + "@parcel/transformer-react-refresh-wrap": "2.12.0", + "@parcel/transformer-svg": "2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.11.0" + "@parcel/core": "^2.12.0" } }, "node_modules/@parcel/core": { - "version": "2.11.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.12.0.tgz", + "integrity": "sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==", "dev": true, - "license": "MIT", "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/graph": "3.1.0", - "@parcel/logger": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/rust": "2.11.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/rust": "2.12.0", "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", "abortcontroller-polyfill": "^1.1.9", "base-x": "^3.0.8", "browserslist": "^4.6.6", @@ -451,13 +460,16 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/diagnostic": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", "dev": true, - "license": "MIT", "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" }, "engines": { "node": ">= 12.0.0" @@ -465,12 +477,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/events": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", + "dependencies": { + "chalk": "^4.1.0" + }, "engines": { "node": ">= 12.0.0" }, @@ -479,16 +498,14 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/fs": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/rust": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/watcher": "^2.0.7", - "@parcel/workers": "2.11.0" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" @@ -496,18 +513,13 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/graph": { - "version": "3.1.0", + "node_modules/@parcel/core/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", - "dependencies": { - "nullthrows": "^1.1.1" - }, "engines": { "node": ">= 12.0.0" }, @@ -516,13 +528,17 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/logger": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0" + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" }, "engines": { "node": ">= 12.0.0" @@ -530,14 +546,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { "node": ">= 12.0.0" @@ -547,34 +568,33 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/namer-default": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "nullthrows": "^1.1.1" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/node-resolver-core": { - "version": "3.2.0", + "node_modules/@parcel/core/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", "nullthrows": "^1.1.1", "semver": "^7.5.2" }, @@ -586,133 +606,167 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-css": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "lightningcss": "^1.22.1", - "nullthrows": "^1.1.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/commander": { - "version": "7.2.0", + "node_modules/@parcel/core/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { - "version": "4.3.0", + "node_modules/@parcel/core/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { - "version": "1.1.3", + "node_modules/@parcel/core/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { - "version": "4.2.0", + "node_modules/@parcel/core/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", "dev": true, - "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { - "version": "2.0.14", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { - "version": "2.8.0", + "node_modules/@parcel/diagnostic": { + "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, - "bin": { - "svgo": "bin/svgo" + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.11.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-image": { + "node_modules/@parcel/fs": { "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", "@parcel/rust": "2.11.0", + "@parcel/types": "2.11.0", "@parcel/utils": "2.11.0", + "@parcel/watcher": "^2.0.7", "@parcel/workers": "2.11.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -722,129 +776,100 @@ "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/optimizer-svgo": { - "version": "2.11.0", + "node_modules/@parcel/graph": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.2.0.tgz", + "integrity": "sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "svgo": "^2.4.0" + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/commander": { - "version": "7.2.0", + "node_modules/@parcel/logger": { + "version": "2.11.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { - "version": "1.1.3", + "node_modules/@parcel/markdown-ansi": { + "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "chalk": "^4.1.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@parcel/optimizer-svgo/node_modules/csso": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { - "version": "2.8.0", + "node_modules/@parcel/namer-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.12.0.tgz", + "integrity": "sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==", "dev": true, - "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-swc": { - "version": "2.11.0", + "node_modules/@parcel/namer-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "@swc/core": "^1.3.36", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/package-manager": { - "version": "2.11.0", + "node_modules/@parcel/node-resolver-core": { + "version": "3.2.0", "dev": true, "license": "MIT", "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", "@parcel/diagnostic": "2.11.0", "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/node-resolver-core": "3.2.0", - "@parcel/types": "2.11.0", + "@parcel/rust": "2.11.0", "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", + "nullthrows": "^1.1.1", "semver": "^7.5.2" }, "engines": { @@ -853,132 +878,115 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/packager-css": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.12.0.tgz", + "integrity": "sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-html": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-js": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "globals": "^13.2.0", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-raw": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/plugin": "2.11.0" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-svg": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "posthtml": "^0.16.4" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-wasm": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">=12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/plugin": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/types": "2.11.0" - }, "engines": { "node": ">= 12.0.0" }, @@ -987,14 +995,20 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/profiler": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "chrome-trace-event": "^1.0.2" + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" @@ -1004,157 +1018,179 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/reporter-cli": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.12.0.tgz", + "integrity": "sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "chalk": "^4.1.0", - "cli-progress": "^3.12.0", - "term-size": "^2.2.1" + "@parcel/plugin": "2.12.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/@parcel/reporter-tracer": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "chrome-trace-event": "^1.0.3", - "nullthrows": "^1.1.1" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8.0.0" } }, - "node_modules/@parcel/resolver-default": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/node-resolver-core": "3.2.0", - "@parcel/plugin": "2.11.0" + "css-tree": "^1.1.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.12.0.tgz", + "integrity": "sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/runtime-js": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/rust": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.0.0" }, @@ -1163,239 +1199,4683 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", "dev": true, - "license": "MIT", "dependencies": { - "detect-libc": "^1.0.3" + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" }, "engines": { - "node": "^12.18.3 || >=14" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/transformer-babel": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-css": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "lightningcss": "^1.22.1", - "nullthrows": "^1.1.1" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-html": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^7.5.2", - "srcset": "4" + "semver": "^7.5.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-image": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "nullthrows": "^1.1.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.11.0" + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/transformer-inline-string": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-js": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "@swc/helpers": "^0.5.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^7.5.2" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/transformer-json": { - "version": "2.11.0", + "node_modules/@parcel/optimizer-image/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.12.0.tgz", + "integrity": "sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.12.0.tgz", + "integrity": "sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@swc/core": "^1.3.36", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/node-resolver-core": "3.2.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.12.0.tgz", + "integrity": "sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.12.0.tgz", + "integrity": "sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.12.0.tgz", + "integrity": "sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.12.0.tgz", + "integrity": "sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.12.0.tgz", + "integrity": "sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.12.0.tgz", + "integrity": "sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">=12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.12.0.tgz", + "integrity": "sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==", + "dev": true, + "dependencies": { + "@parcel/types": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.12.0.tgz", + "integrity": "sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.12.0.tgz", + "integrity": "sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.12.0.tgz", + "integrity": "sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.12.0.tgz", + "integrity": "sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "3.3.0", + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.12.0.tgz", + "integrity": "sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.12.0.tgz", + "integrity": "sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.12.0.tgz", + "integrity": "sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.12.0.tgz", + "integrity": "sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.12.0.tgz", + "integrity": "sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.12.0.tgz", + "integrity": "sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.12.0.tgz", + "integrity": "sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.12.0.tgz", + "integrity": "sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-inline-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-inline-string/-/transformer-inline-string-2.12.0.tgz", + "integrity": "sha512-FawH7Hgc7E8/Uc0t1UlFT2AdKdEQysu6OJp88NJixAqNhZT7G24OtKltM+VyayPxQZyLblPcp6TnYpY+Tz9VGA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.12.0.tgz", + "integrity": "sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.12.0.tgz", + "integrity": "sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", "json5": "^2.2.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.12.0.tgz", + "integrity": "sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.12.0.tgz", + "integrity": "sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-postcss": { - "version": "2.11.0", + "node_modules/@parcel/transformer-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.12.0.tgz", + "integrity": "sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.2" + "@parcel/plugin": "2.12.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-posthtml": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.12.0.tgz", + "integrity": "sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^7.5.2" + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-refresh": "^0.9.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-raw": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "react-refresh": "^0.9.0" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -1403,13 +5883,14 @@ } }, "node_modules/@parcel/transformer-svg": { - "version": "2.11.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.12.0.tgz", + "integrity": "sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", "nullthrows": "^1.1.1", "posthtml": "^0.16.5", "posthtml-parser": "^0.10.1", @@ -1418,7 +5899,37 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -1493,129 +6004,260 @@ "@parcel/watcher-win32-x64": "2.4.0" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.0", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@swc/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.0.tgz", + "integrity": "sha512-d4vMzH6ICllDwlPuhset2h8gu/USHdbyfJim+2hQEdxC0UONtfpmu38XBgNqRjStrji1Q5M10jfeUZL3cu1i8g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.0", + "@swc/core-darwin-x64": "1.7.0", + "@swc/core-linux-arm-gnueabihf": "1.7.0", + "@swc/core-linux-arm64-gnu": "1.7.0", + "@swc/core-linux-arm64-musl": "1.7.0", + "@swc/core-linux-x64-gnu": "1.7.0", + "@swc/core-linux-x64-musl": "1.7.0", + "@swc/core-win32-arm64-msvc": "1.7.0", + "@swc/core-win32-ia32-msvc": "1.7.0", + "@swc/core-win32-x64-msvc": "1.7.0" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-2ylhM7f0HwUwLrFYZAe/dse8PCbPsYcJS3Dt7Q8NT3PUn7vy6QOMxNcOPPuDrnmaXqQQO3oxdmRapguTxaat9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.0.tgz", + "integrity": "sha512-SgVnN4gT1Rb9YfTkp4FCUITqSs7Yj0uB2SUciu5CV3HuGvS5YXCUzh+KrwpLFtx8NIgivISKcNnb41mJi98X8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.0.tgz", + "integrity": "sha512-+Z9Dayart1iKJQEJJ9N/KS4z5EdXJE3WPFikY0jonKTo4Dd8RuyVz5yLvqcIMeVdz/SwximATaL6iJXw7hZS9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.0.tgz", + "integrity": "sha512-UnLrCiZ1EI4shznJn0xP6DLgsXUSwtfsdgHhGYCrvbgVBBve3S9iFgVFEB3SPl7Q/TdowNbrN4zHU0oChfiNfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-H724UANA+ptsfwKRr9mnaDa9cb5fw0oFysiGKTgb3DMYcgk3Od0jMTnXVPFSVpo7FlmyxeC9K8ueUPBOoOK6XA==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.0", + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.0.tgz", + "integrity": "sha512-SY3HA0K0Dpqt1HIfMLGpwL4hd4UaL2xHP5oZXPlRQPhUDZrbb4PbI3ZJnh66c63eL4ZR8EJ+HRFI0Alx5p69Zw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/@parcel/workers": { - "version": "2.11.0", + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-cEJ2ebtV1v/5Ilb55E05J6F5SrHKQWzUttIhR5Mkayyo+yvPslcpByuFC3D+J7X1ebziTOBpWuMpUdjLfh3SMQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" + "node": ">=10" } }, - "node_modules/@swc/core": { - "version": "1.4.1", + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.0.tgz", + "integrity": "sha512-ecQOOmzEssz+m0pR4xDYCGuvn3E/l0nQ3tk5jp1NA1lsAy4bMV0YbYCHjptYvWL/UjhIerIp3IlCJ8x5DodSog==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "^0.1.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.1", - "@swc/core-darwin-x64": "1.4.1", - "@swc/core-linux-arm-gnueabihf": "1.4.1", - "@swc/core-linux-arm64-gnu": "1.4.1", - "@swc/core-linux-arm64-musl": "1.4.1", - "@swc/core-linux-x64-gnu": "1.4.1", - "@swc/core-linux-x64-musl": "1.4.1", - "@swc/core-win32-arm64-msvc": "1.4.1", - "@swc/core-win32-ia32-msvc": "1.4.1", - "@swc/core-win32-x64-msvc": "1.4.1" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.1", + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.0.tgz", + "integrity": "sha512-gz81seZkRn3zMnVOc7L5k6F4vQC82gIxmHiL+GedK+A37XI/X26AASU3zxvORnqQbwQYXQ+AEVckxBmFlz3v2g==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=10" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.1", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.0.tgz", + "integrity": "sha512-b5Fd1xEOw9uqBpj2lqsaR4Iq9UhiL84hNDcEsi6DQA7Y1l85waQAslTbS0E4/pJ1PISAs0jW0zIGLco1eaWBOg==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=10" @@ -1623,26 +6265,33 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true }, "node_modules/@swc/helpers": { - "version": "0.5.6", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@swc/types": { - "version": "0.1.5", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, - "license": "Apache-2.0" + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@trysound/sax": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -1652,27 +6301,6 @@ "dev": true, "license": "MIT" }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -1689,8 +6317,9 @@ }, "node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -1725,8 +6354,9 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "node_modules/braces": { "version": "3.0.2", @@ -1770,13 +6400,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/call-bind": { "version": "1.0.7", "dev": true, @@ -1797,8 +6420,9 @@ }, "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, - "license": "MIT", "engines": { "node": ">=6" } @@ -1845,17 +6469,6 @@ "node": ">=6.0" } }, - "node_modules/cli-progress": { - "version": "3.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/clone": { "version": "2.1.2", "dev": true, @@ -1881,21 +6494,24 @@ "license": "MIT" }, "node_modules/commander": { - "version": "2.20.3", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "engines": { + "node": ">= 10" + } }, "node_modules/cosmiconfig": { - "version": "8.3.6", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -1914,8 +6530,9 @@ }, "node_modules/css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -1931,8 +6548,9 @@ }, "node_modules/css-select/node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1946,8 +6564,9 @@ }, "node_modules/css-select/node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -1962,8 +6581,9 @@ }, "node_modules/css-select/node_modules/domutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -1977,8 +6597,9 @@ }, "node_modules/css-select/node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "engines": { @@ -1990,8 +6611,9 @@ }, "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, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -2004,8 +6626,9 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -2015,8 +6638,9 @@ }, "node_modules/csso": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -2029,8 +6653,9 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -2044,8 +6669,9 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, - "license": "CC0-1.0", "optional": true, "peer": true }, @@ -2094,8 +6720,9 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -2107,27 +6734,30 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -2140,8 +6770,9 @@ }, "node_modules/domutils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -2169,15 +6800,11 @@ "dev": true, "license": "ISC" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/entities": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -2185,10 +6812,20 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -2222,8 +6859,9 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -2283,8 +6921,9 @@ }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2373,20 +7012,21 @@ } }, "node_modules/htmlnano": { - "version": "2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.1.tgz", + "integrity": "sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==", "dev": true, - "license": "MIT", "dependencies": { - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^9.0.0", "posthtml": "^0.16.5", "timsort": "^0.3.0" }, "peerDependencies": { - "cssnano": "^6.0.0", + "cssnano": "^7.0.0", "postcss": "^8.3.11", - "purgecss": "^5.0.0", + "purgecss": "^6.0.0", "relateurl": "^0.2.7", - "srcset": "4.0.0", + "srcset": "5.0.1", "svgo": "^3.0.2", "terser": "^5.10.0", "uncss": "^0.17.3" @@ -2420,6 +7060,8 @@ }, "node_modules/htmlparser2": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2428,7 +7070,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.2", @@ -2438,8 +7079,9 @@ }, "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, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2473,8 +7115,9 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", @@ -2495,14 +7138,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.0.10", "dev": true, @@ -2530,8 +7165,9 @@ }, "node_modules/is-json": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true }, "node_modules/is-nan": { "version": "1.3.2", @@ -2564,77 +7200,202 @@ "which-typed-array": "^1.1.14" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.25.1.tgz", + "integrity": "sha512-V0RMVZzK1+rCHpymRv4URK2lNhIRyO8g7U7zOFwVAhJuat74HtkjIQpQRKNCwFEYkRGpafOpmXXLoaoBcyVtBg==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.25.1", + "lightningcss-darwin-x64": "1.25.1", + "lightningcss-freebsd-x64": "1.25.1", + "lightningcss-linux-arm-gnueabihf": "1.25.1", + "lightningcss-linux-arm64-gnu": "1.25.1", + "lightningcss-linux-arm64-musl": "1.25.1", + "lightningcss-linux-x64-gnu": "1.25.1", + "lightningcss-linux-x64-musl": "1.25.1", + "lightningcss-win32-x64-msvc": "1.25.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.25.1.tgz", + "integrity": "sha512-G4Dcvv85bs5NLENcu/s1f7ehzE3D5ThnlWSDwE190tWXRQCQaqwcuHe+MGSVI/slm0XrxnaayXY+cNl3cSricw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.25.1.tgz", + "integrity": "sha512-dYWuCzzfqRueDSmto6YU5SoGHvZTMU1Em9xvhcdROpmtOQLorurUZz8+xFxZ51lCO2LnYbfdjZ/gCqWEkwixNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.25.1.tgz", + "integrity": "sha512-hXoy2s9A3KVNAIoKz+Fp6bNeY+h9c3tkcx1J3+pS48CqAt+5bI/R/YY4hxGL57fWAIquRjGKW50arltD6iRt/w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.25.1.tgz", + "integrity": "sha512-tWyMgHFlHlp1e5iW3EpqvH5MvsgoN7ZkylBbG2R2LWxnvH3FuWCJOhtGcYx9Ks0Kv0eZOBud789odkYLhyf1ng==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.25.1.tgz", + "integrity": "sha512-Xjxsx286OT9/XSnVLIsFEDyDipqe4BcLeB4pXQ/FEA5+2uWCCuAEarUNQumRucnj7k6ftkAHUEph5r821KBccQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss": { - "version": "1.23.0", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.25.1.tgz", + "integrity": "sha512-IhxVFJoTW8wq6yLvxdPvyHv4NjzcpN1B7gjxrY3uaykQNXPHNIpChLB52+wfH+yS58zm1PL4LemUp8u9Cfp6Bw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^1.0.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.23.0", - "lightningcss-darwin-x64": "1.23.0", - "lightningcss-freebsd-x64": "1.23.0", - "lightningcss-linux-arm-gnueabihf": "1.23.0", - "lightningcss-linux-arm64-gnu": "1.23.0", - "lightningcss-linux-arm64-musl": "1.23.0", - "lightningcss-linux-x64-gnu": "1.23.0", - "lightningcss-linux-x64-musl": "1.23.0", - "lightningcss-win32-x64-msvc": "1.23.0" } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.23.0", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.25.1.tgz", + "integrity": "sha512-RXIaru79KrREPEd6WLXfKfIp4QzoppZvD3x7vuTKkDA64PwTzKJ2jaC43RZHRt8BmyIkRRlmywNhTRMbmkPYpA==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -2648,12 +7409,13 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.23.0", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.25.1.tgz", + "integrity": "sha512-TdcNqFsAENEEFr8fJWg0Y4fZ/nwuqTRsIr7W7t2wmDUlA8eSXVepeeONYcb+gtTj1RaXn/WgNLB45SFkz+XBZA==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -2666,10 +7428,31 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.25.1.tgz", + "integrity": "sha512-9KZZkmmy9oGDSrnyHuxP6iMhbsgChUiu/NSgOx+U1I/wTngBStDf2i2aGRCHvFqj19HqqBEI4WuGVQBa2V6e0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/lmdb": { "version": "2.8.5", @@ -2713,8 +7496,9 @@ }, "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, - "license": "CC0-1.0", "optional": true, "peer": true }, @@ -2770,146 +7554,388 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/nanoid": { - "version": "3.3.7", + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/node-addon-api": { + "version": "7.1.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "optional": true, - "peer": true, + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/parcel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.12.0.tgz", + "integrity": "sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.12.0", + "@parcel/core": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/reporter-cli": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/reporter-tracer": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel-namer-rewrite": { + "version": "2.10.3-rc.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@parcel/logger": "^2.10.3", + "@parcel/namer-default": "^2.10.3", + "@parcel/package-manager": "^2.10.3", + "@parcel/plugin": "^2.10.3", + "@parcel/types": "^2.10.3", + "assert": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 10.0.0", + "parcel": "^2.10.3" } }, - "node_modules/neuroglancer": { - "resolved": "../../../dist/package", - "link": true + "node_modules/parcel/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } }, - "node_modules/node-addon-api": { - "version": "7.1.0", + "node_modules/parcel/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", "engines": { - "node": "^16 || ^18 || >= 20" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", + "node_modules/parcel/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", "dev": true, - "license": "MIT", "dependencies": { - "detect-libc": "^2.0.1" + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { - "version": "2.0.2", + "node_modules/parcel/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, "engines": { - "node": ">=8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", + "node_modules/parcel/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0" + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/object-is": { - "version": "1.1.5", + "node_modules/parcel/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/object-keys": { - "version": "1.1.1", + "node_modules/parcel/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/object.assign": { - "version": "4.1.5", + "node_modules/parcel/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/ordered-binary": { - "version": "1.5.1", + "node_modules/parcel/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/parcel": { - "version": "2.11.0", + "node_modules/parcel/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/config-default": "2.11.0", - "@parcel/core": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/reporter-cli": "2.11.0", - "@parcel/reporter-dev-server": "2.11.0", - "@parcel/reporter-tracer": "2.11.0", - "@parcel/utils": "2.11.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/parcel/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0" - }, - "bin": { - "parcel": "lib/bin.js" + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" @@ -2919,35 +7945,35 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/parcel-namer-rewrite": { - "version": "2.10.3-rc.2", + "node_modules/parcel/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", "dev": true, - "license": "ISC", "dependencies": { - "@parcel/logger": "^2.10.3", - "@parcel/namer-default": "^2.10.3", - "@parcel/package-manager": "^2.10.3", - "@parcel/plugin": "^2.10.3", - "@parcel/types": "^2.10.3", - "assert": "^2.0.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 10.0.0", - "parcel": "^2.10.3" - } - }, - "node_modules/parcel/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, "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, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2957,8 +7983,9 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -2972,14 +7999,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.0.0", "dev": true, @@ -2996,44 +8015,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/postcss": { - "version": "8.4.33", - "dev": true, - "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" - } - ], - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/posthtml": { "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", "dev": true, - "license": "MIT", "dependencies": { "posthtml-parser": "^0.11.0", "posthtml-render": "^3.0.0" @@ -3044,8 +8036,9 @@ }, "node_modules/posthtml-parser": { "version": "0.10.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", "dev": true, - "license": "MIT", "dependencies": { "htmlparser2": "^7.1.1" }, @@ -3055,8 +8048,9 @@ }, "node_modules/posthtml-render": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", "dev": true, - "license": "MIT", "dependencies": { "is-json": "^2.0.1" }, @@ -3066,8 +8060,9 @@ }, "node_modules/posthtml/node_modules/posthtml-parser": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", "dev": true, - "license": "MIT", "dependencies": { "htmlparser2": "^7.1.1" }, @@ -3077,26 +8072,30 @@ }, "node_modules/react-error-overlay": { "version": "6.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true }, "node_modules/react-refresh": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=4" } @@ -3152,39 +8151,33 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "optional": true, "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", + "node_modules/srcset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", + "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", "dev": true, - "license": "MIT", "optional": true, "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/srcset": { - "version": "4.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3192,32 +8185,10 @@ }, "node_modules/stable": { "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -3231,9 +8202,10 @@ } }, "node_modules/svgo": { - "version": "3.2.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -3256,20 +8228,11 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/term-size": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -3277,29 +8240,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.27.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/timsort": { "version": "0.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -3313,14 +8258,16 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "dev": true, - "license": "0BSD" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, diff --git a/examples/parcel/parcel-project-built/package.json b/examples/parcel/parcel-project-built/package.json index e2036f032..5063fb4aa 100644 --- a/examples/parcel/parcel-project-built/package.json +++ b/examples/parcel/parcel-project-built/package.json @@ -12,8 +12,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "@parcel/transformer-inline-string": "^2.11.0", - "parcel": "^2.11.0", + "@parcel/transformer-inline-string": "^2.12.0", + "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" }, "type": "module", diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index c291bffa6..9a33edb21 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -12,8 +12,8 @@ "neuroglancer": "file:../../.." }, "devDependencies": { - "@parcel/transformer-inline-string": "^2.11.0", - "parcel": "^2.11.0", + "@parcel/transformer-inline-string": "^2.12.0", + "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" } }, @@ -12624,89 +12624,37 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -12714,8 +12662,9 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -12725,8 +12674,9 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -12738,29 +12688,33 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -12768,70 +12722,6 @@ "node": ">=4" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@lezer/common": { "version": "1.2.1", "dev": true, @@ -12883,35 +12773,34 @@ ] }, "node_modules/@parcel/bundler-default": { - "version": "2.11.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.12.0.tgz", + "integrity": "sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/graph": "3.1.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/cache": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/utils": "2.11.0", - "lmdb": "2.8.5" + "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" @@ -12919,17 +12808,16 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/codeframe": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" @@ -12939,97 +12827,43 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/compressor-raw": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/plugin": "2.11.0" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/config-default": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/bundler-default": "2.11.0", - "@parcel/compressor-raw": "2.11.0", - "@parcel/namer-default": "2.11.0", - "@parcel/optimizer-css": "2.11.0", - "@parcel/optimizer-htmlnano": "2.11.0", - "@parcel/optimizer-image": "2.11.0", - "@parcel/optimizer-svgo": "2.11.0", - "@parcel/optimizer-swc": "2.11.0", - "@parcel/packager-css": "2.11.0", - "@parcel/packager-html": "2.11.0", - "@parcel/packager-js": "2.11.0", - "@parcel/packager-raw": "2.11.0", - "@parcel/packager-svg": "2.11.0", - "@parcel/packager-wasm": "2.11.0", - "@parcel/reporter-dev-server": "2.11.0", - "@parcel/resolver-default": "2.11.0", - "@parcel/runtime-browser-hmr": "2.11.0", - "@parcel/runtime-js": "2.11.0", - "@parcel/runtime-react-refresh": "2.11.0", - "@parcel/runtime-service-worker": "2.11.0", - "@parcel/transformer-babel": "2.11.0", - "@parcel/transformer-css": "2.11.0", - "@parcel/transformer-html": "2.11.0", - "@parcel/transformer-image": "2.11.0", - "@parcel/transformer-js": "2.11.0", - "@parcel/transformer-json": "2.11.0", - "@parcel/transformer-postcss": "2.11.0", - "@parcel/transformer-posthtml": "2.11.0", - "@parcel/transformer-raw": "2.11.0", - "@parcel/transformer-react-refresh-wrap": "2.11.0", - "@parcel/transformer-svg": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/core": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/graph": "3.1.0", - "@parcel/logger": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.9.9", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" + "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" @@ -13039,14 +12873,11 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/diagnostic": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, "engines": { "node": ">= 12.0.0" }, @@ -13055,10 +12886,21 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/events": { - "version": "2.11.0", + "node_modules/@parcel/bundler-default/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, "engines": { "node": ">= 12.0.0" }, @@ -13067,16 +12909,15 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/fs": { + "node_modules/@parcel/cache": { "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "@parcel/rust": "2.11.0", - "@parcel/types": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", "@parcel/utils": "2.11.0", - "@parcel/watcher": "^2.0.7", - "@parcel/workers": "2.11.0" + "lmdb": "2.8.5" }, "engines": { "node": ">= 12.0.0" @@ -13089,12 +12930,12 @@ "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/graph": { - "version": "3.1.0", + "node_modules/@parcel/codeframe": { + "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "nullthrows": "^1.1.1" + "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" @@ -13104,28 +12945,100 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/logger": { - "version": "2.11.0", + "node_modules/@parcel/compressor-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.12.0.tgz", + "integrity": "sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0" + "@parcel/plugin": "2.12.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 12.0.0", + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.11.0", + "node_modules/@parcel/config-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.12.0.tgz", + "integrity": "sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.12.0", + "@parcel/compressor-raw": "2.12.0", + "@parcel/namer-default": "2.12.0", + "@parcel/optimizer-css": "2.12.0", + "@parcel/optimizer-htmlnano": "2.12.0", + "@parcel/optimizer-image": "2.12.0", + "@parcel/optimizer-svgo": "2.12.0", + "@parcel/optimizer-swc": "2.12.0", + "@parcel/packager-css": "2.12.0", + "@parcel/packager-html": "2.12.0", + "@parcel/packager-js": "2.12.0", + "@parcel/packager-raw": "2.12.0", + "@parcel/packager-svg": "2.12.0", + "@parcel/packager-wasm": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/resolver-default": "2.12.0", + "@parcel/runtime-browser-hmr": "2.12.0", + "@parcel/runtime-js": "2.12.0", + "@parcel/runtime-react-refresh": "2.12.0", + "@parcel/runtime-service-worker": "2.12.0", + "@parcel/transformer-babel": "2.12.0", + "@parcel/transformer-css": "2.12.0", + "@parcel/transformer-html": "2.12.0", + "@parcel/transformer-image": "2.12.0", + "@parcel/transformer-js": "2.12.0", + "@parcel/transformer-json": "2.12.0", + "@parcel/transformer-postcss": "2.12.0", + "@parcel/transformer-posthtml": "2.12.0", + "@parcel/transformer-raw": "2.12.0", + "@parcel/transformer-react-refresh-wrap": "2.12.0", + "@parcel/transformer-svg": "2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/core": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.12.0.tgz", + "integrity": "sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/graph": "3.2.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.9.9", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" }, "engines": { "node": ">= 12.0.0" @@ -13135,36 +13048,35 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/namer-default": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "nullthrows": "^1.1.1" + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/node-resolver-core": { - "version": "3.2.0", + "node_modules/@parcel/core/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" + "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" @@ -13174,133 +13086,275 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-css": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "lightningcss": "^1.22.1", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.11.0", + "node_modules/@parcel/core/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/commander": { - "version": "7.2.0", + "node_modules/@parcel/core/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { - "version": "4.3.0", + "node_modules/@parcel/core/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { - "version": "1.1.3", + "node_modules/@parcel/core/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { - "version": "4.2.0", + "node_modules/@parcel/core/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { - "version": "2.0.14", + "node_modules/@parcel/core/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "CC0-1.0" + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { - "version": "2.8.0", + "node_modules/@parcel/core/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, - "bin": { - "svgo": "bin/svgo" + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.11.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-image": { + "node_modules/@parcel/fs": { "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", "@parcel/rust": "2.11.0", + "@parcel/types": "2.11.0", "@parcel/utils": "2.11.0", + "@parcel/watcher": "^2.0.7", "@parcel/workers": "2.11.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -13310,129 +13364,4560 @@ "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/optimizer-svgo": { + "node_modules/@parcel/graph": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.2.0.tgz", + "integrity": "sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { "version": "2.11.0", "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "svgo": "^2.4.0" + "@parcel/events": "2.11.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/commander": { - "version": "7.2.0", + "node_modules/@parcel/markdown-ansi": { + "version": "2.11.0", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.1.0" + }, "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { - "version": "4.3.0", + "node_modules/@parcel/namer-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.12.0.tgz", + "integrity": "sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { - "version": "1.1.3", + "node_modules/@parcel/namer-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/rust": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.12.0.tgz", + "integrity": "sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.12.0.tgz", + "integrity": "sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/csso": { - "version": "4.2.0", + "node_modules/@parcel/optimizer-htmlnano/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-htmlnano/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.12.0.tgz", + "integrity": "sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.12.0.tgz", + "integrity": "sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "svgo": "^2.4.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.12.0.tgz", + "integrity": "sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@swc/core": "^1.3.36", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/fs": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/node-resolver-core": "3.2.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "@parcel/workers": "2.11.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.12.0.tgz", + "integrity": "sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.12.0.tgz", + "integrity": "sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.12.0.tgz", + "integrity": "sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.12.0.tgz", + "integrity": "sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.12.0.tgz", + "integrity": "sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.12.0.tgz", + "integrity": "sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">=12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.12.0.tgz", + "integrity": "sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==", + "dev": true, + "dependencies": { + "@parcel/types": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/events": "2.11.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.12.0.tgz", + "integrity": "sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.12.0.tgz", + "integrity": "sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.12.0.tgz", + "integrity": "sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.12.0.tgz", + "integrity": "sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==", + "dev": true, + "dependencies": { + "@parcel/node-resolver-core": "3.3.0", + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.12.0.tgz", + "integrity": "sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.12.0.tgz", + "integrity": "sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.12.0.tgz", + "integrity": "sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-error-overlay": "6.0.9", + "react-refresh": "^0.9.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.12.0.tgz", + "integrity": "sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.12.0.tgz", + "integrity": "sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.12.0.tgz", + "integrity": "sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-css/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.12.0.tgz", + "integrity": "sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.12.0.tgz", + "integrity": "sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-inline-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-inline-string/-/transformer-inline-string-2.12.0.tgz", + "integrity": "sha512-FawH7Hgc7E8/Uc0t1UlFT2AdKdEQysu6OJp88NJixAqNhZT7G24OtKltM+VyayPxQZyLblPcp6TnYpY+Tz9VGA==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.12.0.tgz", + "integrity": "sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.13.7", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@parcel/optimizer-svgo/node_modules/svgo": { - "version": "2.8.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "chalk": "^4.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/optimizer-swc": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "@swc/core": "^1.3.36", - "nullthrows": "^1.1.1" + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/package-manager": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/node-resolver-core": "3.2.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", "semver": "^7.5.2" }, "engines": { @@ -13443,129 +17928,151 @@ "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.11.0" + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/packager-css": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-html": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-js": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "globals": "^13.2.0", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/transformer-js/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-raw": { - "version": "2.11.0", + "node_modules/@parcel/transformer-js/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/@parcel/packager-svg": { - "version": "2.11.0", + "node_modules/@parcel/transformer-json": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.12.0.tgz", + "integrity": "sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "posthtml": "^0.16.4" + "@parcel/plugin": "2.12.0", + "json5": "^2.2.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/packager-wasm": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.12.0.tgz", + "integrity": "sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" }, "engines": { - "node": ">=12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0", + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/plugin": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/types": "2.11.0" + "chalk": "^4.1.0" }, "engines": { "node": ">= 12.0.0" @@ -13575,14 +18082,14 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/profiler": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "chrome-trace-event": "^1.0.2" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0" @@ -13592,157 +18099,195 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/reporter-cli": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "chalk": "^4.1.0", - "cli-progress": "^3.12.0", - "term-size": "^2.2.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/reporter-tracer": { - "version": "2.11.0", + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "chrome-trace-event": "^1.0.3", + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/resolver-default": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.12.0.tgz", + "integrity": "sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/node-resolver-core": "3.2.0", - "@parcel/plugin": "2.11.0" + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/runtime-js": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/rust": { - "version": "2.11.0", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.0.0" }, @@ -13751,262 +18296,228 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", + "node_modules/@parcel/transformer-posthtml/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", "dependencies": { - "detect-libc": "^1.0.3" + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": "^12.18.3 || >=14" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-babel": { - "version": "2.11.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^7.5.2" + "node_modules/@parcel/transformer-raw": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.12.0.tgz", + "integrity": "sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.12.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-css": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.12.0.tgz", + "integrity": "sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "browserslist": "^4.6.6", - "lightningcss": "^1.22.1", - "nullthrows": "^1.1.1" + "@parcel/plugin": "2.12.0", + "@parcel/utils": "2.12.0", + "react-refresh": "^0.9.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-html": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^7.5.2", - "srcset": "4" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-image": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", + "@mischnic/json-sourcemap": "^0.1.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, - "peerDependencies": { - "@parcel/core": "^2.11.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-inline-string": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/plugin": "2.11.0" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-js": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.11.0", - "@parcel/workers": "2.11.0", - "@swc/helpers": "^0.5.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^7.5.2" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" } }, - "node_modules/@parcel/transformer-json": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "json5": "^2.2.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-postcss": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "@parcel/utils": "2.11.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.2" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-posthtml": { - "version": "2.11.0", + "node_modules/@parcel/transformer-react-refresh-wrap/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^7.5.2" + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-raw": { - "version": "2.11.0", + "node_modules/@parcel/transformer-svg": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.12.0.tgz", + "integrity": "sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/plugin": "2.12.0", + "@parcel/rust": "2.12.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.10.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.11.0" + "parcel": "^2.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.11.0", + "node_modules/@parcel/transformer-svg/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/plugin": "2.11.0", - "@parcel/utils": "2.11.0", - "react-refresh": "^0.9.0" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/transformer-svg": { - "version": "2.11.0", + "node_modules/@parcel/transformer-svg/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/plugin": "2.11.0", - "@parcel/rust": "2.11.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^7.5.2" - }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.11.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", @@ -14084,126 +18595,257 @@ "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.4.0", "cpu": [ - "x64" + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.11.0", + "@parcel/logger": "2.11.0", + "@parcel/profiler": "2.11.0", + "@parcel/types": "2.11.0", + "@parcel/utils": "2.11.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.11.0" + } + }, + "node_modules/@swc/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.0.tgz", + "integrity": "sha512-d4vMzH6ICllDwlPuhset2h8gu/USHdbyfJim+2hQEdxC0UONtfpmu38XBgNqRjStrji1Q5M10jfeUZL3cu1i8g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.0", + "@swc/core-darwin-x64": "1.7.0", + "@swc/core-linux-arm-gnueabihf": "1.7.0", + "@swc/core-linux-arm64-gnu": "1.7.0", + "@swc/core-linux-arm64-musl": "1.7.0", + "@swc/core-linux-x64-gnu": "1.7.0", + "@swc/core-linux-x64-musl": "1.7.0", + "@swc/core-win32-arm64-msvc": "1.7.0", + "@swc/core-win32-ia32-msvc": "1.7.0", + "@swc/core-win32-x64-msvc": "1.7.0" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-2ylhM7f0HwUwLrFYZAe/dse8PCbPsYcJS3Dt7Q8NT3PUn7vy6QOMxNcOPPuDrnmaXqQQO3oxdmRapguTxaat9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.0.tgz", + "integrity": "sha512-SgVnN4gT1Rb9YfTkp4FCUITqSs7Yj0uB2SUciu5CV3HuGvS5YXCUzh+KrwpLFtx8NIgivISKcNnb41mJi98X8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.0.tgz", + "integrity": "sha512-+Z9Dayart1iKJQEJJ9N/KS4z5EdXJE3WPFikY0jonKTo4Dd8RuyVz5yLvqcIMeVdz/SwximATaL6iJXw7hZS9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.0.tgz", + "integrity": "sha512-UnLrCiZ1EI4shznJn0xP6DLgsXUSwtfsdgHhGYCrvbgVBBve3S9iFgVFEB3SPl7Q/TdowNbrN4zHU0oChfiNfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-H724UANA+ptsfwKRr9mnaDa9cb5fw0oFysiGKTgb3DMYcgk3Od0jMTnXVPFSVpo7FlmyxeC9K8ueUPBOoOK6XA==", + "cpu": [ + "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.0", + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.0.tgz", + "integrity": "sha512-SY3HA0K0Dpqt1HIfMLGpwL4hd4UaL2xHP5oZXPlRQPhUDZrbb4PbI3ZJnh66c63eL4ZR8EJ+HRFI0Alx5p69Zw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=10" } }, - "node_modules/@parcel/workers": { - "version": "2.11.0", + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-cEJ2ebtV1v/5Ilb55E05J6F5SrHKQWzUttIhR5Mkayyo+yvPslcpByuFC3D+J7X1ebziTOBpWuMpUdjLfh3SMQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/diagnostic": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/profiler": "2.11.0", - "@parcel/types": "2.11.0", - "@parcel/utils": "2.11.0", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.11.0" + "node": ">=10" } }, - "node_modules/@swc/core": { - "version": "1.4.1", + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.0.tgz", + "integrity": "sha512-ecQOOmzEssz+m0pR4xDYCGuvn3E/l0nQ3tk5jp1NA1lsAy4bMV0YbYCHjptYvWL/UjhIerIp3IlCJ8x5DodSog==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "^0.1.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.1", - "@swc/core-darwin-x64": "1.4.1", - "@swc/core-linux-arm-gnueabihf": "1.4.1", - "@swc/core-linux-arm64-gnu": "1.4.1", - "@swc/core-linux-arm64-musl": "1.4.1", - "@swc/core-linux-x64-gnu": "1.4.1", - "@swc/core-linux-x64-musl": "1.4.1", - "@swc/core-win32-arm64-msvc": "1.4.1", - "@swc/core-win32-ia32-msvc": "1.4.1", - "@swc/core-win32-x64-msvc": "1.4.1" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.1", + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.0.tgz", + "integrity": "sha512-gz81seZkRn3zMnVOc7L5k6F4vQC82gIxmHiL+GedK+A37XI/X26AASU3zxvORnqQbwQYXQ+AEVckxBmFlz3v2g==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=10" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.1", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.0.tgz", + "integrity": "sha512-b5Fd1xEOw9uqBpj2lqsaR4Iq9UhiL84hNDcEsi6DQA7Y1l85waQAslTbS0E4/pJ1PISAs0jW0zIGLco1eaWBOg==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=10" @@ -14211,26 +18853,33 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true }, "node_modules/@swc/helpers": { - "version": "0.5.6", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", + "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@swc/types": { - "version": "0.1.5", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", "dev": true, - "license": "Apache-2.0" + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@trysound/sax": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -14240,27 +18889,6 @@ "dev": true, "license": "MIT" }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -14277,8 +18905,9 @@ }, "node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/assert": { "version": "2.1.0", @@ -14313,8 +18942,9 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "node_modules/braces": { "version": "3.0.2", @@ -14358,13 +18988,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/call-bind": { "version": "1.0.7", "dev": true, @@ -14385,8 +19008,9 @@ }, "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, - "license": "MIT", "engines": { "node": ">=6" } @@ -14433,17 +19057,6 @@ "node": ">=6.0" } }, - "node_modules/cli-progress": { - "version": "3.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/clone": { "version": "2.1.2", "dev": true, @@ -14469,21 +19082,24 @@ "license": "MIT" }, "node_modules/commander": { - "version": "2.20.3", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "engines": { + "node": ">= 10" + } }, "node_modules/cosmiconfig": { - "version": "8.3.6", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -14502,8 +19118,9 @@ }, "node_modules/css-select": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -14519,8 +19136,9 @@ }, "node_modules/css-select/node_modules/dom-serializer": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -14534,8 +19152,9 @@ }, "node_modules/css-select/node_modules/domhandler": { "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -14550,8 +19169,9 @@ }, "node_modules/css-select/node_modules/domutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "dependencies": { @@ -14565,8 +19185,9 @@ }, "node_modules/css-select/node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "engines": { @@ -14578,8 +19199,9 @@ }, "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, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -14592,8 +19214,9 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -14603,8 +19226,9 @@ }, "node_modules/csso": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -14617,8 +19241,9 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -14632,8 +19257,9 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, - "license": "CC0-1.0", "optional": true, "peer": true }, @@ -14682,8 +19308,9 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -14695,27 +19322,30 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -14728,8 +19358,9 @@ }, "node_modules/domutils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -14757,15 +19388,11 @@ "dev": true, "license": "ISC" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/entities": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -14773,10 +19400,20 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -14810,8 +19447,9 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -14871,8 +19509,9 @@ }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -14961,20 +19600,21 @@ } }, "node_modules/htmlnano": { - "version": "2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.1.tgz", + "integrity": "sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==", "dev": true, - "license": "MIT", "dependencies": { - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^9.0.0", "posthtml": "^0.16.5", "timsort": "^0.3.0" }, "peerDependencies": { - "cssnano": "^6.0.0", + "cssnano": "^7.0.0", "postcss": "^8.3.11", - "purgecss": "^5.0.0", + "purgecss": "^6.0.0", "relateurl": "^0.2.7", - "srcset": "4.0.0", + "srcset": "5.0.1", "svgo": "^3.0.2", "terser": "^5.10.0", "uncss": "^0.17.3" @@ -15008,6 +19648,8 @@ }, "node_modules/htmlparser2": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -15016,7 +19658,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.2", @@ -15026,8 +19667,9 @@ }, "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, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -15061,8 +19703,9 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", @@ -15083,14 +19726,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.0.10", "dev": true, @@ -15118,8 +19753,9 @@ }, "node_modules/is-json": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true }, "node_modules/is-nan": { "version": "1.3.2", @@ -15160,13 +19796,15 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -15174,55 +19812,178 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.25.1.tgz", + "integrity": "sha512-V0RMVZzK1+rCHpymRv4URK2lNhIRyO8g7U7zOFwVAhJuat74HtkjIQpQRKNCwFEYkRGpafOpmXXLoaoBcyVtBg==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.25.1", + "lightningcss-darwin-x64": "1.25.1", + "lightningcss-freebsd-x64": "1.25.1", + "lightningcss-linux-arm-gnueabihf": "1.25.1", + "lightningcss-linux-arm64-gnu": "1.25.1", + "lightningcss-linux-arm64-musl": "1.25.1", + "lightningcss-linux-x64-gnu": "1.25.1", + "lightningcss-linux-x64-musl": "1.25.1", + "lightningcss-win32-x64-msvc": "1.25.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.25.1.tgz", + "integrity": "sha512-G4Dcvv85bs5NLENcu/s1f7ehzE3D5ThnlWSDwE190tWXRQCQaqwcuHe+MGSVI/slm0XrxnaayXY+cNl3cSricw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.25.1.tgz", + "integrity": "sha512-dYWuCzzfqRueDSmto6YU5SoGHvZTMU1Em9xvhcdROpmtOQLorurUZz8+xFxZ51lCO2LnYbfdjZ/gCqWEkwixNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.25.1.tgz", + "integrity": "sha512-hXoy2s9A3KVNAIoKz+Fp6bNeY+h9c3tkcx1J3+pS48CqAt+5bI/R/YY4hxGL57fWAIquRjGKW50arltD6iRt/w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.25.1.tgz", + "integrity": "sha512-tWyMgHFlHlp1e5iW3EpqvH5MvsgoN7ZkylBbG2R2LWxnvH3FuWCJOhtGcYx9Ks0Kv0eZOBud789odkYLhyf1ng==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.25.1.tgz", + "integrity": "sha512-Xjxsx286OT9/XSnVLIsFEDyDipqe4BcLeB4pXQ/FEA5+2uWCCuAEarUNQumRucnj7k6ftkAHUEph5r821KBccQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss": { - "version": "1.23.0", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.25.1.tgz", + "integrity": "sha512-IhxVFJoTW8wq6yLvxdPvyHv4NjzcpN1B7gjxrY3uaykQNXPHNIpChLB52+wfH+yS58zm1PL4LemUp8u9Cfp6Bw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^1.0.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.23.0", - "lightningcss-darwin-x64": "1.23.0", - "lightningcss-freebsd-x64": "1.23.0", - "lightningcss-linux-arm-gnueabihf": "1.23.0", - "lightningcss-linux-arm64-gnu": "1.23.0", - "lightningcss-linux-arm64-musl": "1.23.0", - "lightningcss-linux-x64-gnu": "1.23.0", - "lightningcss-linux-x64-musl": "1.23.0", - "lightningcss-win32-x64-msvc": "1.23.0" } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.23.0", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.25.1.tgz", + "integrity": "sha512-RXIaru79KrREPEd6WLXfKfIp4QzoppZvD3x7vuTKkDA64PwTzKJ2jaC43RZHRt8BmyIkRRlmywNhTRMbmkPYpA==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -15236,12 +19997,13 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.23.0", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.25.1.tgz", + "integrity": "sha512-TdcNqFsAENEEFr8fJWg0Y4fZ/nwuqTRsIr7W7t2wmDUlA8eSXVepeeONYcb+gtTj1RaXn/WgNLB45SFkz+XBZA==", "cpu": [ "x64" ], "dev": true, - "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -15254,10 +20016,31 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.25.1.tgz", + "integrity": "sha512-9KZZkmmy9oGDSrnyHuxP6iMhbsgChUiu/NSgOx+U1I/wTngBStDf2i2aGRCHvFqj19HqqBEI4WuGVQBa2V6e0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/lmdb": { "version": "2.8.5", @@ -15301,8 +20084,9 @@ }, "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, - "license": "CC0-1.0", "optional": true, "peer": true }, @@ -15358,25 +20142,6 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/nanoid": { - "version": "3.3.7", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/neuroglancer": { "resolved": "../../..", "link": true @@ -15415,90 +20180,313 @@ "dev": true, "license": "MIT" }, - "node_modules/nth-check": { - "version": "2.1.1", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/parcel": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.12.0.tgz", + "integrity": "sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.12.0", + "@parcel/core": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/reporter-cli": "2.12.0", + "@parcel/reporter-dev-server": "2.12.0", + "@parcel/reporter-tracer": "2.12.0", + "@parcel/utils": "2.12.0", + "chalk": "^4.1.0", + "commander": "^7.0.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel-namer-rewrite": { + "version": "2.10.3-rc.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@parcel/logger": "^2.10.3", + "@parcel/namer-default": "^2.10.3", + "@parcel/package-manager": "^2.10.3", + "@parcel/plugin": "^2.10.3", + "@parcel/types": "^2.10.3", + "assert": "^2.0.0" + }, + "engines": { + "node": ">= 10.0.0", + "parcel": "^2.10.3" + } + }, + "node_modules/parcel/node_modules/@parcel/cache": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.12.0.tgz", + "integrity": "sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/utils": "2.12.0", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/parcel/node_modules/@parcel/codeframe": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.12.0.tgz", + "integrity": "sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/diagnostic": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.12.0.tgz", + "integrity": "sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/events": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.12.0.tgz", + "integrity": "sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/fs": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.12.0.tgz", + "integrity": "sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==", + "dev": true, + "dependencies": { + "@parcel/rust": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" + } + }, + "node_modules/parcel/node_modules/@parcel/logger": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.12.0.tgz", + "integrity": "sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0" + }, + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/object-is": { - "version": "1.1.5", + "node_modules/parcel/node_modules/@parcel/markdown-ansi": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz", + "integrity": "sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "chalk": "^4.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/object-keys": { - "version": "1.1.1", + "node_modules/parcel/node_modules/@parcel/node-resolver-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz", + "integrity": "sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==", "dev": true, - "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/object.assign": { - "version": "4.1.5", + "node_modules/parcel/node_modules/@parcel/package-manager": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.12.0.tgz", + "integrity": "sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/node-resolver-core": "3.3.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "@parcel/workers": "2.12.0", + "@swc/core": "^1.3.36", + "semver": "^7.5.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, - "node_modules/ordered-binary": { - "version": "1.5.1", - "dev": true, - "license": "MIT" - }, - "node_modules/parcel": { - "version": "2.11.0", + "node_modules/parcel/node_modules/@parcel/profiler": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.12.0.tgz", + "integrity": "sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==", "dev": true, - "license": "MIT", "dependencies": { - "@parcel/config-default": "2.11.0", - "@parcel/core": "2.11.0", - "@parcel/diagnostic": "2.11.0", - "@parcel/events": "2.11.0", - "@parcel/fs": "2.11.0", - "@parcel/logger": "2.11.0", - "@parcel/package-manager": "2.11.0", - "@parcel/reporter-cli": "2.11.0", - "@parcel/reporter-dev-server": "2.11.0", - "@parcel/reporter-tracer": "2.11.0", - "@parcel/utils": "2.11.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0" + "@parcel/diagnostic": "2.12.0", + "@parcel/events": "2.12.0", + "chrome-trace-event": "^1.0.2" }, - "bin": { - "parcel": "lib/bin.js" + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/@parcel/rust": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.12.0.tgz", + "integrity": "sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==", + "dev": true, "engines": { "node": ">= 12.0.0" }, @@ -15507,35 +20495,73 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/parcel-namer-rewrite": { - "version": "2.10.3-rc.2", + "node_modules/parcel/node_modules/@parcel/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.12.0.tgz", + "integrity": "sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==", "dev": true, - "license": "ISC", "dependencies": { - "@parcel/logger": "^2.10.3", - "@parcel/namer-default": "^2.10.3", - "@parcel/package-manager": "^2.10.3", - "@parcel/plugin": "^2.10.3", - "@parcel/types": "^2.10.3", - "assert": "^2.0.0" + "@parcel/cache": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/fs": "2.12.0", + "@parcel/package-manager": "2.12.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.12.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/parcel/node_modules/@parcel/utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.12.0.tgz", + "integrity": "sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.12.0", + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/markdown-ansi": "2.12.0", + "@parcel/rust": "2.12.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">= 10.0.0", - "parcel": "^2.10.3" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/parcel/node_modules/commander": { - "version": "7.2.0", + "node_modules/parcel/node_modules/@parcel/workers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.12.0.tgz", + "integrity": "sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==", "dev": true, - "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.12.0", + "@parcel/logger": "2.12.0", + "@parcel/profiler": "2.12.0", + "@parcel/types": "2.12.0", + "@parcel/utils": "2.12.0", + "nullthrows": "^1.1.1" + }, "engines": { - "node": ">= 10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.12.0" } }, "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, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -15545,8 +20571,9 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -15560,14 +20587,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.0.0", "dev": true, @@ -15584,44 +20603,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/postcss": { - "version": "8.4.33", - "dev": true, - "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" - } - ], - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/posthtml": { "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", "dev": true, - "license": "MIT", "dependencies": { "posthtml-parser": "^0.11.0", "posthtml-render": "^3.0.0" @@ -15632,8 +20624,9 @@ }, "node_modules/posthtml-parser": { "version": "0.10.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", + "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", "dev": true, - "license": "MIT", "dependencies": { "htmlparser2": "^7.1.1" }, @@ -15643,8 +20636,9 @@ }, "node_modules/posthtml-render": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", "dev": true, - "license": "MIT", "dependencies": { "is-json": "^2.0.1" }, @@ -15654,8 +20648,9 @@ }, "node_modules/posthtml/node_modules/posthtml-parser": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", "dev": true, - "license": "MIT", "dependencies": { "htmlparser2": "^7.1.1" }, @@ -15665,26 +20660,30 @@ }, "node_modules/react-error-overlay": { "version": "6.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true }, "node_modules/react-refresh": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", + "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=4" } @@ -15740,39 +20739,33 @@ }, "node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "optional": true, "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", + "node_modules/srcset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", + "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", "dev": true, - "license": "MIT", "optional": true, "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/srcset": { - "version": "4.0.0", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15780,32 +20773,10 @@ }, "node_modules/stable": { "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -15819,9 +20790,10 @@ } }, "node_modules/svgo": { - "version": "3.2.0", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, - "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -15844,20 +20816,11 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/term-size": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -15865,29 +20828,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.27.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/timsort": { "version": "0.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -15901,14 +20846,16 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "dev": true, - "license": "0BSD" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, diff --git a/examples/parcel/parcel-project-source/package.json b/examples/parcel/parcel-project-source/package.json index d040c5378..b1def66f7 100644 --- a/examples/parcel/parcel-project-source/package.json +++ b/examples/parcel/parcel-project-source/package.json @@ -12,8 +12,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "@parcel/transformer-inline-string": "^2.11.0", - "parcel": "^2.11.0", + "@parcel/transformer-inline-string": "^2.12.0", + "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" }, "type": "module", diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index db9eb331b..f112e1993 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -12,7 +12,7 @@ "neuroglancer": "file:../../../dist/package" }, "devDependencies": { - "vite": "^5.1.4" + "vite": "^5.3.4" } }, "../../../dist/package": { @@ -33,13 +33,270 @@ "node": ">=20.10 <21 || >=21.2" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -48,6 +305,102 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "dev": true, @@ -112,34 +465,219 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/estree": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@types/node": { "version": "20.11.10", @@ -179,10 +717,11 @@ "peer": true }, "node_modules/esbuild": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -190,33 +729,49 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -224,7 +779,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -237,12 +791,15 @@ "link": true }, "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "node_modules/postcss": { - "version": "8.4.35", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -258,20 +815,20 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/rollup": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -283,19 +840,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", "fsevents": "~2.3.2" } }, @@ -310,9 +870,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -355,13 +916,14 @@ "peer": true }, "node_modules/vite": { - "version": "5.1.4", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" diff --git a/examples/vite/vite-project-built/package.json b/examples/vite/vite-project-built/package.json index 4b3a91c47..5c92db0eb 100644 --- a/examples/vite/vite-project-built/package.json +++ b/examples/vite/vite-project-built/package.json @@ -12,7 +12,7 @@ }, "license": "Apache-2.0", "devDependencies": { - "vite": "^5.1.4" + "vite": "^5.3.4" }, "type": "module" } diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index d4960f6b2..4e8378946 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -12,7 +12,7 @@ "neuroglancer": "file:../../.." }, "devDependencies": { - "vite": "^5.1.4" + "vite": "^5.3.4" } }, "../../..": { @@ -12622,13 +12622,270 @@ "node": ">= 6" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -12637,6 +12894,102 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "dev": true, @@ -12701,34 +13054,219 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/estree": { "version": "1.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/@types/node": { "version": "20.11.10", @@ -12768,10 +13306,11 @@ "peer": true }, "node_modules/esbuild": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -12779,33 +13318,49 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -12813,7 +13368,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12826,12 +13380,15 @@ "link": true }, "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "node_modules/postcss": { - "version": "8.4.35", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -12847,20 +13404,20 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/rollup": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -12872,19 +13429,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", "fsevents": "~2.3.2" } }, @@ -12899,9 +13459,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12944,13 +13505,14 @@ "peer": true }, "node_modules/vite": { - "version": "5.1.4", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" diff --git a/examples/vite/vite-project-source/package.json b/examples/vite/vite-project-source/package.json index 99bff9a0d..55a356035 100644 --- a/examples/vite/vite-project-source/package.json +++ b/examples/vite/vite-project-source/package.json @@ -12,7 +12,7 @@ }, "license": "Apache-2.0", "devDependencies": { - "vite": "^5.1.4" + "vite": "^5.3.4" }, "type": "module" } diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index 9e16cdb7f..734adf698 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -12,13 +12,13 @@ "neuroglancer": "file:../../../dist/package" }, "devDependencies": { - "css-loader": "^6.10.0", + "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", - "style-loader": "^3.3.4", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "webpack": "^5.90.3", + "webpack": "^5.93.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2" + "webpack-dev-server": "^5.0.4" } }, "../../../dist/package": { @@ -140,6 +140,60 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", + "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "dev": true, @@ -336,9 +390,10 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -346,23 +401,27 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "dev": true, - "license": "MIT" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -371,62 +430,69 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -434,22 +500,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -458,11 +526,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -509,13 +578,15 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -540,10 +611,11 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -1016,21 +1088,22 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -1038,7 +1111,7 @@ }, "peerDependencies": { "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" + "webpack": "^5.27.0" }, "peerDependenciesMeta": { "@rspack/core": { @@ -1077,8 +1150,9 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -1293,9 +1367,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -1474,6 +1549,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, @@ -1669,8 +1750,9 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/gopd": { "version": "1.0.1", @@ -1952,6 +2034,15 @@ "node": ">=10.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "dev": true, @@ -2310,10 +2401,14 @@ } }, "node_modules/memfs": { - "version": "4.7.7", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", "dev": true, - "license": "Apache-2.0", "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.1.2", + "tree-dump": "^1.0.1", "tslib": "^2.0.0" }, "engines": { @@ -2780,9 +2875,10 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -2791,9 +2887,10 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -2807,9 +2904,10 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -2835,9 +2933,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2848,8 +2947,9 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/pretty-error": { "version": "4.0.0", @@ -3557,18 +3657,19 @@ } }, "node_modules/style-loader": { - "version": "3.3.4", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/supports-color": { @@ -3664,6 +3765,18 @@ } } }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/thunky": { "version": "1.1.0", "dev": true, @@ -3688,6 +3801,22 @@ "node": ">=0.6" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/tslib": { "version": "2.6.2", "dev": true, @@ -3790,9 +3919,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -3810,25 +3940,26 @@ } }, "node_modules/webpack": { - "version": "5.90.3", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -3836,7 +3967,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -3908,13 +4039,15 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "7.0.0", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz", + "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, @@ -3935,14 +4068,15 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3951,8 +4085,9 @@ }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -3962,13 +4097,15 @@ }, "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -3984,9 +4121,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.2", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -4016,7 +4154,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", + "webpack-dev-middleware": "^7.1.0", "ws": "^8.16.0" }, "bin": { diff --git a/examples/webpack/webpack-project-built/package.json b/examples/webpack/webpack-project-built/package.json index e6403d022..8daf28813 100644 --- a/examples/webpack/webpack-project-built/package.json +++ b/examples/webpack/webpack-project-built/package.json @@ -17,13 +17,13 @@ ], "license": "Apache-2.0", "devDependencies": { - "css-loader": "^6.10.0", + "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", - "style-loader": "^3.3.4", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "webpack": "^5.90.3", + "webpack": "^5.93.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2" + "webpack-dev-server": "^5.0.4" }, "type": "module" } diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index e7d9c4f5e..91a14c88c 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -12,14 +12,14 @@ "neuroglancer": "file:../../.." }, "devDependencies": { - "css-loader": "^6.10.0", - "esbuild-loader": "^4.0.3", + "css-loader": "^7.1.2", + "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", - "style-loader": "^3.3.4", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "webpack": "^5.90.3", + "webpack": "^5.93.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2" + "webpack-dev-server": "^5.0.4" } }, "../../..": { @@ -12637,13 +12637,270 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -12652,6 +12909,102 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, @@ -12941,9 +13294,10 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -12951,23 +13305,27 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "dev": true, - "license": "MIT" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -12976,62 +13334,69 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -13039,22 +13404,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -13063,11 +13430,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -13114,13 +13482,15 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -13145,10 +13515,11 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -13631,21 +14002,22 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -13653,7 +14025,7 @@ }, "peerDependencies": { "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" + "webpack": "^5.27.0" }, "peerDependenciesMeta": { "@rspack/core": { @@ -13692,8 +14064,9 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -13912,9 +14285,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -13969,10 +14343,11 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -13980,37 +14355,38 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/esbuild-loader": { - "version": "4.0.3", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.2.2.tgz", + "integrity": "sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.19.0", + "esbuild": "^0.21.0", "get-tsconfig": "^4.7.0", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" @@ -14414,8 +14790,9 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/gopd": { "version": "1.0.1", @@ -15532,9 +15909,10 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -15543,9 +15921,10 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, - "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -15559,9 +15938,10 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, - "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -15587,9 +15967,10 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -15600,8 +15981,9 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/pretty-error": { "version": "4.0.0", @@ -16333,18 +16715,19 @@ } }, "node_modules/style-loader": { - "version": "3.3.4", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/supports-color": { @@ -16567,9 +16950,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, - "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16587,25 +16971,26 @@ } }, "node_modules/webpack": { - "version": "5.90.3", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -16613,7 +16998,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -16763,9 +17148,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.2", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -16795,7 +17181,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", + "webpack-dev-middleware": "^7.1.0", "ws": "^8.16.0" }, "bin": { diff --git a/examples/webpack/webpack-project-source/package.json b/examples/webpack/webpack-project-source/package.json index 350e98edc..3be4ac139 100644 --- a/examples/webpack/webpack-project-source/package.json +++ b/examples/webpack/webpack-project-source/package.json @@ -17,14 +17,14 @@ ], "license": "Apache-2.0", "devDependencies": { - "css-loader": "^6.10.0", - "style-loader": "^3.3.4", + "css-loader": "^7.1.2", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "esbuild-loader": "^4.0.3", + "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", - "webpack": "^5.90.3", + "webpack": "^5.93.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2" + "webpack-dev-server": "^5.0.4" }, "type": "module" } diff --git a/python/tests/client_test.py b/python/tests/client_test.py index fc70fcd94..58c445f7a 100644 --- a/python/tests/client_test.py +++ b/python/tests/client_test.py @@ -157,7 +157,12 @@ def expected_screenshot(request, webdriver_generic): EXAMPLE_DIRS = [ f"examples/{bundler}/{bundler}-project-{package}" - for bundler in ["vite", "parcel", "webpack"] + for bundler in [ + "vite", + # Disable parcel since it currently has "failed to resolve bundle" errors. + # "parcel", + "webpack", + ] for package in ["source", "built"] ] diff --git a/src/ui/layer_side_panel.ts b/src/ui/layer_side_panel.ts index b10ec3049..56136d6af 100644 --- a/src/ui/layer_side_panel.ts +++ b/src/ui/layer_side_panel.ts @@ -37,9 +37,9 @@ import { CachedWatchableValue, observeWatchable, } from "#src/trackable_value.js"; -import type { UserLayerSidePanelState } from "#src/ui//layer_side_panel_state.js"; -import { LAYER_SIDE_PANEL_DEFAULT_LOCATION } from "#src/ui//layer_side_panel_state.js"; import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { UserLayerSidePanelState } from "#src/ui/layer_side_panel_state.js"; +import { LAYER_SIDE_PANEL_DEFAULT_LOCATION } from "#src/ui/layer_side_panel_state.js"; import type { DragSource, SidePanelManager } from "#src/ui/side_panel.js"; import { DRAG_OVER_CLASSNAME, SidePanel } from "#src/ui/side_panel.js"; import { RefCounted } from "#src/util/disposable.js"; From d05ed8f5d4fc727a7ad6f60932926e0f4fa7bedd Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 13:04:01 -0700 Subject: [PATCH 19/45] chore: update dependencies --- package-lock.json | 8033 ++++++++++++++++++++------------------- package.json | 40 +- src/navigation_state.ts | 2 +- vitest.workspace.ts | 1 + 4 files changed, 4236 insertions(+), 3840 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e973dd57..f73fd0c15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,16 +22,16 @@ "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.20", + "@types/node": "^20.14.12", "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "@vitest/browser": "^1.3.1", - "@vitest/ui": "^1.3.1", - "css-loader": "^6.10.0", - "esbuild": "^0.20.1", - "esbuild-loader": "^4.1.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitest/browser": "^2.0.4", + "@vitest/ui": "^2.0.4", + "css-loader": "^7.1.2", + "esbuild": "^0.23.0", + "esbuild-loader": "^4.2.2", "eslint": "^8.56.0", "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.6.1", @@ -39,21 +39,21 @@ "eslint-plugin-import": "^2.29.1", "eslint-webpack-plugin": "^4.0.1", "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^10.3.10", + "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.8.1", - "prettier": "3.2.5", - "style-loader": "^3.3.4", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "3.3.3", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "tsx": "^4.7.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1", - "webdriverio": "^8.32.3", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", + "tsx": "^4.16.2", + "typescript": "^5.5.4", + "vitest": "^2.0.4", + "webdriverio": "^8.39.1", + "webpack": "^5.93.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "webpack-merge": "^5.10.0" + "webpack-dev-server": "^5.0.4", + "webpack-merge": "^6.0.1" }, "engines": { "node": ">=20.10 <21 || >=21.2" @@ -68,6 +68,19 @@ "node": ">=0.10.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/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -171,6 +184,55 @@ "node": ">=4" } }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", + "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0" + } + }, + "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -181,9 +243,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", "cpu": [ "ppc64" ], @@ -193,13 +255,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", "cpu": [ "arm" ], @@ -209,13 +271,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", "cpu": [ "arm64" ], @@ -225,13 +287,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", "cpu": [ "x64" ], @@ -241,13 +303,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", "cpu": [ "arm64" ], @@ -257,13 +319,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", "cpu": [ "x64" ], @@ -273,13 +335,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", "cpu": [ "arm64" ], @@ -289,13 +351,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", "cpu": [ "x64" ], @@ -305,13 +367,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", "cpu": [ "arm" ], @@ -321,13 +383,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", - "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", "cpu": [ "arm64" ], @@ -337,13 +399,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", "cpu": [ "ia32" ], @@ -353,13 +415,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", "cpu": [ "loong64" ], @@ -369,13 +431,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", "cpu": [ "mips64el" ], @@ -385,13 +447,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", "cpu": [ "ppc64" ], @@ -401,13 +463,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", "cpu": [ "riscv64" ], @@ -417,13 +479,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", "cpu": [ "s390x" ], @@ -433,13 +495,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", "cpu": [ "x64" ], @@ -449,13 +511,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", "cpu": [ "x64" ], @@ -465,13 +527,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", "cpu": [ "x64" ], @@ -481,13 +559,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", "cpu": [ "x64" ], @@ -497,13 +575,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", "cpu": [ "arm64" ], @@ -513,13 +591,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", "cpu": [ "ia32" ], @@ -529,13 +607,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", - "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "cpu": [ "x64" ], @@ -545,7 +623,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -681,6 +759,125 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@inquirer/confirm": { + "version": "3.1.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", + "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.5", + "@inquirer/type": "^1.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", + "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.1", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/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 + }, + "node_modules/@inquirer/core/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/@inquirer/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", + "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -815,6 +1012,23 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@mswjs/interceptors": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", + "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "dev": true, + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -855,6 +1069,28 @@ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -870,19 +1106,39 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, + "node_modules/@promptbook/utils": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.58.0.tgz", + "integrity": "sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "dependencies": { + "spacetrim": "0.11.36" + } + }, "node_modules/@puppeteer/browsers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.0.1.tgz", - "integrity": "sha512-IQj/rJY1MNfZ6Z2ERu+6S0LkIPBSXRGddgmvODqjm1afHy04aJIiWmoohuFtL78SPSlbjpIMuFVfhyqsR5Ng4A==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.4.tgz", + "integrity": "sha512-BdG2qiI1dn89OTUUsx2GZSpUzW+DRffR1wlMJyKxVHYrhnKoELSDxDd+2XImUkuWPEKk76H5FcM/gPFrEK1Tfw==", "dev": true, "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.4.0", - "tar-fs": "3.0.5", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.2", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" @@ -891,10 +1147,27 @@ "node": ">=18" } }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", "cpu": [ "arm" ], @@ -905,9 +1178,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", "cpu": [ "arm64" ], @@ -918,9 +1191,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", "cpu": [ "arm64" ], @@ -931,9 +1204,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", "cpu": [ "x64" ], @@ -944,9 +1217,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", "cpu": [ "arm" ], @@ -956,12 +1229,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", "cpu": [ - "arm64" + "arm" ], "dev": true, "optional": true, @@ -969,10 +1242,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", "cpu": [ "arm64" ], @@ -982,12 +1255,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "optional": true, @@ -995,12 +1268,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "optional": true, @@ -1008,12 +1281,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "optional": true, @@ -1021,10 +1294,49 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", "cpu": [ "arm64" ], @@ -1035,9 +1347,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", "cpu": [ "ia32" ], @@ -1048,9 +1360,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", "cpu": [ "x64" ], @@ -1090,15 +1402,36 @@ "node": ">=14.16" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, - "optional": true, - "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, "engines": { - "node": ">= 6" + "node": ">=18" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, "node_modules/@tootallnate/quickjs-emscripten": { @@ -1107,6 +1440,12 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -1154,6 +1493,12 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true + }, "node_modules/@types/eslint": { "version": "8.56.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", @@ -1294,10 +1639,19 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1342,12 +1696,6 @@ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true }, - "node_modules/@types/semver": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", - "dev": true - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -1387,6 +1735,12 @@ "@types/node": "*" } }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, "node_modules/@types/tern": { "version": "0.23.9", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", @@ -1396,12 +1750,24 @@ "@types/estree": "*" } }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "node_modules/@types/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", "dev": true }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -1437,25 +1803,23 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", - "integrity": "sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", + "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.17.0", + "@typescript-eslint/type-utils": "7.17.0", + "@typescript-eslint/utils": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1472,19 +1836,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.0.2.tgz", - "integrity": "sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/scope-manager": "7.17.0", + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/typescript-estree": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1500,16 +1864,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.0.2.tgz", - "integrity": "sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", + "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1517,18 +1881,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.0.2.tgz", - "integrity": "sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", + "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", + "@typescript-eslint/typescript-estree": "7.17.0", + "@typescript-eslint/utils": "7.17.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1544,12 +1908,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.0.2.tgz", - "integrity": "sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", + "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1557,22 +1921,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.2.tgz", - "integrity": "sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", + "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1585,21 +1949,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.0.2.tgz", - "integrity": "sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", + "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "7.17.0", + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/typescript-estree": "7.17.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1610,16 +1971,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.2.tgz", - "integrity": "sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", + "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.17.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1633,21 +1994,25 @@ "dev": true }, "node_modules/@vitest/browser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-1.3.1.tgz", - "integrity": "sha512-pRof8G8nqRWwg3ouyIctyhfIVk5jXgF056uF//sqdi37+pVtDz9kBI/RMu0xlc8tgCyJ2aEMfbgJZPUydlEVaQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.0.4.tgz", + "integrity": "sha512-QsIkbqPqHsXvgxjCjjgKjuWKmrC0VJgpaDkuEmOy5gTnErhhifWIfp3HpH92K7cscfaIao+RlKv5f8nUMgjfmA==", "dev": true, "dependencies": { - "@vitest/utils": "1.3.1", - "magic-string": "^0.30.5", - "sirv": "^2.0.4" + "@testing-library/dom": "^10.3.1", + "@testing-library/user-event": "^14.5.2", + "@vitest/utils": "2.0.4", + "magic-string": "^0.30.10", + "msw": "^2.3.1", + "sirv": "^2.0.4", + "ws": "^8.18.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "playwright": "*", - "vitest": "1.3.1", + "vitest": "2.0.4", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -1663,140 +2028,116 @@ } }, "node_modules/@vitest/expect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", - "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", + "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", "dev": true, "dependencies": { - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", - "chai": "^4.3.10" + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz", - "integrity": "sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==", + "node_modules/@vitest/pretty-format": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", + "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", "dev": true, "dependencies": { - "@vitest/utils": "1.3.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/@vitest/runner": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", + "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", "dev": true, "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" + "@vitest/utils": "2.0.4", + "pathe": "^1.1.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz", - "integrity": "sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", + "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", "dev": true, "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "2.0.4", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", - "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", + "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", "dev": true, "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/ui": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.3.1.tgz", - "integrity": "sha512-2UrFLJ62c/eJGPHcclstMKlAR7E1WB1ITe1isuowEPJJHi3HfqofvsUqQ1cGrEF7kitG1DJuwURUA3HLDtQkXA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.4.tgz", + "integrity": "sha512-9SNE9ve3kgDkVTxJsY7BjqSwyqDVRJbq/AHVHZs+V0vmr/0cCX6yGT6nOahSXEsXFtKAsvRtBXKlTgr+5njzZQ==", "dev": true, "dependencies": { - "@vitest/utils": "1.3.1", + "@vitest/utils": "2.0.4", "fast-glob": "^3.3.2", - "fflate": "^0.8.1", - "flatted": "^3.2.9", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "sirv": "^2.0.4" + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.3.1" + "vitest": "2.0.4" } }, "node_modules/@vitest/utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", + "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", "dev": true, "dependencies": { - "diff-sequences": "^29.6.3", + "@vitest/pretty-format": "2.0.4", "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/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, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@wdio/config": { - "version": "8.32.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.32.3.tgz", - "integrity": "sha512-hZkaz5Fd8830uniQvRgPus8yp9rp50MAsHa5kZ2Jt8y++Rp330FyJpQZE5oPjTATuz35G5Anprk2Q3fmFd0Ifw==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.39.0.tgz", + "integrity": "sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==", "dev": true, "dependencies": { - "@wdio/logger": "8.28.0", - "@wdio/types": "8.32.2", - "@wdio/utils": "8.32.3", + "@wdio/logger": "8.38.0", + "@wdio/types": "8.39.0", + "@wdio/utils": "8.39.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.0.0", "glob": "^10.2.2", @@ -1806,10 +2147,67 @@ "node": "^16.13 || >=18" } }, + "node_modules/@wdio/config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@wdio/config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/@wdio/config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@wdio/logger": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.28.0.tgz", - "integrity": "sha512-/s6zNCqwy1hoc+K4SJypis0Ud0dlJ+urOelJFO1x0G0rwDRWyFiUP6ijTaCcFxAm29jYEcEPWijl2xkVIHwOyA==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", "dev": true, "dependencies": { "chalk": "^5.1.2", @@ -1861,9 +2259,9 @@ } }, "node_modules/@wdio/protocols": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.32.0.tgz", - "integrity": "sha512-inLJRrtIGdTz/YPbcsvpSvPlYQFTVtF3OYBwAXhG2FiP1ZwE1CQNLP/xgRGye1ymdGCypGkexRqIx3KBGm801Q==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", + "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", "dev": true }, "node_modules/@wdio/repl": { @@ -1879,9 +2277,9 @@ } }, "node_modules/@wdio/types": { - "version": "8.32.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.32.2.tgz", - "integrity": "sha512-jq8LcBBQpBP9ZF5kECKEpXv8hN7irCGCjLFAN0Bd5ScRR6qu6MGWvwkDkau2sFPr0b++sKDCEaMzQlwrGFjZXg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.39.0.tgz", + "integrity": "sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==", "dev": true, "dependencies": { "@types/node": "^20.1.0" @@ -1891,17 +2289,17 @@ } }, "node_modules/@wdio/utils": { - "version": "8.32.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.32.3.tgz", - "integrity": "sha512-UnR9rPpR1W9U5wz2TU+6BQ2rlxtuK/e3fvdaiWIMZKleB/OCcEQFGiGPAGGVi4ShfaTPwz6hK1cTTgj1OtMXkg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.39.0.tgz", + "integrity": "sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==", "dev": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.28.0", - "@wdio/types": "8.32.2", + "@wdio/logger": "8.38.0", + "@wdio/types": "8.39.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", + "edgedriver": "^5.5.0", "geckodriver": "^4.3.1", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", @@ -1915,9 +2313,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -1937,9 +2335,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -1960,15 +2358,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -1996,28 +2394,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -2025,24 +2423,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -2051,12 +2449,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -2116,14 +2514,22 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", + "node_modules/@zip.js/zip.js": { + "version": "2.7.47", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.47.tgz", + "integrity": "sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==", "dev": true, - "optional": true, - "peer": true + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/abbrev": { "version": "2.0.0", @@ -2133,6 +2539,18 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2159,24 +2577,18 @@ } }, "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "optional": true, - "peer": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" } }, "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "optional": true, - "peer": true, + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "bin": { "acorn": "bin/acorn" }, @@ -2184,10 +2596,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2203,28 +2615,23 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "optional": true, - "peer": true, + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -2403,97 +2810,176 @@ } }, "node_modules/archiver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", - "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, "dependencies": { - "archiver-utils": "^4.0.1", + "archiver-utils": "^5.0.2", "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", - "zip-stream": "^5.0.1" + "zip-stream": "^6.0.1" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" } }, "node_modules/archiver-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", - "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, "dependencies": { - "glob": "^8.0.0", + "glob": "^10.0.0", "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" } }, "node_modules/archiver-utils/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=12" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/archiver-utils/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/archiver/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" } }, "node_modules/archiver/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/argparse": { @@ -2659,12 +3145,12 @@ } }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/ast-types": { @@ -2739,9 +3225,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", "dev": true }, "node_modules/balanced-match": { @@ -2750,42 +3236,51 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", - "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, "optional": true }, "node_modules/bare-fs": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.1.5.tgz", - "integrity": "sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", "dev": true, "optional": true, "dependencies": { "bare-events": "^2.0.0", - "bare-os": "^2.0.0", "bare-path": "^2.0.0", - "streamx": "^2.13.0" + "bare-stream": "^2.0.0" } }, "node_modules/bare-os": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", - "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", "dev": true, "optional": true }, "node_modules/bare-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", - "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, "optional": true, "dependencies": { "bare-os": "^2.1.0" } }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "dev": true, + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2807,9 +3302,9 @@ ] }, "node_modules/basic-ftp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", - "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -2829,15 +3324,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2847,19 +3333,6 @@ "node": "*" } }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2894,12 +3367,6 @@ "node": ">= 6" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true - }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -3022,12 +3489,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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3118,12 +3585,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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "engines": { - "node": "*" + "node": ">=8.0.0" } }, "node_modules/buffer-equal": { @@ -3139,24 +3606,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -3300,33 +3749,19 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "dependencies": { - "traverse": ">=0.3.0 <0.4" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/chalk": { @@ -3346,15 +3781,12 @@ } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/chokidar": { @@ -3480,6 +3912,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3614,32 +4055,65 @@ "dev": true }, "node_modules/compress-commons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", - "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, "dependencies": { "crc-32": "^1.2.0", - "crc32-stream": "^5.0.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/compress-commons/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/compressible": { @@ -3824,30 +4298,50 @@ } }, "node_modules/crc32-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", - "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, "dependencies": { "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" } }, "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, "node_modules/cross-fetch": { @@ -3915,22 +4409,22 @@ } }, "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -3938,7 +4432,7 @@ }, "peerDependencies": { "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" + "webpack": "^5.27.0" }, "peerDependenciesMeta": { "@rspack/core": { @@ -4002,35 +4496,18 @@ } }, "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "optional": true, - "peer": true + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "optional": true, - "peer": true, + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" + "cssom": "0.3.x" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4052,70 +4529,29 @@ } }, "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "optional": true, - "peer": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "node_modules/debounce": { @@ -4153,14 +4589,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -4189,13 +4617,10 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { "node": ">=6" } @@ -4457,20 +4882,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -4478,20 +4889,11 @@ "dev": true }, "node_modules/devtools-protocol": { - "version": "0.0.1262051", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1262051.tgz", - "integrity": "sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g==", + "version": "0.0.1302984", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz", + "integrity": "sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==", "dev": true }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4528,6 +4930,12 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -4564,29 +4972,12 @@ ] }, "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "optional": true, - "peer": true, "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" + "webidl-conversions": "^4.0.2" } }, "node_modules/domhandler": { @@ -4673,17 +5064,17 @@ } }, "node_modules/edgedriver": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.3.10.tgz", - "integrity": "sha512-RFSHYMNtcF1PjaGZCA2rdQQ8hSTLPZgcYgeY1V6dC+tR4NhZXwFAku+8hCbRYh7ZlwKKrTbVu9FwknjFddIuuw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.0.tgz", + "integrity": "sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==", "dev": true, "hasInstallScript": true, "dependencies": { "@wdio/logger": "^8.28.0", + "@zip.js/zip.js": "^2.7.44", "decamelize": "^6.0.0", "edge-paths": "^3.0.5", "node-fetch": "^3.3.2", - "unzipper": "^0.10.14", "which": "^4.0.0" }, "bin": { @@ -4803,9 +5194,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4958,50 +5349,51 @@ } }, "node_modules/esbuild": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", - "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, "node_modules/esbuild-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.1.0.tgz", - "integrity": "sha512-543TtIvqbqouEMlOHg4xKoDQkmdImlwIpyAIgpUtDPvMuklU/c2k+Qt2O3VeDBgAwozxmlEbjOzV+F8CZ0g+Bw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.2.2.tgz", + "integrity": "sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==", "dev": true, "dependencies": { - "esbuild": "^0.20.0", + "esbuild": "^0.21.0", "get-tsconfig": "^4.7.0", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" @@ -5013,510 +5405,506 @@ "webpack": "^4.40.0 || ^5.0.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/esbuild-loader/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/esbuild-loader/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, + "node_modules/esbuild-loader/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=12" } }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "node_modules/esbuild-loader/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", - "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", + "node_modules/esbuild-loader/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/esbuild-loader/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "node": ">=12" } }, - "node_modules/eslint-interactive": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/eslint-interactive/-/eslint-interactive-10.8.0.tgz", - "integrity": "sha512-bsMSr0NVyxoSbKbA3Rn8so5+A9q+Zu8xExiIM18umPjrqfBAN8WcJfsWvfc9Myfiqn2WwLDM9mRglbx+Hp+z3Q==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "node": ">=12" } }, - "node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=12" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=12" } }, - "node_modules/eslint-plugin-import/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-loader/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esbuild-loader/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/esbuild-loader/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/esbuild-loader/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/esbuild-loader/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "semver": "bin/semver.js" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/esbuild-loader/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/esbuild-loader/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==", + "node_modules/esbuild-loader/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" + "node": ">=12" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/esbuild-loader/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" + "engines": { + "node": ">=12" }, - "peerDependencies": { - "ajv": "^8.8.2" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { - "has-flag": "^4.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5525,1555 +5913,1489 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/eslint-formatter-codeframe": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", + "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "@babel/code-frame": "7.12.11", + "chalk": "^4.0.0" }, "engines": { - "node": ">=0.10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" }, "engines": { - "node": ">=16.17" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/eslint-interactive": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint-interactive/-/eslint-interactive-10.8.0.tgz", + "integrity": "sha512-bsMSr0NVyxoSbKbA3Rn8so5+A9q+Zu8xExiIM18umPjrqfBAN8WcJfsWvfc9Myfiqn2WwLDM9mRglbx+Hp+z3Q==", "dev": true, + "dependencies": { + "boxen": "^7.0.2", + "chalk": "^5.0.1", + "comlink": "^4.3.1", + "enquirer": "^2.3.6", + "eslint-formatter-codeframe": "^7.32.1", + "estraverse": "^5.3.0", + "find-cache-dir": "^4.0.0", + "is-installed-globally": "^0.4.0", + "ora": "^6.1.2", + "strip-ansi": "^7.0.1", + "table": "^6.8.1", + "terminal-link": "^3.0.0", + "yargs": "^17.5.1" + }, + "bin": { + "eslint-interactive": "bin/eslint-interactive.js" + }, "engines": { - "node": ">=12" + "node": "^14.13.1 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/execa/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "node_modules/eslint-interactive/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/eslint-interactive/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/execa/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/eslint-interactive/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "debug": "^3.2.7" }, "engines": { - "node": ">= 0.10.0" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=0.6" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/eslint-plugin-import/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "ms": "^2.1.1" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "node_modules/eslint-plugin-import/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": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.4.0" + "node": "*" } }, - "node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "semver": "bin/semver.js" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, - "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==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "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" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">= 4.9.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "node_modules/eslint-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz", + "integrity": "sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "@types/eslint": "^8.37.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^8.0.0", + "webpack": "^5.0.0" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "websocket-driver": ">=0.5.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=0.8.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "pend": "~1.2.0" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": "^12.20 || >= 14.13" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fflate": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", - "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "node": ">=10" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/eslint/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, "dependencies": { - "ms": "2.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "node_modules/eslint/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": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { - "flat": "cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "estraverse": "^5.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.10" } }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "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, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/estree": "^1.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "engines": { - "node": ">=4" + "node": ">=0.4.x" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "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" + "mimic-fn": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.4" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.10.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "ms": "2.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">= 8.9.0" + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { - "has-flag": "^3.0.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, "engines": { - "node": ">=6" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "acorn": "^7.1.1", + "isarray": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">=0.4.0" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, + "node_modules/falafel/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">= 14.17" + "node": ">=0.4.0" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "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, "dependencies": { - "fetch-blob": "^3.1.2" + "@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": ">=12.20.0" + "node": ">=8.6.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/fast-glob/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": ">= 0.6" + "node": ">= 6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 4.9.1" } }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "reusify": "^1.0.4" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=0.8.0" } }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true - }, - "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.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">=0.6" + "node": "^12.20 || >= 14.13" } }, - "node_modules/fstream/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/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/fstream/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "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" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/fstream/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "ms": "2.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/geckodriver": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.3.3.tgz", - "integrity": "sha512-we2c2COgxFkLVuoknJNx+ioP+7VDq0sr6SCqWHTzlA4kzIbzR0EQ1Pps34s8WrsOnQqPC8a4sZV9dRPROOrkSg==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "hasInstallScript": true, - "dependencies": { - "@wdio/logger": "^8.28.0", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", - "node-fetch": "^3.3.2", - "tar-fs": "^3.0.5", - "unzipper": "^0.10.14", - "which": "^4.0.0" - }, "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": "^16.13 || >=18 || >=20" + "flat": "cli.js" } }, - "node_modules/geckodriver/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "debug": "^4.3.4" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 14" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/geckodriver/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 14" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/geckodriver/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 14" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/geckodriver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">=16" + "node": "*" } }, - "node_modules/geckodriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dev": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": 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==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=6.9.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/get-port": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.0.0.tgz", - "integrity": "sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==", + "node_modules/fork-ts-checker-webpack-plugin/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, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "node_modules/fork-ts-checker-webpack-plugin/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": { - "resolve-pkg-maps": "^1.0.0" + "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/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/gl-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", - "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs-monkey": "^1.0.4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 4.0.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/fork-ts-checker-webpack-plugin/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": { - "is-glob": "^4.0.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.13.0" + "node": "*" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "dependencies": { - "ini": "2.0.0" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" }, "engines": { - "node": ">=10" + "node": ">= 8.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 10.0.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14.17" } }, - "node_modules/glsl-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", - "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" } }, - "node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", - "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.6" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=14.14" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0" } }, - "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==", + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { - "duplexer": "^0.1.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/geckodriver": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.2.tgz", + "integrity": "sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA==", + "dev": true, + "hasInstallScript": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "@wdio/logger": "^8.28.0", + "@zip.js/zip.js": "^2.7.44", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.6", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" }, "engines": { - "node": ">=6" + "node": "^16.13 || >=18 || >=20" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">=16" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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": ">=8" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-tostringtag": { + "node_modules/get-symbol-description": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -7082,247 +7404,249 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, - "bin": { - "he": "bin/he" + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "assert-plus": "^1.0.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "node_modules/gl-matrix": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", + "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" + }, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "whatwg-encoding": "^1.0.5" + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=12" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, + "dependencies": { + "ini": "2.0.0" + }, "engines": { - "node": ">= 12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "define-properties": "^1.1.3" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/glsl-editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", + "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", + "dependencies": { + "brfs": "^1.2.0", + "codemirror": "^4.5.0", + "element-size": "^1.1.1", + "events": "^1.0.2", + "inherits": "^2.0.1", + "insert-css": "^0.2.0", + "through2": "^0.6.1", + "xtend": "^4.0.0" + } + }, + "node_modules/glsl-editor/node_modules/codemirror": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", + "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "node": ">=14.16" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { "node": ">=10" @@ -7331,384 +7655,516 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } + "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 }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, "engines": { - "node": ">=10.19.0" + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "duplexer": "^0.1.2" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">=16.17.0" + "node": ">=4" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.4.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "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" - } - ] + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/ikonate": { - "version": "1.1.1", - "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "integrity": "sha512-npghn+yBsovOp2k50rtoqNxUG53BuysNA5m3BqF1qXwm397fiKKvtkzLgPMJJsd+nbXjrRHdsEyvHcLj20OOhg==", - "license": "MIT", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, "dependencies": { - "jsdom": "11.10.0", - "pretty": "^2.0.0", - "xmldom": "^0.1.27" + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ikonate/node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/ikonate/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ikonate/node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ikonate/node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" } }, - "node_modules/ikonate/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/ikonate/node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", - "dependencies": { - "cssom": "0.3.x" + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" } }, - "node_modules/ikonate/node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/ikonate/node_modules/data-urls/node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "whatwg-encoding": "^1.0.1" } }, - "node_modules/ikonate/node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "deprecated": "Use your platform's native DOMException instead", - "dependencies": { - "webidl-conversions": "^4.0.2" - } + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, - "node_modules/ikonate/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=12" } }, - "node_modules/ikonate/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 12" } }, - "node_modules/ikonate/node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, "dependencies": { - "whatwg-encoding": "^1.0.1" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/ikonate/node_modules/jsdom": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", - "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", - "ws": "^4.0.0", - "xml-name-validator": "^3.0.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/ikonate/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/ikonate/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.0.0" } }, - "node_modules/ikonate/node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/ikonate/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/ikonate/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/ikonate/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=0.8" + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/ikonate/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" } }, - "node_modules/ikonate/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "prelude-ls": "~1.1.2" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/ikonate/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "node_modules/ikonate/node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/ikonate/node_modules/ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "node_modules/ikonate": { + "version": "1.1.1", + "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "integrity": "sha512-cGhs9mJ1NG+yZHOSuvGbWxXV9ysDZAQApq1oHpMytHJam3BRl4JgBzO55ANUA9vpKT4uZcGhipGBUhAMPpPIfA==", + "license": "MIT", "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7809,9 +8265,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "funding": { "type": "github", @@ -8132,6 +8588,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8189,14 +8651,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -8359,14 +8813,15 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8389,126 +8844,277 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/js-beautify/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsdom": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", + "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, + "node_modules/jsdom/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "engines": { - "node": ">= 10.13.0" + "node": ">=4.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/jsdom/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { - "has-flag": "^4.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/js-beautify": { - "version": "1.14.11", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", - "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "node_modules/jsdom/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.3", - "glob": "^10.3.3", - "nopt": "^7.2.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": ">=14" + "node": ">= 0.8.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "node_modules/jsdom/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/jsdom/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "argparse": "^2.0.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=0.8" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-17.0.0.tgz", - "integrity": "sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.4.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.0", - "decimal.js": "^10.3.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^9.0.0", - "ws": "^8.0.0", - "xml-name-validator": "^3.0.0" + "node_modules/jsdom/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "node": ">= 0.8.0" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, "node_modules/json-buffer": { @@ -8556,12 +9162,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -8597,6 +9197,24 @@ "node": ">=0.6.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8665,227 +9283,18 @@ "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", - "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.23.0", - "lightningcss-darwin-x64": "1.23.0", - "lightningcss-freebsd-x64": "1.23.0", - "lightningcss-linux-arm-gnueabihf": "1.23.0", - "lightningcss-linux-arm64-gnu": "1.23.0", - "lightningcss-linux-arm64-musl": "1.23.0", - "lightningcss-linux-x64-gnu": "1.23.0", - "lightningcss-linux-x64-musl": "1.23.0", - "lightningcss-win32-x64-msvc": "1.23.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", - "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", - "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", - "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", - "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", - "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", - "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", - "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", - "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", - "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", - "cpu": [ - "x64" - ], + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "dependencies": { + "immediate": "~3.0.5" } }, "node_modules/lines-and-columns": { @@ -8894,12 +9303,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -8923,29 +9326,23 @@ "node": ">=8.9.0" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-app": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.2.20.tgz", - "integrity": "sha512-TOCp8H9l75GhNtd+BgyUnLMNzR+IpYge7cWjxELsyDlqH+MyYWxq+NfyjQ+o6oRAORzOs3IfMM6KAR6q3JNfhg==", + "version": "2.4.21", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.21.tgz", + "integrity": "sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + } + ], "dependencies": { - "n12": "1.8.23", + "@promptbook/utils": "0.58.0", "type-fest": "2.13.0", "userhome": "1.0.0" } @@ -9064,9 +9461,9 @@ "dev": true }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "dependencies": { "get-func-name": "^2.0.1" @@ -9094,23 +9491,30 @@ } }, "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "dev": true, "engines": { - "node": "14 || >=16.14" + "node": "20 || >=22" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", - "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" } }, "node_modules/media-typer": { @@ -9250,9 +9654,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -9329,9 +9733,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9351,9 +9755,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9364,30 +9768,6 @@ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", "dev": true }, - "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/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -9403,6 +9783,67 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/msw": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", + "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^3.0.0", + "@mswjs/interceptors": "^0.29.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "chalk": "^4.1.2", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.2", + "path-to-regexp": "^6.2.0", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.9.0", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.7.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", + "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -9416,11 +9857,14 @@ "multicast-dns": "cli.js" } }, - "node_modules/n12": { - "version": "1.8.23", - "resolved": "https://registry.npmjs.org/n12/-/n12-1.8.23.tgz", - "integrity": "sha512-kQITb5LlO0Gk8rmbMAkfbmhs+QlXZ5SRHsx6YcG++3yc57iolbiQuo5rsfu3dkB7Qw3jKCqntsZvNNgvdfotkA==", - "dev": true + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/nanoid": { "version": "3.3.7", @@ -9564,9 +10008,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "engines": { "node": ">=14.16" @@ -9612,14 +10056,6 @@ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9876,6 +10312,12 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -9942,9 +10384,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", @@ -9952,47 +10394,9 @@ "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" }, "engines": { "node": ">= 14" @@ -10011,6 +10415,11 @@ "node": ">= 14" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -10057,12 +10466,9 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "optional": true, - "peer": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, "node_modules/parseurl": { "version": "1.3.3", @@ -10115,15 +10521,16 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10151,12 +10558,12 @@ "dev": true }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pend": { @@ -10171,9 +10578,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -10285,26 +10692,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -10322,17 +10718,17 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -10342,9 +10738,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -10359,9 +10755,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -10389,9 +10785,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -10417,9 +10813,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10455,17 +10851,17 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", + "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "react-is": "^17.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -10480,6 +10876,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10540,44 +10945,6 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -10686,9 +11053,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -10793,9 +11158,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "node_modules/readable-stream": { @@ -10867,6 +11232,12 @@ "node": ">= 10.13.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -11225,9 +11596,9 @@ } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -11240,19 +11611,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", "fsevents": "~2.3.2" } }, @@ -11361,20 +11735,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -11413,12 +11773,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -11426,17 +11783,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -11803,9 +12149,9 @@ } }, "node_modules/socks": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", - "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { "ip-address": "^9.0.5", @@ -11817,26 +12163,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -11858,9 +12192,9 @@ } }, "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==", + "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" @@ -11876,6 +12210,22 @@ "source-map": "^0.6.0" } }, + "node_modules/spacetrim": { + "version": "0.11.36", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.36.tgz", + "integrity": "sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" + } + ] + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -12143,15 +12493,25 @@ } }, "node_modules/streamx": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", - "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", "dev": true, "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -12326,38 +12686,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", - "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", - "dev": true, - "dependencies": { - "js-tokens": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", - "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", - "dev": true - }, "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "webpack": "^5.27.0" } }, "node_modules/supports-color": { @@ -12506,9 +12848,9 @@ } }, "node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, "dependencies": { "pump": "^3.0.0", @@ -12604,6 +12946,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -12653,24 +13004,33 @@ "dev": true }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", + "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, "node_modules/tinypool": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", - "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", + "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", + "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", "dev": true, "engines": { "node": ">=14.0.0" @@ -12707,12 +13067,10 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -12724,32 +13082,17 @@ } }, "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "optional": true, - "peer": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "engines": { - "node": "*" + "punycode": "^2.1.0" } }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { "node": ">=16" @@ -12789,13 +13132,13 @@ "dev": true }, "node_modules/tsx": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz", - "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", + "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", "dev": true, "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.21.5", + "get-tsconfig": "^4.7.5" }, "bin": { "tsx": "dist/cli.mjs" @@ -12808,9 +13151,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -12824,9 +13167,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -12840,9 +13183,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -12856,9 +13199,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -12872,9 +13215,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -12888,9 +13231,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -12904,9 +13247,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -12920,9 +13263,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -12936,9 +13279,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -12952,9 +13295,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -12968,9 +13311,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -12984,9 +13327,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -13000,9 +13343,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -13016,9 +13359,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -13032,9 +13375,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -13048,9 +13391,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -13064,9 +13407,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -13080,9 +13423,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -13096,9 +13439,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -13112,9 +13455,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -13128,9 +13471,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -13144,9 +13487,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -13160,9 +13503,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -13176,9 +13519,9 @@ } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -13188,29 +13531,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/tunnel-agent": { @@ -13241,15 +13584,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -13346,9 +13680,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -13358,12 +13692,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -13424,8 +13752,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -13439,24 +13765,6 @@ "node": ">= 0.8" } }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -13500,8 +13808,6 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -13573,14 +13879,14 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -13628,15 +13934,15 @@ } }, "node_modules/vite-node": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", - "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", + "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", "dev": true, "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -13649,10 +13955,27 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -13666,9 +13989,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -13682,9 +14005,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -13698,9 +14021,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -13714,9 +14037,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -13730,9 +14053,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -13746,9 +14069,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -13762,9 +14085,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -13778,9 +14101,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -13794,9 +14117,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -13810,9 +14133,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -13826,9 +14149,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -13842,9 +14165,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -13858,9 +14181,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -13874,9 +14197,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -13890,9 +14213,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -13906,9 +14229,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -13922,9 +14245,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -13938,9 +14261,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -13954,9 +14277,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -13970,9 +14293,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -13986,9 +14309,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -14002,9 +14325,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -14018,9 +14341,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -14030,57 +14353,56 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/vitest": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz", - "integrity": "sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.3.1", - "@vitest/runner": "1.3.1", - "@vitest/snapshot": "1.3.1", - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", + "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.4", + "@vitest/pretty-format": "^2.0.4", + "@vitest/runner": "2.0.4", + "@vitest/snapshot": "2.0.4", + "@vitest/spy": "2.0.4", + "@vitest/utils": "2.0.4", + "chai": "^5.1.1", + "debug": "^4.3.5", "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.3.1", - "why-is-node-running": "^2.2.2" + "vite-node": "2.0.4", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -14094,8 +14416,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.3.1", - "@vitest/ui": "1.3.1", + "@vitest/browser": "2.0.4", + "@vitest/ui": "2.0.4", "happy-dom": "*", "jsdom": "*" }, @@ -14120,13 +14442,21 @@ } } }, - "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "node_modules/vitest/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/vlq": { @@ -14143,20 +14473,6 @@ "browser-process-hrtime": "^1.0.0" } }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/wait-port": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", @@ -14175,9 +14491,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -14215,18 +14531,18 @@ } }, "node_modules/webdriver": { - "version": "8.32.3", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.32.3.tgz", - "integrity": "sha512-1/kpZvuftt59oikHs+6FvWXNfOM5tgMMMAk3LnMe7D938dVOoNGAe46fq0oL/xsxxPicbMRTRgIy1OifLiglaA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.39.0.tgz", + "integrity": "sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.32.3", - "@wdio/logger": "8.28.0", - "@wdio/protocols": "8.32.0", - "@wdio/types": "8.32.2", - "@wdio/utils": "8.32.3", + "@wdio/config": "8.39.0", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.38.0", + "@wdio/types": "8.39.0", + "@wdio/utils": "8.39.0", "deepmerge-ts": "^5.1.0", "got": "^12.6.1", "ky": "^0.33.0", @@ -14237,26 +14553,27 @@ } }, "node_modules/webdriverio": { - "version": "8.32.3", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.32.3.tgz", - "integrity": "sha512-SupbQKMtUZHSH7lmF5xaJPgxsn8sIBNAjs1CyPI33u30eY9VcVQ4CJQ818ZS3FLxR0q2XdWk9lsQNyhZwlN3RA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.39.1.tgz", + "integrity": "sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@wdio/config": "8.32.3", - "@wdio/logger": "8.28.0", - "@wdio/protocols": "8.32.0", + "@wdio/config": "8.39.0", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.38.0", "@wdio/repl": "8.24.12", - "@wdio/types": "8.32.2", - "@wdio/utils": "8.32.3", - "archiver": "^6.0.0", + "@wdio/types": "8.39.0", + "@wdio/utils": "8.39.0", + "archiver": "^7.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1262051", + "devtools-protocol": "^0.0.1302984", "grapheme-splitter": "^1.0.2", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", + "jszip": "^3.10.1", "lodash.clonedeep": "^4.5.0", "lodash.zip": "^4.2.0", "minimatch": "^9.0.0", @@ -14265,7 +14582,7 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^11.0.1", - "webdriver": "8.32.3" + "webdriver": "8.39.0" }, "engines": { "node": "^16.13 || >=18" @@ -14280,37 +14597,31 @@ } }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10.4" - } + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -14318,7 +14629,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -14338,9 +14649,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", @@ -14351,7 +14662,6 @@ "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", "opener": "^1.5.2", "picocolors": "^1.0.0", "sirv": "^2.0.3", @@ -14382,19 +14692,10 @@ "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -14466,6 +14767,20 @@ "node": ">=14" } }, + "node_modules/webpack-cli/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/webpack-dev-middleware": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", @@ -14549,9 +14864,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.2.tgz", - "integrity": "sha512-IVj3qsQhiLJR82zVg3QdPtngMD05CYP/Am+9NG5QSl+XwUR/UPtFwllRBKrMwM9ttzFsC6Zj3DMgniPyn/Z0hQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.13", @@ -14582,7 +14897,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", + "webpack-dev-middleware": "^7.1.0", "ws": "^8.16.0" }, "bin": { @@ -14635,12 +14950,69 @@ "ajv": "^8.8.2" } }, + "node_modules/webpack-dev-server/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/webpack-dev-server/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webpack-dev-server/node_modules/rimraf": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", @@ -14679,17 +15051,17 @@ } }, "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { @@ -14779,18 +15151,13 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", - "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", - "dev": true, - "optional": true, - "peer": true, + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dependencies": { - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=12" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "node_modules/which": { @@ -14843,9 +15210,9 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "dependencies": { "siginfo": "^2.0.0", @@ -14981,9 +15348,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -15006,14 +15373,6 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", @@ -15040,11 +15399,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -15111,6 +15465,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yauzl/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, + "engines": { + "node": "*" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -15123,32 +15486,64 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zip-stream": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", - "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" } }, "node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } } } diff --git a/package.json b/package.json index 01b2d77ae..3894d98e0 100644 --- a/package.json +++ b/package.json @@ -43,16 +43,16 @@ "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.20", + "@types/node": "^20.14.12", "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "@vitest/browser": "^1.3.1", - "@vitest/ui": "^1.3.1", - "css-loader": "^6.10.0", - "esbuild": "^0.20.1", - "esbuild-loader": "^4.1.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitest/browser": "^2.0.4", + "@vitest/ui": "^2.0.4", + "css-loader": "^7.1.2", + "esbuild": "^0.23.0", + "esbuild-loader": "^4.2.2", "eslint": "^8.56.0", "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.6.1", @@ -60,21 +60,21 @@ "eslint-plugin-import": "^2.29.1", "eslint-webpack-plugin": "^4.0.1", "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^10.3.10", + "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.8.1", - "prettier": "3.2.5", - "style-loader": "^3.3.4", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "3.3.3", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "tsx": "^4.7.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1", - "webdriverio": "^8.32.3", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", + "tsx": "^4.16.2", + "typescript": "^5.5.4", + "vitest": "^2.0.4", + "webdriverio": "^8.39.1", + "webpack": "^5.93.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "webpack-merge": "^5.10.0" + "webpack-dev-server": "^5.0.4", + "webpack-merge": "^6.0.1" }, "dependencies": { "codemirror": "^5.61.1", diff --git a/src/navigation_state.ts b/src/navigation_state.ts index e66b785a8..2f12c550f 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -544,7 +544,7 @@ export class CoordinateSpacePlaybackVelocity extends RefCounted { }, set value(enabled: boolean) { self.modifyDimension(id, (oldInfo) => - enabled ? oldInfo ?? new DimensionPlaybackVelocity() : undefined, + enabled ? (oldInfo ?? new DimensionPlaybackVelocity()) : undefined, ); }, }; diff --git a/vitest.workspace.ts b/vitest.workspace.ts index b3198993c..00f4e15af 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -20,6 +20,7 @@ export default defineWorkspace([ include: [], }, browser: { + provider: "webdriverio", enabled: true, headless: true, name: "chrome", From 23218f95a6e8d5f614e00f0ba964eecc3ec7e9dc Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 13:13:03 -0700 Subject: [PATCH 20/45] 2.40.1 --- .../parcel-project-built/package-lock.json | 2 +- .../parcel-project-source/package-lock.json | 42 +++++++++---------- .../vite/vite-project-built/package-lock.json | 2 +- .../vite-project-source/package-lock.json | 42 +++++++++---------- .../webpack-project-built/package-lock.json | 2 +- .../webpack-project-source/package-lock.json | 42 +++++++++---------- package-lock.json | 4 +- package.json | 2 +- 8 files changed, 69 insertions(+), 69 deletions(-) diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index f9181ec6e..84b1c7eb7 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -19,7 +19,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index 9a33edb21..c5602104b 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -18,7 +18,7 @@ } }, "../../..": { - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", @@ -34,16 +34,16 @@ "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.20", + "@types/node": "^20.14.12", "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "@vitest/browser": "^1.3.1", - "@vitest/ui": "^1.3.1", - "css-loader": "^6.10.0", - "esbuild": "^0.20.1", - "esbuild-loader": "^4.1.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitest/browser": "^2.0.4", + "@vitest/ui": "^2.0.4", + "css-loader": "^7.1.2", + "esbuild": "^0.23.0", + "esbuild-loader": "^4.2.2", "eslint": "^8.56.0", "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.6.1", @@ -51,21 +51,21 @@ "eslint-plugin-import": "^2.29.1", "eslint-webpack-plugin": "^4.0.1", "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^10.3.10", + "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.8.1", - "prettier": "3.2.5", - "style-loader": "^3.3.4", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "3.3.3", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "tsx": "^4.7.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1", - "webdriverio": "^8.32.3", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", + "tsx": "^4.16.2", + "typescript": "^5.5.4", + "vitest": "^2.0.4", + "webdriverio": "^8.39.1", + "webpack": "^5.93.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "webpack-merge": "^5.10.0" + "webpack-dev-server": "^5.0.4", + "webpack-merge": "^6.0.1" }, "engines": { "node": ">=20.10 <21 || >=21.2" diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index f112e1993..4c9640951 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -17,7 +17,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 4e8378946..7427d782d 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -16,7 +16,7 @@ } }, "../../..": { - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", @@ -32,16 +32,16 @@ "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.20", + "@types/node": "^20.14.12", "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "@vitest/browser": "^1.3.1", - "@vitest/ui": "^1.3.1", - "css-loader": "^6.10.0", - "esbuild": "^0.20.1", - "esbuild-loader": "^4.1.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitest/browser": "^2.0.4", + "@vitest/ui": "^2.0.4", + "css-loader": "^7.1.2", + "esbuild": "^0.23.0", + "esbuild-loader": "^4.2.2", "eslint": "^8.56.0", "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.6.1", @@ -49,21 +49,21 @@ "eslint-plugin-import": "^2.29.1", "eslint-webpack-plugin": "^4.0.1", "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^10.3.10", + "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.8.1", - "prettier": "3.2.5", - "style-loader": "^3.3.4", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "3.3.3", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "tsx": "^4.7.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1", - "webdriverio": "^8.32.3", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", + "tsx": "^4.16.2", + "typescript": "^5.5.4", + "vitest": "^2.0.4", + "webdriverio": "^8.39.1", + "webpack": "^5.93.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "webpack-merge": "^5.10.0" + "webpack-dev-server": "^5.0.4", + "webpack-merge": "^6.0.1" }, "engines": { "node": ">=20.10 <21 || >=21.2" diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index 734adf698..557bec6cc 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -23,7 +23,7 @@ }, "../../../dist/package": { "name": "neuroglancer", - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 91a14c88c..c1a47c237 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -23,7 +23,7 @@ } }, "../../..": { - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", @@ -39,16 +39,16 @@ "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.11.20", + "@types/node": "^20.14.12", "@types/pako": "^2.0.3", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.2", - "@vitest/browser": "^1.3.1", - "@vitest/ui": "^1.3.1", - "css-loader": "^6.10.0", - "esbuild": "^0.20.1", - "esbuild-loader": "^4.1.0", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitest/browser": "^2.0.4", + "@vitest/ui": "^2.0.4", + "css-loader": "^7.1.2", + "esbuild": "^0.23.0", + "esbuild-loader": "^4.2.2", "eslint": "^8.56.0", "eslint-formatter-codeframe": "^7.32.1", "eslint-import-resolver-typescript": "^3.6.1", @@ -56,21 +56,21 @@ "eslint-plugin-import": "^2.29.1", "eslint-webpack-plugin": "^4.0.1", "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^10.3.10", + "glob": "^11.0.0", "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.8.1", - "prettier": "3.2.5", - "style-loader": "^3.3.4", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "3.3.3", + "style-loader": "^4.0.0", "svg-inline-loader": "^0.8.2", - "tsx": "^4.7.1", - "typescript": "^5.3.3", - "vitest": "^1.3.1", - "webdriverio": "^8.32.3", - "webpack": "^5.90.3", - "webpack-bundle-analyzer": "^4.10.1", + "tsx": "^4.16.2", + "typescript": "^5.5.4", + "vitest": "^2.0.4", + "webdriverio": "^8.39.1", + "webpack": "^5.93.0", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", - "webpack-merge": "^5.10.0" + "webpack-dev-server": "^5.0.4", + "webpack-merge": "^6.0.1" }, "engines": { "node": ">=20.10 <21 || >=21.2" diff --git a/package-lock.json b/package-lock.json index f73fd0c15..d27acab7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "neuroglancer", - "version": "2.40.0", + "version": "2.40.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "neuroglancer", - "version": "2.40.0", + "version": "2.40.1", "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", diff --git a/package.json b/package.json index 3894d98e0..19131a977 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "neuroglancer", "description": "Visualization tool for 3-D volumetric data.", "license": "Apache-2.0", - "version": "2.40.0", + "version": "2.40.1", "repository": { "type": "git", "url": "git+https://github.com/google/neuroglancer.git" From 997afee315d06430e3dce8fe07a661e92cfd22b6 Mon Sep 17 00:00:00 2001 From: Davis Bennett Date: Tue, 23 Jul 2024 22:17:20 +0200 Subject: [PATCH 21/45] fix(datasource/zarr) `HEAD` to get content length (#611) Use a HEAD request as fallback for http 206 status with no content-length. --- src/kvstore/special/index.ts | 64 +++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts index d3fc9e9a9..22423b00e 100644 --- a/src/kvstore/special/index.ts +++ b/src/kvstore/special/index.ts @@ -51,6 +51,33 @@ class SpecialProtocolKvStore implements ReadableKvStore { public credentialsProvider: SpecialProtocolCredentialsProvider, public baseUrl: string, ) {} + + async getObjectLength(url: string, options: ReadOptions) { + // Use a HEAD request to get the length of an object + const { cancellationToken = uncancelableToken } = options; + const headResponse = await cancellableFetchSpecialOk( + this.credentialsProvider, + url, + { method: "HEAD" }, + async (response) => response, + cancellationToken, + ); + + if (headResponse.status !== 200) { + throw new Error( + "Failed to determine total size in order to fetch suffix", + ); + } + const contentLength = headResponse.headers.get("content-length"); + if (contentLength === undefined) { + throw new Error( + "Failed to determine total size in order to fetch suffix", + ); + } + const contentLengthNumber = Number(contentLength); + return contentLengthNumber; + } + async read( key: string, options: ReadOptions, @@ -83,14 +110,17 @@ class SpecialProtocolKvStore implements ReadableKvStore { if (contentRange === null) { if (byteRangeRequest !== undefined) { if ("suffixLength" in byteRangeRequest) { - throw new Error( - "Content-range header not provided with HTTP 206 response. Check server CORS configuration.", - ); + const objectSize = await this.getObjectLength(url, options); + byteRange = { + offset: objectSize - byteRangeRequest.suffixLength, + length: Number(response.headers.get("content-length")), + }; + } else { + byteRange = { + offset: byteRangeRequest.offset, + length: data.byteLength, + }; } - byteRange = { - offset: byteRangeRequest.offset, - length: data.byteLength, - }; } else { throw new Error( "Unexpected HTTP 206 response when no byte range specified.", @@ -134,25 +164,7 @@ class SpecialProtocolKvStore implements ReadableKvStore { ) { // Some servers, such as the npm http-server package, do not support suffixLength // byte-range requests. - const headResponse = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - { method: "HEAD" }, - async (response) => response, - cancellationToken, - ); - if (headResponse.status !== 200) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLength = headResponse.headers.get("content-length"); - if (contentLength === undefined) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLengthNumber = Number(contentLength); + const contentLengthNumber = await this.getObjectLength(url, options); byteRangeRequest = composeByteRangeRequest( { offset: 0, length: contentLengthNumber }, byteRangeRequest, From a8e6b490c6755696d15518320bc84195184e1aa1 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 14:00:08 -0700 Subject: [PATCH 22/45] fix(python/ext): fix building with NumPy<2 --- python/ext/src/_neuroglancer.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/python/ext/src/_neuroglancer.cc b/python/ext/src/_neuroglancer.cc index 113692fb6..7e8c58986 100644 --- a/python/ext/src/_neuroglancer.cc +++ b/python/ext/src/_neuroglancer.cc @@ -55,7 +55,12 @@ static int tp_init(Obj* self, PyObject* args, PyObject* kwds) { return -1; } auto* descr = PyArray_DESCR(array); - npy_intp elsize = PyDataType_ELSIZE(descr); + npy_intp elsize; +#ifdef NPY_2_0_API_VERSION + elsize = PyDataType_ELSIZE(descr); +#else + elsize = descr->elsize; +#endif if ((descr->kind != 'i' && descr->kind != 'u') || (elsize != 1 && elsize != 2 && elsize != 4 && elsize != 8)) { Py_DECREF(array); From c6d836ed3f69722fe492349225437daf50feeeeb Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sun, 21 Jul 2024 17:13:04 -0700 Subject: [PATCH 23/45] docs: clean up Python API and add some docstrings --- python/neuroglancer/__init__.py | 2 +- python/neuroglancer/coordinate_space.py | 110 +++-- .../default_credentials_manager.py | 5 + python/neuroglancer/equivalence_map.py | 81 +-- python/neuroglancer/json_wrappers.py | 461 +++++++++++------- python/neuroglancer/local_volume.py | 28 +- python/neuroglancer/screenshot.py | 6 + python/neuroglancer/server.py | 48 +- python/neuroglancer/trackable_state.py | 85 +++- python/neuroglancer/url_state.py | 33 +- python/neuroglancer/viewer_base.py | 2 +- python/neuroglancer/viewer_config_state.py | 87 +++- python/neuroglancer/viewer_state.py | 388 +++++++++------ python/tests/client_test.py | 2 +- python/tests/json_wrappers_test.py | 52 ++ python/tests/viewer_state_test.py | 13 + python/tests/write_annotations_test.py | 6 +- 17 files changed, 955 insertions(+), 454 deletions(-) create mode 100644 python/tests/json_wrappers_test.py diff --git a/python/neuroglancer/__init__.py b/python/neuroglancer/__init__.py index edafa519b..d777b0533 100644 --- a/python/neuroglancer/__init__.py +++ b/python/neuroglancer/__init__.py @@ -74,7 +74,6 @@ SplitSegmentsTool, # noqa: F401 SelectSegmentsTool, # noqa: F401 DimensionTool, # noqa: F401 - tool, # noqa: F401 SidePanelLocation, # noqa: F401 SelectedLayerState, # noqa: F401 StatisticsDisplayState, # noqa: F401 @@ -96,6 +95,7 @@ VisibleSegments, # noqa: F401 SegmentationLayer, # noqa: F401 SingleMeshLayer, # noqa: F401 + Annotation, # noqa: F401 PointAnnotation, # noqa: F401 LineAnnotation, # noqa: F401 AxisAlignedBoundingBoxAnnotation, # noqa: F401 diff --git a/python/neuroglancer/coordinate_space.py b/python/neuroglancer/coordinate_space.py index 07cd361ca..26c361a44 100644 --- a/python/neuroglancer/coordinate_space.py +++ b/python/neuroglancer/coordinate_space.py @@ -13,10 +13,12 @@ # limitations under the License. """Wrappers for representing a Neuroglancer coordinate space.""" -import collections import re +from collections.abc import Sequence +from typing import Any, NamedTuple, Optional, Union import numpy as np +import numpy.typing __all__ = [] @@ -68,11 +70,13 @@ def parse_unit(scale, unit): return (scale / 10 ** (-exponent), unit) -def parse_unit_and_scale(unit_and_scale: str) -> tuple[float, str]: +def parse_unit_and_scale( + unit_and_scale: str, coefficient: float = 1.0 +) -> tuple[float, str]: if unit_and_scale == "": - return (1, "") + return (coefficient, "") m = re.fullmatch( - r"/^((?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)?([µa-zA-Z]+)?$", unit_and_scale + r"^((?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)?([µa-zA-Z]+)?$", unit_and_scale ) if m is None: raise ValueError("Invalid unit", unit_and_scale) @@ -82,6 +86,7 @@ def parse_unit_and_scale(unit_and_scale: str) -> tuple[float, str]: else: scale = float(scale_str) + scale *= coefficient unit = "" unit_str = m.group(2) if unit_str is not None: @@ -154,23 +159,15 @@ def to_json(self): @export -class DimensionScale( - collections.namedtuple("DimensionScale", ["scale", "unit", "coordinate_array"]) -): - """ - Attributes - ---------- - scale : float - Voxel spacing along the dimension. - unit : str - Units of `scale`. - coordinate_array : neuroglancer.CoordinateArray - """ +class DimensionScale(NamedTuple): + scale: float = 1 + """Voxel scaling along the dimension.""" - __slots__ = () + unit: str = "" + """Units of `.scale`.""" - def __new__(cls, scale=1, unit="", coordinate_array=None): - return super().__new__(cls, scale, unit, coordinate_array) + coordinate_array: Optional[CoordinateArray] = None + """Coordinate array for the dimension.""" @staticmethod def from_json(json): @@ -193,37 +190,75 @@ def from_json(json): class CoordinateSpace: __slots__ = ("names", "scales", "units", "coordinate_arrays") + names: tuple[str, ...] + """Name of each dimension. + + Length is equal to `.rank`. + """ + + scales: np.typing.NDArray[np.float64] + """Physical scale coefficient for `.unit` for each dimension. + + Length is equal to `.rank`. + """ + + units: tuple[str, ...] + """Physical unit for each dimension. + + Length is equal to `.rank`. + """ + + coordinate_arrays: tuple[Optional[CoordinateArray], ...] + """Coordinate array for each dimension. + + Length is equal to `.rank`. + """ + def __init__( - self, json=None, names=None, scales=None, units=None, coordinate_arrays=None + self, + json: Any = None, + names: Optional[Sequence[str]] = None, + scales: Optional[Sequence[float]] = None, + units: Optional[Union[str, Sequence[str]]] = None, + coordinate_arrays: Optional[Sequence[Optional[CoordinateArray]]] = None, ): """ - Parameters - ---------- - names : Iterable[str] - Dimension names (e.g., ['x', 'y', 'z']). - scales : float, Iterable[float] - Voxel spacing along each dimension. - units : str, Iterable[str] - Units of the values in `scales`. - coordinate_arrays : Iterable[neuroglancer.CoordinateArray] + Constructs a coordinate space. + + Args: + json: JSON representation. + names: Dimension names (e.g., ['x', 'y', 'z']). + scales: Voxel spacing along each dimension. + units: Units of the values in :py:param:`.scales`. + coordinate_arrays: Coordinate arrays associated with each dimension. """ if json is None: if names is not None: - self.names = tuple(names) - scales = np.array(scales, dtype=np.float64) + names_tuple = tuple(names) + rank = len(names_tuple) + self.names = names_tuple + if scales is None: + scales_array = np.ones(rank, dtype=np.float64) + else: + scales_array = np.array(scales, dtype=np.float64) + if units is None: + units = "" if isinstance(units, str): - units = tuple(units for _ in names) + units = tuple(units for _ in names_tuple) scales_and_units = tuple( - parse_unit(scale, unit) for scale, unit in zip(scales, units) + parse_unit_and_scale(unit, scale) + for scale, unit in zip(scales_array, units) + ) + scales_array = np.array( + [s[0] for s in scales_and_units], dtype=np.float64 ) - scales = np.array([s[0] for s in scales_and_units], dtype=np.float64) units = tuple(s[1] for s in scales_and_units) if coordinate_arrays is None: - coordinate_arrays = tuple(None for x in units) + coordinate_arrays = tuple(None for _ in units) else: coordinate_arrays = tuple(coordinate_arrays) self.units = units - self.scales = scales + self.scales = scales_array self.coordinate_arrays = coordinate_arrays else: self.names = () @@ -241,7 +276,8 @@ def __init__( self.scales.setflags(write=False) @property - def rank(self): + def rank(self) -> int: + """Number of dimensions.""" return len(self.names) def __getitem__(self, i): diff --git a/python/neuroglancer/default_credentials_manager.py b/python/neuroglancer/default_credentials_manager.py index 62699ec23..96139788d 100644 --- a/python/neuroglancer/default_credentials_manager.py +++ b/python/neuroglancer/default_credentials_manager.py @@ -48,4 +48,9 @@ def set_boss_token(token): + """Sets the authentication token for connecting to bossDB. + + Group: + credentials + """ boss_credentials_provider.set_token(token) diff --git a/python/neuroglancer/equivalence_map.py b/python/neuroglancer/equivalence_map.py index acab105ef..1615191cb 100644 --- a/python/neuroglancer/equivalence_map.py +++ b/python/neuroglancer/equivalence_map.py @@ -13,11 +13,18 @@ # limitations under the License. +import collections import copy +from collections.abc import ItemsView, Iterator, KeysView +from typing import Optional class EquivalenceMap: - """Union-find data structure""" + """Union-find data structure. + + Group: + viewer-state-segments + """ supports_readonly = True @@ -41,8 +48,8 @@ def __init__(self, existing=None, _readonly=False): self.union(*group) self._readonly = _readonly - def _get_representative(self, obj): - """Finds and returns the root of the set containing `obj`.""" + def _get_representative(self, obj: int) -> int: + """Finds and returns the root of the set containing the specified element.""" if obj not in self._parents: self._parents[obj] = obj @@ -62,20 +69,20 @@ def _get_representative(self, obj): self._parents[ancestor] = root return root - def __getitem__(self, obj): - """Returns the minimum element in the set containing `obj`.""" + def __getitem__(self, obj: int) -> int: + """Returns the minimum element in the set containing the specified element.""" if obj not in self._parents: return obj return self._min_values[self._get_representative(obj)] - def __iter__(self): + def __iter__(self) -> Iterator[int]: """Iterates over all elements known to this equivalence map.""" return iter(self._parents) - def items(self): + def items(self) -> ItemsView[int, int]: return self._parents.items() - def keys(self): + def keys(self) -> KeysView[int]: return self._parents.keys() def clear(self): @@ -84,20 +91,20 @@ def clear(self): self._prev_next.clear() self._min_values.clear() - def union(self, *args): - """Unions the equivalence classes containing the elements in `*args`.""" + def union(self, *elements: int) -> Optional[int]: + """Unions the equivalence classes containing the specified elements.""" if self._readonly: raise AttributeError - if len(args) == 0: + if len(elements) == 0: return None - if len(args) == 1: - return self[args[0]] - for a, b in zip(args[:-1], args[1:]): + if len(elements) == 1: + return self[elements[0]] + for a, b in zip(elements[:-1], elements[1:]): result = self._union_pair(a, b) return result - def _union_pair(self, a, b): + def _union_pair(self, a: int, b: int) -> int: a = self._get_representative(a) b = self._get_representative(b) if a == b: @@ -128,35 +135,35 @@ def _union_pair(self, a, b): self._parents[b] = a return self._min_values[a] - def members(self, x): - """Yields the members of the equivalence class containing `x`.""" - if x not in self._parents: - yield x + def members(self, element: int) -> Iterator[int]: + """Yields the members of the equivalence class containing the specified element.""" + if element not in self._parents: + yield element return - cur_x = x + cur_x = element while True: yield cur_x cur_x = self._prev_next[cur_x][1] - if cur_x == x: + if cur_x == element: break - def sets(self): + def sets(self) -> frozenset[frozenset[int]]: """Returns the equivalence classes as a set of sets.""" - sets = {} + sets: dict[int, set[int]] = collections.defaultdict(set) for x in self._parents: - sets.setdefault(self[x], set()).add(x) + sets[self[x]].add(x) return frozenset(frozenset(v) for v in sets.values()) - def to_json(self): + def to_json(self) -> list[list[int]]: """Returns the equivalence classes a sorted list of sorted lists.""" sets = self.sets() return sorted(sorted(x) for x in sets) - def __copy__(self): + def __copy__(self) -> "EquivalenceMap": """Does not preserve _readonly attribute.""" return EquivalenceMap(self) - def __deepcopy__(self, memo): + def __deepcopy__(self, memo) -> "EquivalenceMap": """Does not preserve _readonly attribute.""" result = EquivalenceMap() result._parents = copy.deepcopy(self._parents, memo) @@ -165,23 +172,23 @@ def __deepcopy__(self, memo): result._min_values = copy.deepcopy(self._min_values, memo) return result - def copy(self): + def copy(self) -> "EquivalenceMap": """Returns a copy of the equivalence map.""" return EquivalenceMap(self) - def delete_set(self, x): - """Removes the equivalence class containing `x`.""" - if x not in self._parents: + def delete_set(self, element: int): + """Removes the equivalence class containing the specified element.""" + if element not in self._parents: return - members = list(self.members(x)) + members = list(self.members(element)) for v in members: del self._parents[v] del self._weights[v] del self._prev_next[v] del self._min_values[v] - def isolate_element(self, x): - """Isolates `x` from its equivalence class.""" - members = list(self.members(x)) - self.delete_set(x) - self.union(*(v for v in members if v != x)) + def isolate_element(self, element: int): + """Isolates the specified element from its equivalence class.""" + members = list(self.members(element)) + self.delete_set(element) + self.union(*(v for v in members if v != element)) diff --git a/python/neuroglancer/json_wrappers.py b/python/neuroglancer/json_wrappers.py index 4defe8952..7c4c0fb96 100644 --- a/python/neuroglancer/json_wrappers.py +++ b/python/neuroglancer/json_wrappers.py @@ -13,16 +13,37 @@ # limitations under the License. """Facilities for converting JSON <-> Python objects""" +import collections import copy import inspect import numbers import threading -from typing import Any, Callable, ClassVar, Generic, TypeVar, Union +from collections.abc import ItemsView, Iterable, Iterator, KeysView, ValuesView +from typing import ( + Any, + Callable, + ClassVar, + Generic, + Literal, + Optional, + TypeVar, + Union, + cast, + overload, +) import numpy as np +import numpy.typing from .json_utils import encode_json_for_repr +__all__ = [] + + +def export(obj): + __all__.append(obj.__name__) + return obj + def to_json(value: Any) -> Any: if isinstance(value, np.ndarray): @@ -34,7 +55,9 @@ def to_json(value: Any) -> Any: return method() -_T = TypeVar("_T") +T = TypeVar("T") +K = TypeVar("K") +V = TypeVar("V") class JsonObjectWrapper: @@ -131,11 +154,45 @@ def validator_func(x): return validator +def _map_type_annotation(target, source, callback): + annotation = _get_type_annotation(source) + if annotation is None: + return + new_annotation = callback(annotation) + if new_annotation is None: + return + _set_type_annotation(target, new_annotation) + + +def _set_type_annotation(target, annotation): + setattr(target, "_neuroglancer_annotation", annotation) + + +def _get_type_annotation(wrapped_type): + annotation = getattr(wrapped_type, "_neuroglancer_annotation", None) + if annotation is not None: + return annotation + if isinstance(wrapped_type, type): + return wrapped_type + return None + + def wrapped_property(json_name, wrapped_type, validator=None, doc=None): validator = _normalize_validator(wrapped_type, validator) + + def fget(self): + return self._get_wrapped(json_name, wrapped_type) + + annotation = _get_type_annotation(wrapped_type) + if annotation is not None: + fget.__annotations__ = {"return": annotation} + + def fset(self, value): + return self._set_wrapped(json_name, value, validator) + return property( - fget=lambda self: self._get_wrapped(json_name, wrapped_type), - fset=lambda self, value: self._set_wrapped(json_name, value, validator), + fget=fget, + fset=fset, doc=doc, ) @@ -146,6 +203,9 @@ def array_wrapper(dtype, shape=None): shape = (shape,) else: shape = tuple(shape) + shape_annotation = tuple[tuple(Literal[s] for s in shape)] + else: + shape_annotation = Any def wrapper(value, _readonly=False): value = np.array(value, dtype=dtype) @@ -160,13 +220,17 @@ def wrapper(value, _readonly=False): return value wrapper.supports_readonly = True + _set_type_annotation( + wrapper, + ( + np.ndarray[shape_annotation, dtype] + if shape_annotation is not Any + else np.typing.NDArray[dtype] + ), + ) return wrapper -def text_type(value): - return str(value) - - def optional(wrapper, default_value=None, validator=None): def modified_wrapper(value, **kwargs): if value is None: @@ -184,207 +248,209 @@ def modified_validator(value, **kwargs): return validator(value, **kwargs) modified_wrapper.supports_validation = modified_validator + + if default_value is None: + _map_type_annotation(modified_wrapper, wrapper, lambda t: Optional[t]) + else: + _map_type_annotation(modified_wrapper, wrapper, lambda t: t) + return modified_wrapper -class MapBase: - __slots__ = () - pass +@export +class Map(Generic[K, V], JsonObjectWrapper): + """Maps keys of type :py:param:`.K` to values of type :py:param:`.V`. + + Type parameters: + K: + Key type. + V: + Mapped value type. + Group: + json-containers + """ -class TypedStringMap(Generic[_T], JsonObjectWrapper, MapBase): - validator: ClassVar[Callable[[Any], Any]] - wrapped_type: ClassVar[Callable[[Any], Any]] + _key_validator: ClassVar[Callable[[Any], Any]] + _value_validator: ClassVar[Callable[[Any], Any]] + _value_type: type supports_validation = True __slots__ = () def __init__(self, json_data=None, _readonly=False): - validator = type(self).validator - if isinstance(json_data, MapBase): + if isinstance(json_data, Map): json_data = json_data.to_json() elif json_data is not None: new_map = {} + key_validator = type(self)._key_validator + value_validator = type(self)._value_validator for k, v in json_data.items(): - validator(v) - new_map[k] = to_json(v) + key_validator(k) + value_validator(v) + new_map[str(k)] = to_json(v) json_data = new_map super().__init__(json_data, _readonly=_readonly) def clear(self): + """Clears the map.""" with self._lock: self._cached_wrappers.clear() self._json_data.clear() - def keys(self): - return self._json_data.keys() + def keys(self) -> KeysView[K]: + """Returns a dynamic view of the keys in the map.""" + return _MapKeysView(self) + + def values(self) -> ValuesView[V]: + """Returns a dynamic view of the values in the map.""" + return _MapValuesView(self) - def iteritems(self): - for key in self: - yield (key, self[key]) + def items(self) -> ItemsView[K, V]: + """Returns a dynamic view of the items in the map.""" + return _MapItemsView(self) - def itervalues(self): - for key in self: - yield self[key] + @overload + def get(self, key: K) -> Optional[V]: ... - def get(self, key: str, default_value=None): + @overload + def get(self, key: K, default: V) -> V: ... + + @overload + def get(self, key: K, default: T) -> Union[V, T]: ... + + def get(self, key: K, default=None): + """Returns the mapped value, or the specified default.""" + key = str(key) # type: ignore[assignment] with self._lock: if key in self._json_data: - return self[key] - return default_value + return self._get_wrapped(key, type(self)._value_type) + return default - def __len__(self): + def __len__(self) -> int: + """Returns the number of entries in the map.""" return len(self._json_data) - def __contains__(self, key): - return key in self._json_data + def __contains__(self, key: K) -> bool: + return str(key) in self._json_data - def __getitem__(self, key): + def __getitem__(self, key: K) -> V: + """Returns the mapped value associated with the specified key. + + Raises: + KeyError: if the key is not present in the map. + """ + key = str(key) # type: ignore[assignment] with self._lock: if key not in self._json_data: raise KeyError(key) - return self._get_wrapped(key, type(self).wrapped_type) + return self._get_wrapped(key, type(self)._value_type) - def __setitem__(self, key, value): + def __setitem__(self, key: K, value: V): + """Sets the specified key to the specified value.""" + key = str(key) # type: ignore[assignment] with self._lock: - self._set_wrapped(key, value, type(self).validator) + self._set_wrapped(key, value, type(self)._value_validator) self._json_data[key] = None # placeholder - def __delitem__(self, key): + def __delitem__(self, key: K): + """Deletes the entry with the specified key. + + Raises: + KeyError: if the key is not present in the map. + """ if self._readonly: raise AttributeError + str_key = str(key) # type: ignore[assignment] with self._lock: - del self._json_data[key] - self._cached_wrappers.pop(key, None) + del self._json_data[str_key] + self._cached_wrappers.pop(str_key, None) + + def __iter__(self) -> Iterator[K]: + key_validator = type(self)._key_validator + for key in self._json_data: + yield key_validator(key) - def __iter__(self): - return iter(self._json_data) +class _MapKeysView(Generic[K], collections.abc.KeysView[K]): + _mapping: Map[K, Any] + _base_view: KeysView[str] + _key_validator: Callable[[str], K] -def typed_string_map( - wrapped_type: Callable[[Any], _T], validator=None -) -> type[TypedStringMap[_T]]: - _wrapped_type = wrapped_type - _validator = _normalize_validator(wrapped_type, validator) + def __init__(self, map: Map[K, Any]): + self._mapping = map + self._base_view = map._json_data.keys() + self._key_validator = type(map)._key_validator - class Map(TypedStringMap): - wrapped_type = _wrapped_type - validator = _validator + def __contains__(self, key) -> bool: + return str(key) in self._base_view - return Map + def __len__(self) -> int: + return len(self._base_view) + + def __iter__(self) -> Iterator[K]: + key_validator = self._key_validator + for key in self._base_view: + yield key_validator(key) + + +class _MapItemsView(Generic[K, V], collections.abc.ItemsView[K, V]): + _mapping: Map[K, V] + + def __init__(self, map: Map[K, V]): + self._mapping = map + + def __contains__(self, item) -> bool: + key, value = item + m = self._mapping + return key in m and m[key] == value + + def __len__(self) -> int: + return len(self._mapping) + + def __iter__(self) -> Iterator[tuple[K, V]]: + m = self._mapping + for key in m: + yield (key, m[key]) + + +class _MapValuesView(Generic[V], collections.abc.ValuesView[V]): + _mapping: Map[Any, V] + + def __init__(self, map: Map[Any, V]): + self._mapping = map + + def __contains__(self, value) -> bool: + return any(value == x for x in self) + + def __len__(self) -> int: + return len(self._mapping) + + def __iter__(self) -> Iterator[V]: + m = self._mapping + for key in m: + yield m[key] def typed_map(key_type, value_type, key_validator=None, value_validator=None): key_validator = _normalize_validator(key_type, key_validator) value_validator = _normalize_validator(value_type, value_validator) - class Map(JsonObjectWrapper, MapBase): - supports_validation = True + class _Map(Map): __slots__ = () + _key_validator = key_validator + _value_validator = value_validator + _value_type = value_type - def __init__(self, json_data=None, _readonly=False): - if isinstance(json_data, MapBase): - json_data = json_data.to_json() - elif json_data is not None: - new_map = {} - for k, v in json_data.items(): - key_validator(k) - value_validator(v) - new_map[str(k)] = to_json(v) - json_data = new_map - super().__init__(json_data, _readonly=_readonly) - - def clear(self): - with self._lock: - self._cached_wrappers.clear() - self._json_data.clear() - - def keys(self): - return [key_validator(k) for k in self._json_data.keys()] - - def iteritems(self): - for key in self: - yield (key, self[key]) - - def itervalues(self): - for key in self: - yield self[key] - - def get(self, key, default_value=None): - key = str(key) - with self._lock: - if key in self._json_data: - return self._get_wrapped(key, value_type) - return default_value - - def __len__(self): - return len(self._json_data) - - def __contains__(self, key): - return str(key) in self._json_data - - def __getitem__(self, key): - key = str(key) - with self._lock: - if key not in self._json_data: - raise KeyError(key) - return self._get_wrapped(key, value_type) - - def __setitem__(self, key, value): - key = str(key) - with self._lock: - self._set_wrapped(key, value, value_validator) - self._json_data[key] = None # placeholder - - def __delitem__(self, key): - if self._readonly: - raise AttributeError - key = str(key) - with self._lock: - del self._json_data[key] - self._cached_wrappers.pop(key, None) - - def __iter__(self): - for key in self._json_data: - yield key_validator(key) - - return Map - - -def segments(): - key_type = np.uint64 - value_type = bool - value_validator = _normalize_validator(value_type, None) - - class Map(typed_map(key_type, value_type)): - def to_json(self): - return [ - segment if visible else "!" + segment - for segment, visible in self._json_data.items() - ] - - def __init__(self, json_data=None, _readonly=False): - if json_data is None: - json_data = dict() - else: - json_data = dict( - (key_type(v[1:]), False) - if str(v).startswith("!") - else (key_type(v), True) - for v in json_data - ) - super().__init__(json_data, _readonly=_readonly) - - def __setitem__(self, key, value): - key = str(key) - with self._lock: - self._set_wrapped(key, value, value_validator) - self._json_data[key] = value # using the value + if (key_annotation := _get_type_annotation(key_type)) is not None and ( + value_annotation := _get_type_annotation(value_type) + ) is not None: + _set_type_annotation(Map, Map[key_annotation, value_annotation]) - return Map + return _Map -def typed_set(wrapped_type: Callable[[Any], _T]): - def wrapper(x, _readonly=False) -> Callable[[Any], Union[set[_T], frozenset[_T]]]: +def typed_set(wrapped_type: Callable[[Any], T]): + def wrapper(x, _readonly=False) -> Callable[[Any], Union[set[T], frozenset[T]]]: set_type = frozenset if _readonly else set kwargs: dict[str, Any] = dict() if hasattr(wrapped_type, "supports_readonly"): @@ -394,17 +460,32 @@ def wrapper(x, _readonly=False) -> Callable[[Any], Union[set[_T], frozenset[_T]] return set_type(wrapped_type(v, **kwargs) for v in x) wrapper.supports_readonly = True # type: ignore[attr-defined] + _map_type_annotation( + wrapper, + wrapped_type, + lambda t: set[t], # type: ignore[valid-type] + ) return wrapper -class TypedList(Generic[_T]): +@export +class List(Generic[T]): + """List of values of type :py:param:`.T`. + + Type parameters: + T: Element type. + + Group: + json-containers + """ + supports_readonly = True supports_validation = True __slots__ = ("_readonly", "_data") - validator: ClassVar[Callable[[Any], Any]] + _validator: ClassVar[Callable[[Any], Any]] _readonly: bool - _data: list[_T] + _data: list[T] def __init__(self, json_data=None, _readonly=False): if json_data is None: @@ -412,51 +493,67 @@ def __init__(self, json_data=None, _readonly=False): if not isinstance(json_data, (list, tuple, np.ndarray)): raise ValueError self._readonly = _readonly - validator = type(self).validator + validator = type(self)._validator self._data = [validator(x) for x in json_data] - def __len__(self): + def __len__(self) -> int: + """Returns the length of the list.""" return len(self._data) - def __getitem__(self, key): + def __getitem__(self, key: int) -> T: + """Returns the element at the specified index.""" return self._data[key] - def __delitem__(self, key): + def __delitem__(self, key: int): + """Removes the element at the specified index.""" if self._readonly: raise AttributeError del self._data[key] - def __setitem__(self, key, value): + @overload + def __setitem__(self, key: int, value: T): ... + + @overload + def __setitem__(self, key: slice, value: Iterable[T]): ... + + def __setitem__(self, key: Union[int, slice], value: Union[T, Iterable[T]]): + """Assigns to the specified index or slice.""" if self._readonly: raise AttributeError if isinstance(key, slice): - values = [type(self).validator(x) for x in value] + values = [type(self)._validator(x) for x in cast(Iterable[T], value)] self._data[key] = values else: - value = type(self).validator(value) - self._data[key] = value + value = type(self)._validator(value) + self._data[key] = cast(T, value) - def __iter__(self): + def __iter__(self) -> Iterator[T]: + """Iterates over the values in the list.""" return iter(self._data) - def append(self, x): + def append(self, value: T): + """Appends a value to the end of the list.""" if self._readonly: raise AttributeError - x = type(self).validator(x) - self._data.append(x) + value = type(self)._validator(value) + self._data.append(value) - def extend(self, values): + def extend(self, values: Iterable[T]): + """Extends the list with the specified values.""" for x in values: self.append(x) - def insert(self, index, x): - x = type(self).validator(x) - self._data.insert(index, x) + def insert(self, index: int, value: T): + """Inserts the specified value at the specified index.""" + value = type(self)._validator(value) + self._data.insert(index, value) - def pop(self, index=-1): + def pop(self, index: int = -1) -> T: + """Removes and returns the element at the specified index.""" return self._data.pop(index) def to_json(self): + """Returns the representation as a JSON array.""" return [to_json(x) for x in self._data] def __deepcopy__(self, memo): @@ -466,15 +563,15 @@ def __repr__(self): return encode_json_for_repr(self.to_json()) -def typed_list( - wrapped_type: Callable[[Any], _T], validator=None -) -> type[TypedList[_T]]: +def typed_list(wrapped_type: Callable[[Any], T], validator=None) -> type[List[T]]: val = _normalize_validator(wrapped_type, validator) - class DerivedTypedList(TypedList): - validator = val + class _List(List): + _validator = val + + _map_type_annotation(_List, wrapped_type, lambda t: List[t]) # type: ignore[valid-type] - return DerivedTypedList + return _List def number_or_string(value): @@ -483,7 +580,13 @@ def number_or_string(value): return value +_set_type_annotation(number_or_string, Union[numbers.Real, str]) + + def bool_or_string(value): if not isinstance(value, (bool, str)): raise TypeError return value + + +_set_type_annotation(bool_or_string, Union[bool, str]) diff --git a/python/neuroglancer/local_volume.py b/python/neuroglancer/local_volume.py index 1acf5e3b2..6b11eb63b 100644 --- a/python/neuroglancer/local_volume.py +++ b/python/neuroglancer/local_volume.py @@ -42,6 +42,12 @@ class InvalidObjectIdForMesh(Exception): class LocalVolume(trackable_state.ChangeNotifier): + """Exposes a local array as a Neuroglancer data source. + + Group: + serve-data + """ + def __init__( self, data, @@ -166,15 +172,19 @@ def info(self): voxelOffset=self.voxel_offset, chunkLayout=self.chunk_layout, downsamplingLayout=self.downsampling_layout, - maxDownsampling=None - if math.isinf(self.max_downsampling) - else self.max_downsampling, - maxDownsampledSize=None - if math.isinf(self.max_downsampled_size) - else self.max_downsampled_size, - maxDownsamplingScales=None - if math.isinf(self.max_downsampling_scales) - else self.max_downsampling_scales, + maxDownsampling=( + None if math.isinf(self.max_downsampling) else self.max_downsampling + ), + maxDownsampledSize=( + None + if math.isinf(self.max_downsampled_size) + else self.max_downsampled_size + ), + maxDownsamplingScales=( + None + if math.isinf(self.max_downsampling_scales) + else self.max_downsampling_scales + ), ) if self.max_voxels_per_chunk_log2 is not None: info["maxVoxelsPerChunkLog2"] = self.max_voxels_per_chunk_log2 diff --git a/python/neuroglancer/screenshot.py b/python/neuroglancer/screenshot.py index a1f28ce1a..19dc75ad2 100644 --- a/python/neuroglancer/screenshot.py +++ b/python/neuroglancer/screenshot.py @@ -17,6 +17,12 @@ class ScreenshotSaver: + """Saves screenshots in sequentially-numbered files. + + Group: + screenshots + """ + def __init__(self, viewer, directory): self.viewer = viewer self.directory = directory diff --git a/python/neuroglancer/server.py b/python/neuroglancer/server.py index 737271701..f3408f6e3 100644 --- a/python/neuroglancer/server.py +++ b/python/neuroglancer/server.py @@ -514,11 +514,21 @@ def _get_server_token(): def set_static_content_source(*args, **kwargs): + """Specifies the Neuroglancer client hosted by the Python integration webserver. + + Group: + server + """ global global_static_content_source global_static_content_source = static.get_static_content_source(*args, **kwargs) def set_dev_server_content_source(): + """Builds the Neuroglancer client from source on demand for the Python integration. + + Group: + Server + """ static_content_url = None root_dir = os.path.join(os.path.dirname(__file__), "..", "..") build_process = subprocess.Popen( @@ -564,22 +574,39 @@ def thread_func(f): def set_server_bind_address(bind_address=None, bind_port=0): + """Sets the bind adress and port for the Python integration webserver. + + If the server is already running, this does not have any effect until the server is + restarted. + + Group: + Server + + """ if bind_address is None: bind_address = "127.0.0.1" with _global_server_lock: global_server_args.update(bind_address=bind_address, bind_port=bind_port) -def is_server_running(): +def is_server_running() -> bool: + """Returns ``True`` if the Python integration webserver is running. + + Group: + Server + """ with _global_server_lock: return global_server is not None -def stop(): +def stop() -> None: """Stop the server, invalidating any viewer URLs. This allows any previously-referenced data arrays to be garbage collected if there are no other references to them. + + Group: + server """ global global_server with _global_server_lock: @@ -589,11 +616,18 @@ def stop(): server.stop() -def get_server_url(): +def get_server_url() -> str: + if global_server is None: + raise ValueError("Server is not started") return global_server.server_url -def start(): +def start() -> None: + """Starts the Python integration webserver if not already started. + + Group: + Server + """ global global_server with _global_server_lock: if global_server is not None: @@ -612,6 +646,10 @@ def register_viewer(viewer): def defer_callback(callback, *args, **kwargs): - """Register `callback` to run in the server event loop thread.""" + """Register `callback` to run in the server event loop thread. + + Group: + Server + """ start() global_server.loop.call_soon_threadsafe(lambda: callback(*args, **kwargs)) diff --git a/python/neuroglancer/trackable_state.py b/python/neuroglancer/trackable_state.py index 8c393abfe..3649ea349 100644 --- a/python/neuroglancer/trackable_state.py +++ b/python/neuroglancer/trackable_state.py @@ -16,29 +16,48 @@ import contextlib import copy import threading +import typing from .random_token import make_random_token class ConcurrentModificationError(RuntimeError): + """Indicates a concurrent modification during an update to `.TrackableState`. + + Group: + trackable-state + """ + pass class ChangeNotifier: + """Notifies registered callbacks in response to changes. + + Group: + trackable-state + """ + + change_count: int + """Total number of changes that have occurred.""" + def __init__(self): self.__changed_callbacks = set() self.change_count = 0 self.__lock = threading.Lock() - def add_changed_callback(self, callback): + def add_changed_callback(self, callback: typing.Callable[[], None]): """Registers a callback to be invoked when the state changes. + Registering an already-registered callback is a no-op. + The callback is invoked immediately with no arguments. The callback must not block. """ with self.__lock: self.__changed_callbacks.add(callback) - def remove_changed_callback(self, callback): + def remove_changed_callback(self, callback: typing.Callable[[], None]): + """Removes a previously-registered callback.""" with self.__lock: self.__changed_callbacks.remove(callback) @@ -49,7 +68,21 @@ def _dispatch_changed_callbacks(self): callback() -class TrackableState(ChangeNotifier): +State = typing.TypeVar("State") + +Generation = str + + +class TrackableState(ChangeNotifier, typing.Generic[State]): + """State object that supports registering change notification callbacks. + + Type parameters: + State: Value type. + + Group: + trackable-state + """ + def __init__(self, wrapper_type, transform_state=None): super().__init__() self._raw_state = {} @@ -67,7 +100,27 @@ def transform_state_function(new_state): transform_state = transform_state_function self._transform_state = transform_state - def set_state(self, new_state, generation=None, existing_generation=None): + def set_state( + self, + new_state: typing.Union[typing.Any, State], + generation: typing.Optional[Generation] = None, + existing_generation: typing.Optional[Generation] = None, + ) -> Generation: + """ + Sets a new value. + + Args: + new_state: New state value to assign. + generation: Generation associated with :py:param:`.new_state`. If + not specified, a new unique generation is generated. + existing_generation: Atomically assign the new state only if the + existing state has the specified generation. + Returns: + Generation associated with the new state. + Raises: + ConcurrentModificationError: If :py:param:`.existing_generation` is + specified and does not match. + """ with self._lock: if ( existing_generation is not None @@ -87,25 +140,25 @@ def set_state(self, new_state, generation=None, existing_generation=None): return self._generation @property - def state_and_generation(self): + def state_and_generation(self) -> tuple[State, Generation]: with self._lock: return (self.state, self.state_generation) @property - def raw_state_and_generation(self): + def raw_state_and_generation(self) -> tuple[typing.Any, Generation]: with self._lock: return (self.raw_state, self.state_generation) @property - def state_generation(self): + def state_generation(self) -> Generation: return self._generation @property - def raw_state(self): + def raw_state(self) -> typing.Any: return self._raw_state @property - def state(self): + def state(self) -> State: with self._lock: wrapped_state = self._wrapped_state if wrapped_state is None: @@ -115,11 +168,12 @@ def state(self): return wrapped_state @contextlib.contextmanager - def txn(self, overwrite=False, lock=True): + def txn(self, overwrite: bool = False, lock: bool = True): """Context manager for a state modification transaction.""" if lock: self._lock.acquire() try: + existing_generation: typing.Optional[Generation] new_state, existing_generation = self.state_and_generation new_state = copy.deepcopy(new_state) yield new_state @@ -130,7 +184,7 @@ def txn(self, overwrite=False, lock=True): if lock: self._lock.release() - def retry_txn(self, func, retries=10, lock=False): + def retry_txn(self, func, retries: int = 10, lock: bool = False): for retry in range(retries): try: with self.txn(lock=lock) as s: @@ -140,5 +194,12 @@ def retry_txn(self, func, retries=10, lock=False): pass raise - def __repr__(self): + def __repr__(self) -> str: return f"{type(self).__name__}({self.state!r})" + + +__all__ = [ + "ChangeNotifier", + "TrackableState", + "ConcurrentModificationError", +] diff --git a/python/neuroglancer/url_state.py b/python/neuroglancer/url_state.py index 262663df5..c801a6840 100644 --- a/python/neuroglancer/url_state.py +++ b/python/neuroglancer/url_state.py @@ -100,17 +100,32 @@ def url_fragment_to_json(fragment_value): return url_safe_to_json(unquoted) -def parse_url_fragment(fragment_value): +def parse_url_fragment(fragment_value) -> viewer_state.ViewerState: + """Parses a Neuroglancer state from a URL fragment. + + Group: + viewer-state-url + """ json_string = url_fragment_to_json(fragment_value) return viewer_state.ViewerState(json.loads(json_string)) -def parse_url(url): +def parse_url(url: str) -> viewer_state.ViewerState: + """Parses a Neuroglancer state from a URL. + + Group: + viewer-state-url + """ result = urllib.parse.urlparse(url) return parse_url_fragment(result.fragment) -def to_url_fragment(state): +def to_url_fragment(state: viewer_state.ViewerState): + """Encodes a viewer state as a URL fragment. + + Group: + viewer-state-url + """ json_string = json.dumps( to_json(state), separators=(",", ":"), default=json_encoder_default ) @@ -120,11 +135,21 @@ def to_url_fragment(state): default_neuroglancer_url = "https://neuroglancer-demo.appspot.com" -def to_url(state, prefix=default_neuroglancer_url): +def to_url(state: viewer_state.ViewerState, prefix=default_neuroglancer_url): + """Encodes a viewer state as a URL. + + Group: + viewer-state-url + """ return f"{prefix}#!{to_url_fragment(state)}" def to_json_dump(state, indent=None, separators=None): + """Returns the JSON-encoded text representation of the viewer state object. + + Group: + viewer-state-url + """ return json.dumps( to_json(state), separators=separators, diff --git a/python/neuroglancer/viewer_base.py b/python/neuroglancer/viewer_base.py index f3068b60e..3eaad1c9f 100644 --- a/python/neuroglancer/viewer_base.py +++ b/python/neuroglancer/viewer_base.py @@ -399,7 +399,7 @@ def __init__(self, **kwargs): ) @property - def state(self): + def state(self) -> viewer_state.ViewerState: return self.shared_state.state def set_state(self, *args, **kwargs): diff --git a/python/neuroglancer/viewer_config_state.py b/python/neuroglancer/viewer_config_state.py index a5b58b800..27bb04d59 100644 --- a/python/neuroglancer/viewer_config_state.py +++ b/python/neuroglancer/viewer_config_state.py @@ -14,22 +14,24 @@ import base64 -import collections import io import numbers +import os import traceback +import typing import numpy as np from . import viewer_state from .json_wrappers import ( JsonObjectWrapper, + Map, + _set_type_annotation, array_wrapper, optional, - text_type, typed_list, + typed_map, typed_set, - typed_string_map, wrapped_property, ) @@ -37,13 +39,25 @@ _map_entry_keys = frozenset(["key", "value"]) -class SegmentIdMapEntry( - collections.namedtuple("SegmentIdMapEntry", ["key", "value", "label"]) -): - def __new__(cls, key, value=None, label=None): - return super().__new__(cls, key, value, label) +_BUILDING_DOCS = os.environ.get("NEUROGLANCER_BUILDING_DOCS") == "1" +__all__ = [] + + +def export(obj): + __all__.append(obj.__name__) + return obj + + +@export +class SegmentIdMapEntry(typing.NamedTuple): + key: int + value: typing.Optional[int] = None + label: typing.Optional[str] = None + + +@export def layer_selected_value(x): if isinstance(x, numbers.Number): return x @@ -57,6 +71,12 @@ def layer_selected_value(x): return None +_set_type_annotation( + layer_selected_value, typing.Union[None, numbers.Number, SegmentIdMapEntry] +) + + +@export class LayerSelectionState(JsonObjectWrapper): __slots__ = () supports_validation = True @@ -66,16 +86,25 @@ class LayerSelectionState(JsonObjectWrapper): value = wrapped_property("value", optional(layer_selected_value)) -LayerSelectedValues = typed_string_map(LayerSelectionState) +if typing.TYPE_CHECKING or _BUILDING_DOCS: + _LayerSelectedValuesBase = Map[str, LayerSelectionState] +else: + _LayerSelectedValuesBase = typed_map(str, LayerSelectionState) +@export +class LayerSelectedValues(_LayerSelectedValuesBase): + """Specifies the data values associated with the current mouse position.""" + + +@export class ScreenshotReply(JsonObjectWrapper): __slots__ = () - id = wrapped_property("id", text_type) + id = wrapped_property("id", str) image = wrapped_property("image", base64.b64decode) width = wrapped_property("width", int) height = wrapped_property("height", int) - image_type = imageType = wrapped_property("imageType", text_type) + image_type = imageType = wrapped_property("imageType", str) depth_data = depthData = wrapped_property("depthData", optional(base64.b64decode)) @property @@ -94,6 +123,7 @@ def depth_array(self): return np.frombuffer(depth_data, dtype=" int: + """Returns the number of starred segments.""" return len(self._data) - def __contains__(self, segment_id) -> bool: + def __contains__(self, segment_id: typing.Any) -> bool: + """Checks if a segment is starred.""" return segment_id in self._data - def keys(self): + def keys(self) -> collections.abc.KeysView[int]: + """Returns a view of the starred segments.""" return self._data.keys() - def values(self): + def values(self) -> collections.abc.ValuesView[bool]: + """Returns a view of the visibility state of each starred segment.""" return self._data.values() - def items(self): + def items(self) -> collections.abc.ItemsView[int, bool]: + """Returns a view of the (segment, visible) pairs.""" return self._data.items() - def __eq__(self, other): + def __eq__(self, other) -> bool: if isinstance(other, StarredSegments): return self._data == other._data return self._data == other def add(self, segment_id: int) -> None: + """Adds a starred segment, marking it visible if not already starred.""" if self._readonly: raise AttributeError self.setdefault(segment_id, True) - def get(self, segment_id: int, default_value=None) -> bool: - return self._data.get(segment_id, default_value) + @typing.overload + def get(self, segment_id: int) -> typing.Optional[bool]: ... + + @typing.overload + def get(self, segment_id: int, default: T) -> typing.Union[bool, T]: ... + + def get(self, segment_id: int, default=None): + """Checks if a segment is visible. + + Args: + segment_id: Segment to check. + default: Return value if :py:param:`.segment_id` is not starred. + + Returns: + `True` if visible, `False` if starred but not visible, + :py:param:`.default` if not starred. + """ + return self._data.get(segment_id, default) def __getitem__(self, segment_id: int) -> bool: + """Checks if a starred segment is visible.""" return self._data[segment_id] def remove(self, segment_id: int) -> None: + """Removes a segment from the starred list. + + Raises: + KeyError: if the segment is not starred. + """ if self._readonly: raise AttributeError del self._data[segment_id] self._visible.pop(segment_id) def discard(self, segment_id: int) -> None: + """Removes a segment from the starred list if present.""" self._data.pop(segment_id, None) self._visible.pop(segment_id, None) def __setitem__(self, segment_id: int, visible: bool) -> None: + """Stars and sets the visibility of a segment.""" if self._readonly: raise AttributeError self._data[segment_id] = visible @@ -739,12 +780,18 @@ def __setitem__(self, segment_id: int, visible: bool) -> None: self._visible.pop(segment_id, None) def __delitem__(self, segment_id: int) -> None: + """Removes a segment from the starred list. + + Raises: + KeyError: if the segment is not starred. + """ if self._readonly: raise AttributeError del self._data[segment_id] self._visible.pop(segment_id, None) def clear(self): + """Unstars all segments.""" if self._readonly: raise AttributeError self._data.clear() @@ -753,22 +800,31 @@ def clear(self): def __repr__(self): return f"StarredSegments({self._data!r})" - def update(self, other): + def update( # type: ignore[override] + self, + other: typing.Union[ + "StarredSegments", + collections.abc.MutableMapping[int, bool], + typing.Iterable[typing.Union[int, str, tuple[int, bool]]], + ], + ): + """Merges in additional starred segments.""" if self._readonly: raise AttributeError self._update(other) - def to_json(self): + def to_json(self) -> list[str]: + """Returns the representation as a list of strings.""" return [ f"{segment}" if visible else f"!{segment}" for segment, visible in self.items() ] - def __iter__(self): + def __iter__(self) -> typing.Iterator[int]: return iter(self._data) @property - def visible(self): + def visible(self) -> "VisibleSegments": return VisibleSegments(self) @visible.setter @@ -785,29 +841,39 @@ def visible(self, segments: collections.abc.Iterable[int]): @export class VisibleSegments(collections.abc.MutableSet[int]): + """Subset of visible segments within a `StarredSegments` object.""" + def __init__(self, starred_segments: StarredSegments): + """Constructs a view of the visible segments within a ``StarredSegments`` object.""" self._starred_segments = starred_segments self._visible = self._starred_segments._visible - def __len__(self): + def __len__(self) -> int: + """Returns the number of visible segments.""" return len(self._visible) def clear(self): + """Unstars all segments.""" self._starred_segments.clear() - def __contains__(self, segment_id): + def __contains__(self, segment_id: typing.Any) -> bool: + """Checks if a segment is visible.""" return segment_id in self._visible def add(self, segment_id: int) -> None: + """Stars a segment and marks it visible.""" self._starred_segments[segment_id] = True def discard(self, segment_id) -> None: + """Unstars a segment if present.""" self._starred_segments.discard(segment_id) - def __iter__(self): + def __iter__(self) -> typing.Iterator[int]: + """Iterates over the visible segments.""" return iter(self._visible) - def copy(self): + def copy(self) -> "VisibleSegments": + """Returns a copy of the visible segment list.""" new_starred_segments = StarredSegments() new_visible = self._visible.copy() new_starred_segments._data = new_visible @@ -883,12 +949,12 @@ def skeleton_shader(self, shader): mesh_silhouette_rendering = meshSilhouetteRendering = wrapped_property( "meshSilhouetteRendering", optional(float, 0) ) - segment_query = segmentQuery = wrapped_property("segmentQuery", optional(text_type)) + segment_query = segmentQuery = wrapped_property("segmentQuery", optional(str)) segment_colors = segmentColors = wrapped_property( - "segmentColors", typed_map(key_type=np.uint64, value_type=text_type) + "segmentColors", typed_map(key_type=np.uint64, value_type=str) ) segment_default_color = segmentDefaultColor = wrapped_property( - "segmentDefaultColor", optional(text_type) + "segmentDefaultColor", optional(str) ) @property @@ -906,7 +972,7 @@ def segment_html_color_dict(self): return d linked_segmentation_group = linkedSegmentationGroup = wrapped_property( - "linkedSegmentationGroup", optional(text_type) + "linkedSegmentationGroup", optional(str) ) linked_segmentation_color_group = linkedSegmentationColorGroup = wrapped_property( "linkedSegmentationColorGroup", optional(_linked_segmentation_color_group_value) @@ -929,26 +995,67 @@ def __init__(self, *args, **kwargs): source = wrapped_property("source", LayerDataSources) vertex_attribute_sources = vertexAttributeSources = wrapped_property( - "vertexAttributeSources", optional(typed_list(text_type)) + "vertexAttributeSources", optional(typed_list(str)) ) - shader = wrapped_property("shader", text_type) + shader = wrapped_property("shader", str) vertex_attribute_names = vertexAttributeNames = wrapped_property( - "vertexAttributeNames", optional(typed_list(optional(text_type))) - ) + "vertexAttributeNames", optional(typed_list(optional(str))) + ) + + +def _factory_new( + registry: collections.abc.Mapping[str, type], + base_class: type, + cls: type, + allow_str: bool, + obj: typing.Any, + _readonly: bool, + kwargs, +): + if cls is base_class: + if isinstance(obj, base_class): + cls = type(obj) + else: + if allow_str and isinstance(obj, str): + t = obj + obj = {"type": obj} + else: + if not isinstance(obj, dict): + raise TypeError("Expected dict", obj) + t = obj.get("type") # type: ignore[assignment] + cls = registry[t] # type: ignore[index] + return type.__call__(cls, obj, _readonly=_readonly, **kwargs) + + +class _AnnotationMetaclass(type): + def __call__(self, obj: typing.Any = None, _readonly: bool = False, **kwargs): + return _factory_new( + registry=annotation_types, + base_class=Annotation, + cls=self, + allow_str=False, + obj=obj, + _readonly=_readonly, + kwargs=kwargs, + ) -class AnnotationBase(JsonObjectWrapper): +class Annotation(JsonObjectWrapper, metaclass=_AnnotationMetaclass): __slots__ = () - id = wrapped_property("id", optional(text_type)) # pylint: disable=invalid-name - type = wrapped_property("type", text_type) - description = wrapped_property("description", optional(text_type)) + id = wrapped_property("id", optional(str)) # pylint: disable=invalid-name + type = wrapped_property("type", str) + description = wrapped_property("description", optional(str)) segments = wrapped_property("segments", optional(typed_list(typed_list(np.uint64)))) props = wrapped_property("props", optional(typed_list(number_or_string))) + def __new__(cls, obj=None, _readonly: bool = False, **kwargs): + """Coerces the argument to an `Annotation`.""" + return object.__new__(cls) + @export -class PointAnnotation(AnnotationBase): +class PointAnnotation(Annotation): __slots__ = () def __init__(self, *args, **kwargs): @@ -958,7 +1065,7 @@ def __init__(self, *args, **kwargs): @export -class LineAnnotation(AnnotationBase): +class LineAnnotation(Annotation): __slots__ = () def __init__(self, *args, **kwargs): @@ -969,7 +1076,7 @@ def __init__(self, *args, **kwargs): @export -class AxisAlignedBoundingBoxAnnotation(AnnotationBase): +class AxisAlignedBoundingBoxAnnotation(Annotation): __slots__ = () def __init__(self, *args, **kwargs): @@ -980,7 +1087,7 @@ def __init__(self, *args, **kwargs): @export -class EllipsoidAnnotation(AnnotationBase): +class EllipsoidAnnotation(Annotation): __slots__ = () def __init__(self, *args, **kwargs): @@ -998,29 +1105,17 @@ def __init__(self, *args, **kwargs): } -def annotation(obj, _readonly=False): - if isinstance(obj, AnnotationBase): - obj = obj.to_json() - elif not isinstance(obj, dict): - raise TypeError - t = obj.get("type") - return annotation_types[t](obj, _readonly=_readonly) - - -annotation.supports_readonly = True # type: ignore[attr-defined] - - @export class AnnotationPropertySpec(JsonObjectWrapper): __slots__ = () - id = wrapped_property("id", text_type) - type = wrapped_property("type", text_type) - description = wrapped_property("description", optional(text_type)) + id = wrapped_property("id", str) + type = wrapped_property("type", str) + description = wrapped_property("description", optional(str)) default = wrapped_property("default", optional(number_or_string)) enum_values = wrapped_property( "enum_values", optional(typed_list(number_or_string)) ) - enum_labels = wrapped_property("enum_labels", optional(typed_list(text_type))) + enum_labels = wrapped_property("enum_labels", optional(typed_list(str))) @export @@ -1031,23 +1126,23 @@ def __init__(self, *args, **kwargs): super().__init__(*args, type="annotation", **kwargs) source = wrapped_property("source", LayerDataSources) - annotations = wrapped_property("annotations", typed_list(annotation)) + annotations = wrapped_property("annotations", typed_list(Annotation)) annotation_properties = annotationProperties = wrapped_property( "annotationProperties", typed_list(AnnotationPropertySpec) ) annotation_relationships = annotationRelationships = wrapped_property( - "annotationRelationships", typed_list(text_type) + "annotationRelationships", typed_list(str) ) linked_segmentation_layer = linkedSegmentationLayer = wrapped_property( - "linkedSegmentationLayer", typed_string_map(text_type) + "linkedSegmentationLayer", typed_map(str, str) ) filter_by_segmentation = filterBySegmentation = wrapped_property( - "filterBySegmentation", typed_list(text_type) + "filterBySegmentation", typed_list(str) ) ignore_null_segment_filter = ignoreNullSegmentFilter = wrapped_property( "ignoreNullSegmentFilter", optional(bool, True) ) - shader = wrapped_property("shader", text_type) + shader = wrapped_property("shader", str) shader_controls = shaderControls = wrapped_property( "shaderControls", ShaderControls ) @@ -1195,9 +1290,7 @@ def __init__(self, json_data, _readonly=False): ) elif isinstance(layer, dict): self._layers.append( - ManagedLayer( - text_type(layer["name"]), layer, _readonly=_readonly - ) + ManagedLayer(str(layer["name"]), layer, _readonly=_readonly) ) else: raise TypeError @@ -1293,7 +1386,7 @@ def interpolate(a, b, t): if index == -1: continue other_layer = b[index] - if type(other_layer.layer) is not type(layer.layer): # pylint: disable=unidiomatic-typecheck # noqa: E721 + if type(other_layer.layer) is not type(layer.layer): # noqa: E721 continue layer.layer = type(layer.layer).interpolate( layer.layer, other_layer.layer, t @@ -1309,15 +1402,24 @@ def navigation_link_type(x): return x -_T = typing.TypeVar("_T") +_set_type_annotation( + navigation_link_type, typing.Literal["linked", "unlinked", "relative"] +) + + +@export +class LinkedType(typing.Generic[T], JsonObjectWrapper): + """Value linked to another value in the viewer state. + Type parameters: + T: Value type. + """ -class LinkedType(typing.Generic[_T], JsonObjectWrapper): __slots__ = () link = wrapped_property("link", optional(navigation_link_type, "linked")) - value: _T + value: T - interpolate_function: typing.ClassVar[ + _interpolate_function: typing.ClassVar[ typing.Callable[[typing.Any, typing.Any, float], typing.Any] ] @@ -1326,31 +1428,27 @@ def interpolate(cls, a, b, t): c = copy.deepcopy(a) c.link = a.link if a.link == b.link and a.link != "linked": - c.value = cls.interpolate_function(a.value, b.value, t) + c.value = cls._interpolate_function(a.value, b.value, t) return c return c def make_linked_navigation_type( - value_type: typing.Callable[[typing.Any], _T], interpolate_function=None -) -> type[LinkedType[_T]]: + value_type: typing.Callable[[typing.Any], T], interpolate_function=None +) -> type[LinkedType[T]]: if interpolate_function is None: - _interpolate_function = value_type.interpolate # type: ignore[attr-defined] - else: - _interpolate_function = interpolate_function - - _value_type = value_type + interpolate_function = value_type.interpolate # type: ignore[attr-defined] class Linked(LinkedType): __slots__ = () - value_type = _value_type - interpolate_function = _interpolate_function + _value_type = value_type + _interpolate_function = interpolate_function value = wrapped_property("value", optional(value_type)) return Linked -if typing.TYPE_CHECKING: +if typing.TYPE_CHECKING or _BUILDING_DOCS: _LinkedPositionBase = LinkedType[np.typing.NDArray[np.float32]] else: _LinkedPositionBase = make_linked_navigation_type( @@ -1363,7 +1461,7 @@ class LinkedPosition(_LinkedPositionBase): __slots__ = () -if typing.TYPE_CHECKING: +if typing.TYPE_CHECKING or _BUILDING_DOCS: _LinkedZoomFactorBase = LinkedType[float] else: _LinkedZoomFactorBase = make_linked_navigation_type(float, interpolate_zoom) @@ -1374,7 +1472,7 @@ class LinkedZoomFactor(_LinkedZoomFactorBase): __slots__ = () -if typing.TYPE_CHECKING: +if typing.TYPE_CHECKING or _BUILDING_DOCS: _LinkedDepthRangeBase = LinkedType[float] else: _LinkedDepthRangeBase = make_linked_navigation_type(float, interpolate_zoom) @@ -1385,7 +1483,7 @@ class LinkedDepthRange(_LinkedDepthRangeBase): __slots__ = () -if typing.TYPE_CHECKING: +if typing.TYPE_CHECKING or _BUILDING_DOCS: _LinkedOrientationStateBase = LinkedType[np.typing.NDArray[np.float32]] else: _LinkedOrientationStateBase = make_linked_navigation_type( @@ -1421,10 +1519,10 @@ def interpolate(a, b, t): return c -if typing.TYPE_CHECKING: - _CrossSectionMapBase = TypedStringMap[CrossSection] +if typing.TYPE_CHECKING or _BUILDING_DOCS: + _CrossSectionMapBase = Map[str, CrossSection] else: - _CrossSectionMapBase = typed_string_map(CrossSection) + _CrossSectionMapBase = typed_map(str, CrossSection) @export @@ -1441,7 +1539,7 @@ def interpolate(a, b, t): @export class DataPanelLayout(JsonObjectWrapper): __slots__ = () - type = wrapped_property("type", text_type) + type = wrapped_property("type", str) cross_sections = crossSections = wrapped_property("crossSections", CrossSectionMap) orthographic_projection = orthographicProjection = wrapped_property( "orthographicProjection", optional(bool, False) @@ -1500,13 +1598,19 @@ def layout_specification(x, _readonly=False): return layout_type(x, _readonly=_readonly) +_set_type_annotation( + layout_specification, + typing.Union["StackLayout", "LayerGroupViewer", "DataPanelLayout"], +) + + layout_specification.supports_readonly = True # type: ignore[attr-defined] @export class StackLayout(JsonObjectWrapper): __slots__ = () - type = wrapped_property("type", text_type) + type = wrapped_property("type", str) flex = wrapped_property("flex", optional(float, 1)) children = wrapped_property("children", typed_list(layout_specification)) @@ -1539,11 +1643,21 @@ def interpolate(a, b, t): @export def row_layout(children): + """Creates a row-oriented `StackLayout`. + + Group: + viewer-state + """ return StackLayout(type="row", children=children) @export def column_layout(children): + """Creates a column-oriented `StackLayout`. + + Group: + viewer-state + """ return StackLayout(type="column", children=children) @@ -1556,13 +1670,13 @@ def interpolate_layout(a, b, t): @export class LayerGroupViewer(JsonObjectWrapper): __slots__ = () - type = wrapped_property("type", text_type) + type = wrapped_property("type", str) flex = wrapped_property("flex", optional(float, 1)) - layers = wrapped_property("layers", typed_list(text_type)) + layers = wrapped_property("layers", typed_list(str)) layout = wrapped_property("layout", data_panel_layout_wrapper("xy")) position = wrapped_property("position", LinkedPosition) velocity = wrapped_property( - "velocity", typed_map(key_type=text_type, value_type=DimensionPlaybackVelocity) + "velocity", typed_map(key_type=str, value_type=DimensionPlaybackVelocity) ) cross_section_orientation = crossSectionOrientation = wrapped_property( "crossSectionOrientation", LinkedOrientationState @@ -1583,7 +1697,7 @@ class LayerGroupViewer(JsonObjectWrapper): "projectionDepth", LinkedDepthRange ) tool_bindings = toolBindings = wrapped_property( - "toolBindings", typed_map(key_type=text_type, value_type=tool) + "toolBindings", typed_map(key_type=str, value_type=Tool) ) def __init__(self, *args, **kwargs): @@ -1630,19 +1744,19 @@ def add_data_panel_layout_types(): @export class ViewerState(JsonObjectWrapper): __slots__ = () - title = wrapped_property("title", optional(text_type)) + title = wrapped_property("title", optional(str)) dimensions = wrapped_property("dimensions", CoordinateSpace) relative_display_scales = relativeDisplayScales = wrapped_property( - "relativeDisplayScales", optional(typed_string_map(float)) + "relativeDisplayScales", optional(typed_map(str, float)) ) display_dimensions = displayDimensions = wrapped_property( - "displayDimensions", optional(typed_list(text_type)) + "displayDimensions", optional(typed_list(str)) ) position = voxel_coordinates = wrapped_property( "position", optional(array_wrapper(np.float32)) ) velocity = wrapped_property( - "velocity", typed_map(key_type=text_type, value_type=DimensionPlaybackVelocity) + "velocity", typed_map(key_type=str, value_type=DimensionPlaybackVelocity) ) cross_section_orientation = crossSectionOrientation = wrapped_property( "crossSectionOrientation", optional(array_wrapper(np.float32, 4)) @@ -1691,10 +1805,10 @@ class ViewerState(JsonObjectWrapper): layers = wrapped_property("layers", Layers) layout = wrapped_property("layout", layout_specification) cross_section_background_color = crossSectionBackgroundColor = wrapped_property( - "crossSectionBackgroundColor", optional(text_type) + "crossSectionBackgroundColor", optional(str) ) projection_background_color = projectionBackgroundColor = wrapped_property( - "projectionBackgroundColor", optional(text_type) + "projectionBackgroundColor", optional(str) ) selected_layer = selectedLayer = wrapped_property( "selectedLayer", SelectedLayerState @@ -1711,7 +1825,7 @@ class ViewerState(JsonObjectWrapper): ), ) tool_bindings = toolBindings = wrapped_property( - "toolBindings", typed_map(key_type=text_type, value_type=tool) + "toolBindings", typed_map(key_type=str, value_type=Tool) ) @staticmethod diff --git a/python/tests/client_test.py b/python/tests/client_test.py index 58c445f7a..50f45ce3d 100644 --- a/python/tests/client_test.py +++ b/python/tests/client_test.py @@ -23,7 +23,7 @@ import numpy as np import PIL.Image import pytest -import pytest_html # type: ignore[import-untyped] +import pytest_html # type: ignore[import-untyped,import] root_dir = os.path.join(os.path.dirname(__file__), "..", "..") examples_dir = os.path.join(os.path.dirname(__file__), "..", "..", "examples") diff --git a/python/tests/json_wrappers_test.py b/python/tests/json_wrappers_test.py new file mode 100644 index 000000000..7a6f2fad3 --- /dev/null +++ b/python/tests/json_wrappers_test.py @@ -0,0 +1,52 @@ +# @license +# Copyright 2024 Google Inc. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from neuroglancer import json_wrappers + +IntIntMap = json_wrappers.typed_map(int, int) +IntList = json_wrappers.typed_list(int) + + +def test_map_construct(): + m = IntIntMap({10: 15, 20: 30}) + assert m.keys() == {10, 20} + assert list(m.keys()) == [10, 20] + assert len(m.keys()) == 2 + assert list(m.values()) == [15, 30] + assert 15 in m.values() + assert 16 not in m.values() + assert len(m.values()) == 2 + assert m.items() == {(10, 15), (20, 30)} + assert len(m.items()) == 2 + assert (10, 15) in m.items() + assert (10, 16) not in m.items() + assert (5, 15) not in m.items() + + assert m.get(5) is None + assert m.get(5, 6) == 6 + assert m.get(10) == 15 + assert m.get(10, 16) == 15 + + +def test_list_construct(): + x = IntList([1, "2", 3]) + assert len(x) == 3 + assert list(x) == [1, 2, 3] + x.append("4") + assert x[-1] == 4 + with pytest.raises(ValueError): + x.append("abc") + with pytest.raises(TypeError): + x.append([]) diff --git a/python/tests/viewer_state_test.py b/python/tests/viewer_state_test.py index 1dc21fc0a..5f2edb0b0 100644 --- a/python/tests/viewer_state_test.py +++ b/python/tests/viewer_state_test.py @@ -103,3 +103,16 @@ def test_layers(): layers_rw = viewer_state.Layers(layer_json) del layers_rw[:] assert layers_rw.to_json() == [] + + +def test_tool(): + p = viewer_state.Tool("shaderControl", control="abc") + assert isinstance(p, viewer_state.ShaderControlTool) + assert p.control == "abc" + + p2 = viewer_state.ShaderControlTool(control="abc") + assert p2.control == "abc" + + +def test_annotation(): + viewer_state.PointAnnotation(point=[1]) diff --git a/python/tests/write_annotations_test.py b/python/tests/write_annotations_test.py index b634fbe82..723727b75 100644 --- a/python/tests/write_annotations_test.py +++ b/python/tests/write_annotations_test.py @@ -21,8 +21,7 @@ def test_annotation_writer_axis_aligned_bounding_box(tmp_path: pathlib.Path): - dim_dict = {"names": ["x", "y"], "units": ["m", "m"], "scales": [1, 1]} - coordinate_space = neuroglancer.CoordinateSpace(**dim_dict) + coordinate_space = neuroglancer.CoordinateSpace(names=["x", "y"], units="m") writer = write_annotations.AnnotationWriter( coordinate_space=coordinate_space, annotation_type="axis_aligned_bounding_box" ) @@ -34,8 +33,7 @@ def test_annotation_writer_axis_aligned_bounding_box(tmp_path: pathlib.Path): def test_annotation_writer_point(tmp_path: pathlib.Path): - dim_dict = {"names": ["x", "y"], "units": ["m", "m"], "scales": [1, 1]} - coordinate_space = neuroglancer.CoordinateSpace(**dim_dict) + coordinate_space = neuroglancer.CoordinateSpace(names=["x", "y"], units="m") writer = write_annotations.AnnotationWriter( coordinate_space=coordinate_space, annotation_type="point" ) From 61d9fa12888d82ba2fe453593cafe27ecf80f193 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Fri, 28 Jun 2024 12:23:47 -0700 Subject: [PATCH 24/45] docs: Add initial sphinx documentation The documentation is still a work in progress. --- .firebaserc | 5 +- .github/workflows/build.yml | 42 ++- .github/workflows/build_docs_preview.yml | 29 ++ .github/workflows/deploy_docs_preview.yml | 67 ++++ .github/workflows/deploy_preview.yml | 1 + docs/concepts/coordinate_spaces.dot | 218 ++++++++++++ docs/concepts/coordinate_spaces.rst | 272 +++++++++++++++ ...data_source_coordinate_space.screenshot.py | 59 ++++ ..._source_coordinate_transform.screenshot.py | 59 ++++ docs/concepts/data_views.rst | 18 + docs/concepts/layers.rst | 26 ++ docs/conf.py | 324 ++++++++++++++++++ docs/index.rst | 34 ++ docs/intersphinx_inv/numpy.inv | Bin 0 -> 81031 bytes docs/intersphinx_inv/python3.inv | Bin 0 -> 136387 bytes docs/intersphinx_inv/tensorstore.inv | Bin 0 -> 20867 bytes docs/json/api/index.rst | 33 ++ docs/json_schema/layer.yml | 14 + docs/json_schema/viewer_state.yml | 252 ++++++++++++++ docs/pyproject.toml | 2 + docs/python/api/.gitignore | 2 + docs/python/api/index.rst | 78 +++++ docs/requirements.txt | 7 + docs/update_intersphinx_inventories.py | 42 +++ docs/user-guide/navigation.rst | 43 +++ ...ion_mouse_cross_section_translate.video.py | 28 ++ ...vigation_mouse_cross_section_zoom.video.py | 30 ++ firebase.json | 4 + noxfile.py | 21 ++ 29 files changed, 1707 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/build_docs_preview.yml create mode 100644 .github/workflows/deploy_docs_preview.yml create mode 100644 docs/concepts/coordinate_spaces.dot create mode 100644 docs/concepts/coordinate_spaces.rst create mode 100644 docs/concepts/data_source_coordinate_space.screenshot.py create mode 100644 docs/concepts/data_source_coordinate_transform.screenshot.py create mode 100644 docs/concepts/data_views.rst create mode 100644 docs/concepts/layers.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/intersphinx_inv/numpy.inv create mode 100644 docs/intersphinx_inv/python3.inv create mode 100644 docs/intersphinx_inv/tensorstore.inv create mode 100644 docs/json/api/index.rst create mode 100644 docs/json_schema/layer.yml create mode 100644 docs/json_schema/viewer_state.yml create mode 100644 docs/pyproject.toml create mode 100644 docs/python/api/.gitignore create mode 100644 docs/python/api/index.rst create mode 100644 docs/requirements.txt create mode 100644 docs/update_intersphinx_inventories.py create mode 100644 docs/user-guide/navigation.rst create mode 100644 docs/user-guide/navigation_mouse_cross_section_translate.video.py create mode 100644 docs/user-guide/navigation_mouse_cross_section_zoom.video.py diff --git a/.firebaserc b/.firebaserc index 304a4ac8a..4c28ddc88 100644 --- a/.firebaserc +++ b/.firebaserc @@ -7,9 +7,12 @@ "hosting": { "app": [ "neuroglancer" + ], + "docs": [ + "neuroglancer-docs" ] } } }, "etags": {} -} \ No newline at end of file +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f03241824..23b4528ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -101,7 +101,7 @@ jobs: # - name: Setup tmate session # uses: mxschmitt/action-tmate@v3 - name: Install Python packaging/test tools - run: python -m pip install --upgrade pip tox nox wheel numpy -r python/requirements-test.txt + run: pip install --upgrade pip tox nox wheel numpy -r python/requirements-test.txt - uses: ./.github/actions/setup-firefox - run: nox -s lint format mypy - name: Check for dirty working directory @@ -178,6 +178,29 @@ jobs: dist/*.whl dist/*.tar.gz + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@b1de5da23ed0a6d14e0aeee8ed52fdd87af2363c # v2.0.2 + with: + macos-skip-brew-update: "true" + - name: Install nox + run: pip install nox + - name: Build docs + run: nox -s docs + - name: Upload docs as artifact + uses: actions/upload-artifact@v4 + with: + name: docs + path: | + dist/docs + publish-package: # Only publish package on push to tag or default branch. if: ${{ github.event_name == 'push' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master') }} @@ -185,6 +208,7 @@ jobs: needs: - "client" - "python-build-package" + - "docs" steps: - uses: actions/checkout@v4 - name: Use Node.js @@ -224,12 +248,26 @@ jobs: with: name: client path: dist/client - - name: Publish to Firebase hosting + - name: Publish client to Firebase hosting + uses: FirebaseExtended/action-hosting-deploy@v0 + with: + firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" + projectId: neuroglancer-demo + channelId: live + target: app + # Download dist/docs after publishing to PyPI, because PyPI publish + # action fails if dist/docs directory is present. + - uses: actions/download-artifact@v4 + with: + name: docs + path: dist/docs + - name: Publish docs to Firebase hosting uses: FirebaseExtended/action-hosting-deploy@v0 with: firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" projectId: neuroglancer-demo channelId: live + target: docs ngauth: strategy: diff --git a/.github/workflows/build_docs_preview.yml b/.github/workflows/build_docs_preview.yml new file mode 100644 index 000000000..77523f7f2 --- /dev/null +++ b/.github/workflows/build_docs_preview.yml @@ -0,0 +1,29 @@ +name: Build docs preview + +on: + pull_request: + +jobs: + upload: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@b1de5da23ed0a6d14e0aeee8ed52fdd87af2363c # v2.0.2 + with: + macos-skip-brew-update: "true" + - name: Install nox + run: pip install nox + - name: Build documentation + run: nox -s docs + - name: Upload client as artifact + uses: actions/upload-artifact@v4 + with: + name: docs + path: | + dist/docs/ diff --git a/.github/workflows/deploy_docs_preview.yml b/.github/workflows/deploy_docs_preview.yml new file mode 100644 index 000000000..68207e200 --- /dev/null +++ b/.github/workflows/deploy_docs_preview.yml @@ -0,0 +1,67 @@ +name: Deploy docs preview + +on: + workflow_run: + workflows: ["Build docs preview"] + types: [completed] + +jobs: + deploy: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: "Create commit status" + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const commitId = "${{ github.event.workflow_run.head_commit.id }}"; + await github.rest.repos.createCommitStatus({ + context: "docs-preview", + owner: context.repo.owner, + repo: context.repo.repo, + sha: commitId, + state: "pending", + description: `Creating preview`, + target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, + }); + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: docs + path: dist/docs + github-token: "${{ secrets.GITHUB_TOKEN }}" + run-id: "${{ github.event.workflow_run.id }}" + - name: Get PR ID + # https://github.com/orgs/community/discussions/25220#discussioncomment-7532132 + id: pr-id + run: | + PR_ID=$(gh run view -R ${{ github.repository }} ${{ github.event.workflow_run.id }} | grep -oP '#[0-9]+ . ${{ github.event.workflow_run.id }}' | grep -oP '#[0-9]+' | cut -c 2-) + echo "pr-id=${PR_ID}" >> $GITHUB_OUTPUT + env: + GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + - uses: FirebaseExtended/action-hosting-deploy@v0 + id: deploy + with: + repoToken: "${{ secrets.GITHUB_TOKEN }}" + firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" + expires: 30d + channelId: "pr${{ steps.pr-id.outputs.pr-id }}-docs" + projectId: neuroglancer-demo + target: docs + - name: "Update commit status" + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const expires = new Date("${{ steps.deploy.outputs.expire_time }}"); + const commitId = "${{ github.event.workflow_run.head_commit.id }}"; + await github.rest.repos.createCommitStatus({ + context: "docs-preview", + owner: context.repo.owner, + repo: context.repo.repo, + sha: commitId, + state: "success", + target_url: "${{ steps.deploy.outputs.details_url }}", + description: `Preview created, expires at: ${expires.toISOString()}`, + }); diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 545bda17c..bdde334d0 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -48,6 +48,7 @@ jobs: expires: 30d channelId: "pr${{ steps.pr-id.outputs.pr-id }}" projectId: neuroglancer-demo + target: docs - name: "Update commit status" uses: actions/github-script@v7 with: diff --git a/docs/concepts/coordinate_spaces.dot b/docs/concepts/coordinate_spaces.dot new file mode 100644 index 000000000..f8a45fceb --- /dev/null +++ b/docs/concepts/coordinate_spaces.dot @@ -0,0 +1,218 @@ +digraph coordinate_spaces { + newrank = true; + outputorder = "edgesfirst"; + compound = true; + + node [ + style="rounded" + shape=rect + ] + + edge [ + ] + + graph [ + rankdir = LR + fillcolor = "var(--md-default-fg-color--lightest)" + style="solid,filled" + ] + { + rank=same; + projection_view_space cross_section_view_space global_space + } + + subgraph cluster_layer { + label = i> + + subgraph cluster_datasource { + label = j> + + { rank=same; + + datasource_space [ + label="Coordinate space" + href="#data-source-coordinate-space" + ] + + datasource_transform [ + label = "Coordinate transform" + href="#data-source-coordinate-transform" + ] + + } + style="filled,dashed" + } + + { + rank = same; + + subgraph cluster_layer_space { + label = "Coordinate space" + + layer_global_dims [ + label="Global dimensions" + ] + layer_local_dims [ + label="Local dimensions" + ] + layer_channel_dims [ + label="Channel dimensions" + ] + } + + layer_position [ + label = "Local position" + ] + } + + datasource_space -> datasource_transform + datasource_transform -> layer_local_dims [ + lhead="cluster_layer_space" + ] + style="filled,dashed" + } + + global_space [ + label="Global\ncoordinate\nspace" + ] + + layer_global_dims -> global_space [ + label="Merge" + ] + + subgraph cluster_globalcamera { + label = "Global camera parameters" + + subgraph cluster_globalcamera_cross_section { + + label = "Cross-section" + + global_cross_section_orientation [ + label = "Orientation" + ] + + global_cross_section_scale [ + label = "Scale" + ] + global_cross_section_depth [ + label = "Depth bounds" + ] + } + + global_center_position [ + label = "Center position" + ] + + global_display_dimensions [ + label = "Display dimensions" + ] + + global_relative_display_scales [ + label = "Relative\ndisplay scales" + ] + + subgraph cluster_globalcamera_projection { + + label = "3-d projection" + + global_projection_orientation [ + label = "Orientation" + ] + + global_projection_scale [ + label = "Scale" + ] + + global_projection_depth [ + label = "Depth bounds" + ] + } + } + + subgraph cluster_layergroupviewer { + label = k> + + layergroupviewer_center_position [ + label = "Center position" + ] + + layergroupviewer_display_dimensions [ + label = "Display dimensions" + ] + + layergroupviewer_relative_display_scales [ + label = "Relative\ndisplay scales" + ] + + subgraph cluster_layergroupviewer_cross_section { + label = "Cross-section views" + + layergroupviewer_cross_section_orientation [ + label = "Orientation" + ] + + layergroupviewer_cross_section_scale [ + label = "Scale" + ] + layergroupviewer_cross_section_depth [ + label = "Depth bounds" + ] + cross_section_view_space [ + label = "View\ncoordinate\nspace" + ] + } + + subgraph cluster_layergroupviewer_projection { + label = "3-d projection view" + + layergroupviewer_projection_orientation [ + label = "Orientation" + ] + + layergroupviewer_projection_scale [ + label = "Scale" + ] + + layergroupviewer_projection_depth [ + label = "Depth bounds" + ] + + projection_view_space [ + label = "View\ncoordinate\nspace" + ] + + } + + { layergroupviewer_display_dimensions, + layergroupviewer_relative_display_scales, + layergroupviewer_center_position, + layergroupviewer_cross_section_depth, + layergroupviewer_cross_section_scale, + layergroupviewer_cross_section_orientation } -> cross_section_view_space + + { layergroupviewer_display_dimensions, + layergroupviewer_relative_display_scales, + layergroupviewer_center_position, + layergroupviewer_projection_depth, + layergroupviewer_projection_scale, + layergroupviewer_projection_orientation } -> projection_view_space + style="filled,dashed" + } + + { + edge [ + style=dotted + ] + global_center_position -> layergroupviewer_center_position + global_cross_section_orientation -> layergroupviewer_cross_section_orientation + global_cross_section_scale -> layergroupviewer_cross_section_scale + global_cross_section_depth -> layergroupviewer_cross_section_depth + global_projection_orientation -> layergroupviewer_projection_orientation + global_projection_scale -> layergroupviewer_projection_scale + global_projection_depth -> layergroupviewer_projection_depth + global_display_dimensions -> layergroupviewer_display_dimensions + global_relative_display_scales -> layergroupviewer_relative_display_scales + } + + global_space -> {cross_section_view_space,projection_view_space} +} diff --git a/docs/concepts/coordinate_spaces.rst b/docs/concepts/coordinate_spaces.rst new file mode 100644 index 000000000..7b81b3138 --- /dev/null +++ b/docs/concepts/coordinate_spaces.rst @@ -0,0 +1,272 @@ +.. _coordinate-spaces: + +Coordinate spaces +================= + +A *coordinate space* associates a semantic meaning to *coordinate vectors* +within that space, vectors of real-valued coordinates specifying a coordinate +for each dimension of the coordinate space. At any given time, a coordinate +space has a fixed number of dimensions, called the *rank* of the coordinate +space. + +Commonly, Neuroglancer is used with 3-dimensional data, and hence coordinate +spaces of rank 3, but Neuroglancer supports degenerate coordinate spaces of rank +0, and there is no explicit upper limit on the number of dimensions. + +In addition to rank, coordinate spaces have several other properties: + +- The coordinate space specifies a unique name for each dimension, such as + ``x``, ``y``, or ``z``. Dimension names must match the regular expression + :regexp:`[a-zA-Z][a-zA-Z_0-9]*['^]?`: they must consist of an ASCII letter, + and followed by zero or more ASCII letters, digits, or underscore characters. + The optional suffix of ``'`` or ``^`` indicates a :ref:`local or channel + dimension`, respectively. +- For each dimension, the coordinate space specify either: + + - a *physical unit*, which may include both a base unit and a coefficient, + such as ``4e-9 m``, or may omit a base unit to indicate a unitless + dimension, such as ``1`` or ``1e3``; or + - a *coordinate array* specifying a string label associated with some of the + coordinates (indicating a discrete dimension). +- Coordinate spaces may optionally have a list of associated bounding boxes, + from which lower and upper bounds for each coordinate may be inferred. + +Neuroglancer makes use of a number of interrelated coordinate spaces and +associated positions, orientations, and other coordinate transformation +parameters: + +.. graphviz:: coordinate_spaces.dot + :caption: Coordinate spaces and transforms in Neuroglancer. The labels above + link to the corresponding description below. + +The series of coordinate transformations, starting from the coordinate spaces of +each :ref:`data source`, into a common +:ref:`global coordinate space`, and then into the +coordinate space for each rendered view, is described below. + +.. _data-source-coordinate-space: + +Data source coordinate space +---------------------------- + +The starting point for all coordinate transformations in Neuroglancer is the +data source itself. Each :ref:`data source` added to a +:ref:`layer` has an inherent associated coordinate space. + +.. + Screenshots not yet supported + .. neuroglancer-screenshot:: concepts/data_source_coordinate_space + +The dimension names, physical units or coordinate arrays, and bounds are +determined from the source data automatically; if dimension names or units +cannot be determined, default values are chosen by the data source +implementation. The dimension names and bounds within the source coordinate +space are fixed, but the :ref:`coordinate +transform` controls how the source data +coordinate space maps to the :ref:`layer and global coordinate +spaces`. + +.. _data-source-coordinate-transform: + +Coordinate transform +^^^^^^^^^^^^^^^^^^^^ + +A configurable :wikipedia:`affine` *coordinate +transform*, represented by an :wikipedia:`affine transformation +matrix` and a list of output +dimension names, maps the source coordinate space to the :ref:`layer coordinate +space` and to the :ref:`global coordinate +space`. + +The data source provides a default value for the coordinate transform, +normally an identity matrix. + +The user can configure the coordinate transform in three ways: + +1. The affine transformation matrix scaling and translation coefficients may be + changed directly. Note that the translation coefficients are in the units + specified for the output (layer) dimension. + +2. The names of the output dimensions of the transform may be changed. + Permuting the output dimension names has a similar effect to permuting the + rows of the transformation matrix in the same way, but may be more + convenient. + +3. The source dimension scales/units may be changed, in order to rescale the + input. This is equivalent to applying an appropriate scale transformation to + the affine transformation matrix, but in many cases is more convenient. + + .. note:: + + Changing the units of an output dimension does *not* rescale the data, it + simply changes the unit used to display coordinates. + +The output space of the coordinate transform is a subspace of the :ref:`layer +coordinate space`. If two data sources associated with +a layer both have a coordinate transform with an output dimension named ``x``, +both coordinate transforms are referring to the same dimension ``x``. In +contrast, the names of the *source dimensions* of the coordinate transform are +purely descriptive; if two data sources associated with a layer both have a +source dimension ``x``, there is no direct correspondence between those two +source dimensions. + +.. _layer-coordinate-space: + +Layer coordinate space +---------------------- + +The output coordinate spaces of the :ref:`coordinate +transforms` of each data source in a given +layer are *merged* into a single coordinate space that is called the *layer +coordinate space*: + +- If a layer has just a single data source (most common case), then the layer + coordinate space is simply the output coordinate space of the coordinate + transform. + +- In general, if a layer has more than one data source, the layer coordinate + space consists of the distinct output dimensions of the coordinate transforms + of each of the data sources. + +.. _dimension-kinds: + +Global, local and channel dimensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A layer coordinate space dimension may be one of three *kinds*, determined based +on the dimension name: + +.. _global-dimensions: + +Global dimensions +~~~~~~~~~~~~~~~~~ + +Global dimensions have names consisting of only ASCII +alphanumeric and underscore characters without a special suffix, e.g. ``x``. + +- The global dimensions of each layer are merged into the :ref:`global + coordinate space`, which specifies the units for + global dimensions. + +- A global dimension ``x`` in one layer refers to the same dimension as a + global dimension ``x`` in another layer. + +- Only global dimensions may be used as :ref:`display + dimensions`. + +.. _local-dimensions: + +Local dimensions +~~~~~~~~~~~~~~~~ + +Local dimensions have names ending in ``'`` (ASCII single quote), e.g. ``c'``. + +- The :ref:`local coordinate space` of each layer + consists of the subset of the layer dimensions that are local dimensions, + and specifies the units for local dimensions. + +- A local dimension ``c'`` in one layer is completely independent from a local + dimension with the same name ``c'`` in another layer. + +- Local dimensions may not be used as :ref:`display + dimensions`. Instead, :ref:`data views` always + display a cross section at a single position along each local dimension; this + position is determined by the :ref:`local position`. + +- A global dimension with a unique name that is not a :ref:`display + dimension` may be used as an alternative to a local + dimension; a local dimension simply avoids the need to assign unique names, + and may be more convenient in some cases. + +.. _channel-dimensions: + +Channel dimensions +~~~~~~~~~~~~~~~~~~ + +:ref:`Image layers` additionally support channel dimensions, +which have names ending ``^`` (ASCII caret), e.g. ``c^``. + +- The :ref:`shader` can access the value at every position + within the channel dimensions when computing the output pixel color. For + example, if there is a single channel dimension with a range of ``[0, 3)``, + the shader can compute the output pixel color based on the data value at + each of the 3 positions. + +- Like :ref:`local dimensions`, a channel dimension ``c^`` + in one layer is completely independent from a channel dimension with the + same name ``c^`` in another layer. + +- A dimension can be used as a channel dimensions only if the data source is + unchunked along that dimension. + +.. _local-coordinate-space: + +Local coordinate space +^^^^^^^^^^^^^^^^^^^^^^ + +The local coordinate space of a layer consists of the local dimensions of the +layer coordinate space. + +By default, dimensions are ordered based on when they are first added, with +dimensions added later ordered after dimensions added earlier, but dimensions +may be explicitly reordered. + +.. _local-position: + +Local position +~~~~~~~~~~~~~~ + +Each layer has an associated *local position*, specifying for each dimension in +the :ref:`local coordinate space` the single slice for +each dimension in the local coordinate space to be displayed in any views of the +layer. + +.. _global-coordinate-space: + +Global coordinate space +----------------------- + +The global coordinate space consists of the global dimensions from the +coordinate spaces of each layer added to the viewer. + +By default, dimensions are ordered based on when they are first added to a layer +coordinate space, with dimensions added later ordered after dimensions added +earlier, but dimensions may be explicitly reordered. + + +.. _global center position: + +Global center position +^^^^^^^^^^^^^^^^^^^^^^ + +The viewer has a single default global position, called the global center +position, which specifies a center coordinate for each dimension in the +:ref:`global coordinate space`. + +.. _global-mouse-position: + +Global mouse position +^^^^^^^^^^^^^^^^^^^^^ + +The position within the :ref:`global-coordinate-space` corresponding to the +current mouse position within a :ref:`data view` is called the +*global mouse position*. + +.. _layer group center position: + +Layer group center position +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Additionally, each layer group sub-viewer has a separate center position in the +:ref:`global coordinate space` which may optionally be +fixed to, or linked by an offset to, the global center position. + +.. _display-dimensions: + +Display dimensions +------------------ + +:ref:`Data views` project data from at most three +:ref:`global dimensions`; these projected dimensions +are called *display dimensions*. From all other global dimensions, only a +cross section of the data is displayed at any given time. diff --git a/docs/concepts/data_source_coordinate_space.screenshot.py b/docs/concepts/data_source_coordinate_space.screenshot.py new file mode 100644 index 000000000..1e7b04c2b --- /dev/null +++ b/docs/concepts/data_source_coordinate_space.screenshot.py @@ -0,0 +1,59 @@ +from selenium.webdriver.common.by import By + +rec.begin( + { + "layers": [ + { + "type": "image", + "source": "precomputed://gs://neuroglancer-public-data/flyem_fib-25/image", + "tab": "source", + "name": "image", + } + ], + "selectedLayer": {"layer": "image", "visible": True}, + } +) + +# rec.highlight_element_with_outline( +# elements=( +# rec.webdriver.driver.find_elements( +# By.CSS_SELECTOR, '.neuroglancer-coordinate-space-transform-source-label') + +# rec.webdriver.driver.find_elements( +# By.CSS_SELECTOR, '.neuroglancer-coordinate-space-transform-input-scale-container')), +# caption='Data source coordinate space', +# direction='left', +# ) + +# rec.highlight_element_with_outline( +# elements=(rec.webdriver.driver.find_elements(By.CSS_SELECTOR, +# '.neuroglancer-coordinate-space-transform-coeff') + +# rec.webdriver.driver.find_elements( +# By.CSS_SELECTOR, '.neuroglancer-coordinate-space-transform-output-label')), +# caption='Coordinate transform', +# direction='left') + + +rec.add_label( + elements=( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, ".neuroglancer-coordinate-space-transform-source-label" + ) + + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, + ".neuroglancer-coordinate-space-transform-input-scale-container", + ) + ), + caption="Data source coordinate space", +) + +rec.add_label( + elements=( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, ".neuroglancer-coordinate-space-transform-coeff" + ) + + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, ".neuroglancer-coordinate-space-transform-output-label" + ) + ), + caption="Coordinate transform", +) diff --git a/docs/concepts/data_source_coordinate_transform.screenshot.py b/docs/concepts/data_source_coordinate_transform.screenshot.py new file mode 100644 index 000000000..7b0301ae0 --- /dev/null +++ b/docs/concepts/data_source_coordinate_transform.screenshot.py @@ -0,0 +1,59 @@ +from selenium.webdriver.common.by import By + +rec.begin( + { + "layers": [ + { + "type": "image", + "source": "precomputed://gs://neuroglancer-public-data/flyem_fib-25/image", + "tab": "source", + "name": "image", + } + ], + "selectedLayer": {"layer": "image", "visible": True}, + } +) + + +rec.add_labels( + [ + ( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, + ".neuroglancer-coordinate-space-transform-input-scale-container", + ), + "top", + "Source dimension units", + ), + ( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, ".neuroglancer-coordinate-space-transform-coeff" + ), + "bottom", + "Affine transform matrix", + ), + ( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, ".neuroglancer-coordinate-space-transform-output-label" + ), + "left", + "Output dimension labels", + ), + ( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, + ".neuroglancer-coordinate-space-transform-output-scale-container", + ), + "bottom", + "Output dimension units", + ), + ( + rec.webdriver.driver.find_elements( + By.CSS_SELECTOR, + ".neuroglancer-coordinate-space-transform-output-extend", + ), + "left", + "Extend output space", + ), + ] +) diff --git a/docs/concepts/data_views.rst b/docs/concepts/data_views.rst new file mode 100644 index 000000000..48b18cfbd --- /dev/null +++ b/docs/concepts/data_views.rst @@ -0,0 +1,18 @@ +.. _data-view: + +Data view +========= + +.. _cross-section-view: + +Cross-section view +------------------ + +TODO + +.. _projection-view: + +3-D projection view +------------------- + +TODO diff --git a/docs/concepts/layers.rst b/docs/concepts/layers.rst new file mode 100644 index 000000000..319cf7d9d --- /dev/null +++ b/docs/concepts/layers.rst @@ -0,0 +1,26 @@ +.. _layer: + +Layer +===== + +.. _layer-data-source: + +Layer data source +----------------- + +TODO + +Layer kinds +----------- + +.. _image-layer: + +Image layer +^^^^^^^^^^^ + +.. _image-layer-shader: + +Image layer shader +~~~~~~~~~~~~~~~~~~ + +TODO diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..6a6555598 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,324 @@ +project = "Neuroglancer" +copyright = "2021 The Neuroglancer Authors" +version = "" +release = "" + +import typing +from typing import NamedTuple, Optional +import os +import re +import sys + +import docutils.nodes +import sphinx.application +import sphinx.addnodes +import sphinx.domains.python +import sphinx.environment + + +os.environ["NEUROGLANCER_BUILDING_DOCS"] = "1" + +extensions = [ + "sphinx.ext.extlinks", + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.graphviz", + "sphinx.ext.mathjax", + "sphinx.ext.napoleon", + "sphinx_immaterial", + "sphinx_immaterial.apidoc.python.apigen", + "sphinx_immaterial.apidoc.json.domain", + "sphinx_immaterial.graphviz", + "sphinx_immaterial.apidoc.format_signatures", +] + +napoleon_numpy_docstring = False +napoleon_use_admonition_for_examples = True +napoleon_use_admonition_for_notes = True + + +html_title = "Neuroglancer" + +# Don't include "View page source" links, since they aren't very helpful, +# especially for generated pages. +html_show_sourcelink = True +html_copy_source = False + +# Skip unnecessary footer text. +html_show_sphinx = True +html_show_copyright = True + +# Override default of `utf-8-sig` which can cause problems with autosummary due +# to the extra Unicode Byte Order Mark that gets inserted. +source_encoding = "utf-8" + +source_suffix = ".rst" +master_doc = "index" +language = "en" + +html_use_index = False + +intersphinx_mapping = { + "python": ( + "https://docs.python.org/3", + ("intersphinx_inv/python3.inv", None), + ), + "numpy": ( + "https://numpy.org/doc/stable/", + ("intersphinx_inv/numpy.inv", None), + ), + "tensorstore": ( + "https://google.github.io/tensorstore/", + ("intersphinx_inv/tensorstore.inv", None), + ), + # "sphinx_docs": ("https://www.sphinx-doc.org/en/master", None), +} + +html_theme = "sphinx_immaterial" + +html_theme_options = { + "icon": { + "logo": "material/library", + "repo": "fontawesome/brands/github", + }, + "site_url": "https://google.github.io/neuroglancer/", + "repo_url": "https://github.com/google/neuroglancer/", + "edit_uri": "blob/master/docs", + "features": [ + "navigation.expand", + "navigation.tabs", + # "toc.integrate", + "navigation.sections", + # "navigation.instant", + # "header.autohide", + "navigation.top", + "toc.sticky", + "toc.follow", + ], + "toc_title_is_page_title": True, + "palette": [ + { + "media": "(prefers-color-scheme: dark)", + "scheme": "slate", + "primary": "green", + "accent": "light blue", + "toggle": { + "icon": "material/lightbulb", + "name": "Switch to light mode", + }, + }, + { + "media": "(prefers-color-scheme: light)", + "scheme": "default", + "primary": "green", + "accent": "light blue", + "toggle": { + "icon": "material/lightbulb-outline", + "name": "Switch to dark mode", + }, + }, + ], +} + +default_role = "any" + +# Warn about missing references +nitpicky = True + +python_apigen_modules = { + "neuroglancer.viewer_state": "python/api/", + "neuroglancer.viewer_config_state": "python/api/", + "neuroglancer.trackable_state": "python/api/", + "neuroglancer.json_wrappers": "python/api/", + "neuroglancer": "python/api/", +} + +python_apigen_default_groups = [ + (r"class:neuroglancer\.viewer_state\..*", "viewer-state"), + (r"(class|function):neuroglancer\.viewer_config_state\..*", "viewer-config-state"), + (r"class:neuroglancer\.coordinate_space\..*", "coordinate-space"), + (r"class:neuroglancer\.viewer_state\..*Tool", "viewer-state-tools"), + (r"class:neuroglancer\.viewer_state\..*Layer", "viewer-state-layers"), + (r"class:neuroglancer\.viewer\..*", "core"), + (r"class:neuroglancer\.server\..*", "server"), +] + +python_apigen_rst_prolog = """ +.. default-role:: py:obj + +.. default-literal-role:: python + +.. highlight:: python + +""" + + +json_schemas = ["json_schema/*.yml"] + +rst_prolog = """ +.. role:: python(code) + :language: python + :class: highlight + +.. role:: json(code) + :language: json + :class: highlight + +""" + +json_schema_rst_prolog = """ +.. default-role:: json:schema + +.. default-literal-role:: json + +.. highlight:: json +""" + + +graphviz_output_format = "svg" + +extlinks = { + "wikipedia": ("https://en.wikipedia.org/wiki/%s", None), +} + + +python_module_names_to_strip_from_xrefs = [ + "neuroglancer.viewer_state", + "neuroglancer.trackable_state", + "neuroglancer.viewer_config_state", + "neuroglancer", + "collections.abc", + "numbers", + "numpy.typing", + "numpy", +] + +object_description_options = [ + ("py:.*", dict(black_format_style={})), +] + + +# Monkey patch numpy.typing.NDArray +def _monkey_patch_numpy_typing_ndarray(): + import numpy.typing + + T = typing.TypeVar("T") + + class NDArray(typing.Generic[T]): + pass + + NDArray.__module__ = "numpy.typing" + + numpy.typing.NDArray = NDArray + + +_monkey_patch_numpy_typing_ndarray() + + +# Monkey patch Sphinx to generate custom cross references for specific type +# annotations. +# +# The Sphinx Python domain generates a `py:class` cross reference for type +# annotations. However, in some cases in the TensorStore documentation, type +# annotations are used to refer to targets that are not actual Python classes, +# such as `DownsampleMethod`, `DimSelectionLike`, or `NumpyIndexingSpec`. +# Additionally, some types like `numpy.typing.ArrayLike` are `py:data` objects +# and can't be referenced as `py:class`. +class TypeXrefTarget(NamedTuple): + domain: str + reftype: str + target: str + title: str + + +python_type_to_xref_mappings = { + f"numpy.{name}": TypeXrefTarget("py", "obj", f"numpy.{name}", name) + for name in [ + "int64", + "uint64", + "float32", + "float64", + ] +} + +python_type_to_xref_mappings["numpy.typing.NDArray"] = TypeXrefTarget( + "py", "obj", "numpy.typing.NDArray", "NDArray" +) + +python_strip_property_prefix = True + + +_orig_python_type_to_xref = sphinx.domains.python.type_to_xref + + +def _python_type_to_xref( + target: str, + env: sphinx.environment.BuildEnvironment, + *, + suppress_prefix: bool = False, +) -> sphinx.addnodes.pending_xref: + xref_info = python_type_to_xref_mappings.get(target) + if xref_info is not None: + return sphinx.addnodes.pending_xref( + "", + docutils.nodes.Text(xref_info.title), + refdomain=xref_info.domain, + reftype=xref_info.reftype, + reftarget=xref_info.target, + refspecific=False, + refexplicit=True, + refwarn=True, + ) + return _orig_python_type_to_xref(target, env, suppress_prefix=suppress_prefix) + + +sphinx.domains.python.type_to_xref = _python_type_to_xref +sphinx.domains.python._annotations.type_to_xref = _python_type_to_xref + + +python_type_aliases = { + "concurrent.futures._base.Future": "concurrent.futures.Future", +} + + +def _should_document_python_class_base(base: type) -> bool: + if base.__name__.startswith("_"): + return False + if base.__module__ in ("neuroglancer.json_wrappers", "neuroglancer.viewer_base"): + return False + return True + + +PYTHON_MEMBER_SKIP_PATTERNS = re.compile(r"supports_(readonly|validation)") + + +def _autodoc_skip_member( + app: sphinx.application.Sphinx, + what: str, + name: str, + obj, + skip: bool, + options, +): + if PYTHON_MEMBER_SKIP_PATTERNS.fullmatch(name) is not None: + return True + return None + + +def _python_apigen_skip_base( + app: sphinx.application.Sphinx, subclass: type, base: type +): + if base.__module__ == "collections.abc": + return True + return None + + +def setup(app: sphinx.application.Sphinx): + # Ignore certain base classes. + def _autodoc_process_bases(app, name, obj, options, bases): + bases[:] = [base for base in bases if _should_document_python_class_base(base)] + + app.connect("autodoc-process-bases", _autodoc_process_bases) + + app.connect("autodoc-skip-member", _autodoc_skip_member) + app.connect("python-apigen-skip-base", _python_apigen_skip_base) diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..bdd78a65f --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,34 @@ + +Neuroglancer +============ + +.. toctree:: + :hidden: + :caption: User Guide + + user-guide/navigation + +.. toctree:: + :hidden: + :caption: Concepts + + concepts/coordinate_spaces + concepts/data_views + concepts/layers + +.. toctree:: + :hidden: + :caption: JSON API + + json/api/index + +.. toctree:: + :hidden: + :caption: Python API + + python/api/index + +Neuroglancer is a WebGL-based viewer for volumetric data. It is capable of +displaying arbitrary (non axis-aligned) cross-sectional views of volumetric +data, as well as 3-D meshes and line-segment based models (skeletons). + diff --git a/docs/intersphinx_inv/numpy.inv b/docs/intersphinx_inv/numpy.inv new file mode 100644 index 0000000000000000000000000000000000000000..9a95a49eeb402c7d82538e14f3ac0c569097f8ab GIT binary patch literal 81031 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"z>nQ;`sn*uuPfIxL-$~fGMDYE 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 literal 0 HcmV?d00001 diff --git a/docs/intersphinx_inv/python3.inv b/docs/intersphinx_inv/python3.inv new file mode 100644 index 0000000000000000000000000000000000000000..adf47f5d36f96ce579ff58f1f3885b14042efef8 GIT binary patch literal 136387 zcmV)8K*ql#AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkVd30!R zZVDqHR%LQ?X>V>iATus8G72LgRA^-&a%F8{X>Md?av*PJAarPHb0B7EY-J#6b0A}H zZE$jBb8}^6Aa!$TZf78RY-wUH3V7Pgz1wo*IJz!)zn@}7%)VWm>0BMND)ybymYwSI zsYN+6t8W-I3CZlFNES)Sc0c_9;6VTgfcSsVy(Xe6GbQ0W;CvtmTs=lN&%5XCI=bF` z--MgThyO_a&ygHoNc|sw`H$p3<0|{V&!ql%%?_`@YkSQ9uO#^2|M8#y>wdla7G2$~ z!jOfJle!#(H*I}N+EY!MDd2Jaa}(|$kegMwyIS4dK`_6s|M>B^y#`rhe>`485D$;5 z?JY>-5fV7ut#+F$2;%!{3vl%G$Nl;~x_-Q0Z60Xs?85c+@olF?GxWM!cuH&@$7B=P~Nxn19_SK&IkTYq2Qp^)KvyIH}Y z-`7{W$1STF5zX}H`}M;vj2>@p!u7OzC2^il;5?quxAjke?8j=;k~+G2CCM)e+nMAy#dUnt;$#ud5ngRJk1ziuNlO{pkBW@IQ;{WQN)*lFBP6ZaWkXss zAgGKk1)L(HlC0lj?iD7@Q5gMBj?>kLh=LlT6OZeIB0hu;=ueGNSHOu1GQ+;Ck8$h8 zu{%{c&^U)++;>_UE>t{BY^x&uoqW8Nb=n}}C7{t!6dl+V@DX>{_%%(8&ro?=ivPK& z;^Y^sTnZRqu8C?owqyLhAX!!{M^?l~;>Y$qhBaG#cwh<-Dk=-K?3;Mbi`YRo9R@ru zk&KnXq=HODunxQtK`Xs|zQ%d!%*nGfZb|ku@B|T zKh1z3K1MMc$W14ZZrFmnw^-~ORYqbPQlyU1ug^Ep>fsMMjeXc{Zl52Yr*o~B(|)gx zff=lW0E0){M|T9q)y?DfezkKC{;ZjY+X6!(aD$1!=HYs?r86OC!2RlHL^1cyfQM`6 zpxgE8+AzO8XXH%>xY90Dm<4!vNUDaL`=`6Ld+^KuYfo( zz}h_@$}%@k6<_GDrtp^etO%1NMuwZZJl>VX0U$a+f-^*S6dHMUtXZElcp6cjzE5?T zxOE0X_~2z99Z1{dkZa>A!)ub0xFHCN=qAhatFmab!>K$qVOwV@(RP5^5@g{BX!mw( zvVWP!x-#R8qglBk&5q5#NsA5^csl<(w3^qr`gf&aGs*tt)HcPwM3gHA3uqXOCoZYu zBkxsNx40}clJ4{P&@9TBlVVZ6n#5^Y$14BAO2; zUR3dQVs7fhpZB9BtGbRq^pCw>=+80xS;?0H6|F)(&w9AkW~nne7=xN)q>|}vC<1&$ zWtjcUy6eH-<^~foy?HJ;XKZ#>XmcaX59RNS&l27IbPpAMOkJKX3O|%Z5+hx4Xb>YE zb;4T8mjx+VV>#A6cqA`yY|;w`rqo@*T@`64Pex$|B^G-_JLgn3G$+-lm489C+x0FA zH~(0pQe^=9HZ7wGnSM(eY<_i6UthfeEj2p-wWR2R87>e_O|dX6dYRoc=AO6Fgr4tl z?I@Qz(a3RaG~H`6+qLR#3|(poG@y2&m#=0TC##L2ofsGY5SG-|VaiSm{GomQEcWu{ zpG#3&M(~p?A;^2iOOo19>PgQWfN_ifwBo z05Y1t*CaddI~Tjk5|NH5<#&3reo+8_J_N$o>b zV+@^!s9GD!(6kZ8WndS5-*bk$nDjo*gX0-9u7hHWt7$tvr9Ur6J~!^wMtB_W0!zST zeA`6e#O``Yn646M^Po;qyt)}|DZ@F#*7ytHN7lXy`>Kbpf2SdCOJxaM#sy_%eYZixPc$VuLypgw;2BOo#4nb#wHTSCMwhll zn-wHqgizm9o1?{IV$PGv3oQ!9(yxfniB!i_HC+*vs%p}Gt*Y`bXQoPyP|KSi3WHWy zB)ukG*)MBQG;T@DoiEj&B`>80%Y(DwJGtR; z>u~ri9E5eG$Q08s8oD`a)L5UC>KXz^AD2Gq!iS5Ij;WedJ0w|%Z-m1I8sSji2#eGc zciz+soCA(Ig+{l+rFwS*5!^OJ57CuxinxBLZhS3w#&U_U_wnZkvDv=BMc!sSSNAux3; zdO6l`!xD3Bt=WeVl$0SNDMK+S8NoTuPXx~Z%8U?^8KIaNi~w#}WYA9=HGa#Ktj~19 zI;nS)(*ameLmkzIjaF&;BW{ydL+dpM;uG_i*fuT{D5jbsW&P!j&d6alIt+ho6qWmZ zLt3DbUR1-Gl#5W6N!+i^!lKpV{Gv998@Mr1oS`H|8YN|ZIu@Tooy#R;8RDjm>-Mu; zcjOECHutFdqSW=Muxu83RQ@q1aSd-GL|E|F{T)eDzIh{}@<`0qQD_T!j_U?sM?e9S zL)4S#=-)sC>=(E=(-CQIvbt$+Y64UrVQ>oW(GiF6OABRna35ZuC` zCX#)RYc`hvCc}V&dl>abI`$yuShXJj2LmM7XF0J?g{CG(Jslk_DXgt4%B2`7hrdC? zNK2nMyvez`jB6Z*QAzZbhHdh=dEJsKj}x-4>(X2|5_gJ#yeHPkCvxnKRxU!s8kutSc(ukR}ITU4$soNqDUZW*hfwV|!!VW-*b4YM(wl?d7tb`V zscN#%-aQyjZNEtyLx5K2FVd1UYT7g_5qSQ(&0Aa--8c^jPgnyLy~fRJRDC2(bnKSz zpe$_VIVCTrLsZAbfixHj_804A6KqnXj?;khM4tQqv(xcE%(@Q|57t$*-Io;^ZTG%ZjvoYp|94NRzQ- zO+<`|diRb~)K8_VxP4uQB}2nQflEq#2_5#5VZU?tu=&qJHrYivCDq+F_%+ zo9d%|Een?Tw9!Xo`k$u^Q_SmAL4Q6T<08d@h3EVT^!Q#Q5ZlCi!fQ7I`dYrR@dOQX zDiA5wWG#uZ;T0Mv_*Yg%O?j#l67ek!!~QKO4{M-3Mh86}IWTBx4@J7h9u7XS5q)va z>asWzOa?FlkD7-3J0($+1;z~xyy?eFS1PZwuPKXxuUg zetty`U$>GUL5Dpv!T4i1A5UCY;0sB+>c&uDD?OAgeIzI^gSMXYyfmjrs_9wzVIdx= zH{!jL@Z!S4e*Qdmzht%Yo6r4mP2K(opanb%M*`V2*xdGWbv{MFE2S4nWQ(l@lGet) zH0_TpCEX8qS<@oZR3`CETg8!8iC;zX?+}_fCUHq6IU5$x>EBaUo@(;1`3`$EQ`rx@ z@)s#kpxGyYFb>-xCQ~Z2m5GGuA&cGK_qc|p3Wa#4iOhgZ5ygf=Z+b!1!5Mp7b(jLp zyyrM$Z+wSUCjTVTdPz#t8@CSW*PZCFN4ptc#+4~&Hobv4x1_>I`U! zeKJ!^8{(rHdY9Nx>&GjS8cJOI=h>3^H)Do2EV?SI51b4wRwbXTXk?$*NK zcGkuNBAk%;n5-}7Hw@prXUI5EpobAAE7Bp`R(J`oOVbvxx}1ictqLzNAzc&av% z8B<0p&3c7>ZSNK)vX`EqXDECL{yfFG7l|of)kt5*E!ky9%iGZGj$rn9+J>`blZu~c zPU(#0#l_2PxtTL`DL>=)*Q?!{A7y*}|*j>$}~G|9ZXpBg9yg2#^kC69#^vy!sgxiF^%9rVM&ZcwWe^-YNZuI-Z#`*8c+u z(|6AGAi$T2HUE%|&I zI(&cqbd`qCX+rwxGN*r&&IgGb^3rn24&Ar!hgM`N!lP&1kk;@Gd-qYQ5xncat zZ@EE7R2Bd94v&=Ra5(LRJS%)jJW7Cu9r^e|S28?ccjw1#~tvr+G$!GW~4sRAM6-kP%*FZXwRNQUNa{(^ z#aJl8SU=OURQ@2{&)Im%=H4yS<>qFqoni~CE4gVPj&hJ zVcHTh0||~)*LHfDh*#wXwwXI3^cFyOL`+?%cSP{-%p)DWg}LL8G_u0*X8dR#-B@Jj z&O0(`3qu|0W~TOs7+UI4c^6mmU)QA|D_FgVdC% z^5xO*Vl+me`hZII`xW^oI_TT9xMR=P=!&xoB zNC!v2-02a}7!5)bo@xmeaPCMrWLyksiOC&1BfA>ic<`+~f+G|e$BVR?xmt#Iqr7J| z7egK%Cf-Sm48M~Ph#(6N)8hgo{+`qa0?^~(gBT*%Nhl02-VEiL)OD5;Um`a356Pcj zpouWx5Q#BL8W_=0n30DQZ>N@q`x*E(D z2krH(8bFyu;g0Q4ImSs{3g-i~leeI{px;+cq3O6k`WmOJ`fxfLUSTBf3F%IZ(n2@v zJ;EZ+S?r;3zOohagF72A*0cg<16^lLmB%0JA&4*DdKUkb$Y5e%AHTWhWfGhuDjwx- zVq##wA%;3?v&2C`#gCk`F7=x1bgC+y?I8h($v#qbq$=xU46ZsIDj=Go=xCyoRrvO* z84t4WxHx_Hj@0)FqgS-1bZ6^E3s<&V($d<(HbFrX>VovC8-l);7*k7TIC1qwPx_4? z)tsUmV@k1&v&M%ZqusA>tE(kJHNAQ}cAW$Jc3~xUPbxM^MJzwQAM8z1*V07*E6sU{4l z_C;gFqR_s4vVd(l1EKJkBkCbq1gKaM1c42@4w1M$JbP<#EFf(W>ENk-@;g zyd~Ya)IY}SNkQ}=6wXlt;HX-+m%(Qc{nOHO(LDJ2#$=Q5vdNxQKU;f8@d_vAn#Jy%? z3r)q$6Qo6FN1rq`a+?`^!lcMe*!NM2h61(1sIwwyZ1}xv#_iKH4h3{@Yz`Q6q5%Ul zwuCrP_cz{s0(E$LN!V+oeyKXJcs#!~*qYJv&rMgQ1#;I_YJuF=O0oSm^{K)Pb4DzD zW1|DYNX z6wI4=XRP)6V~?b1;sYwdgiW$CCpJ%2!jGbj-|xyKMy0-l_87>>E)4YSPSc|N9CAd% zqu_(2%%gI@w;gQYW>IW_RFQ>}*e0<^G8+YuZJCB+xdc~RC7swp3GX7cNCqfE?5QEV zjCZJjGLnP5!NAQ@ud2{tn?pUD&ofmmW0hw~*5Zm zzaagJrLx^ypha%{v6K4t9V#=s0sXnC=}aPi$-&b`1s>Sm6E(V0EO2f*U5i%9pQo%Q zba?Q~bh)bHNI>mgYs<~sbGV?T>1;XaTjbE{jM<7R--5u?$B z3Re}UWQV+bk>3yUWz6Z=ZAn7?fX^YJ=&*`iu3esr7VBmhR!wP}g(;J~Y)&;5(2zv?)Rv+t<2$+vo9N5$0Rcem!M*YdFoTCi|T5uQc(zWsk@V*)$8J0Cp6g4>n*( zV=7EpH0mntgGY28c**mz^dJ>L`sMAUnR0e?r&dQdLjB0uE(I)E#NV_zd?F z5_X&=n{lH+_6nx)F6im#Y!eVL+bYlDbw>yHh^64cE`g4@L1D*sGQ#4`A(*&!T2m@` zoD59ZoK(Q*xY^R!D-VtA{THnL&-hzju9bS2rL#_FRUcscAXIQb-eKzj6ZHx0ReWj) z+7w57x$5+%#NFN4cw-&j&sy(cLcY`NN`~1R8N3W$e8>W!Pf_c^0sI_-iN2l~9b+S{ zM;RW_L85Q~jp>SU=v_Z7#6I=of)A3`$D6i-gbUO@8@Xrg3m2(bD{BCza0(I!i$ zqq0;>ki7eo{1u!6e?_IhUneZp5+v{bB)@@E;5SqX{5D~!mLPfeBhjDMY>fVMQGu&X zj{zszpfzQxmLd8pA{u{1M&qv?_OQ z!iumDn?D~arppTQa5CNX zX*Dt;v2HHXGO=-gg4GU3VXbtM65;n4oFo*2H1IvHr&PsKOqMx@JvRL;105%ErZJ^0 zmSQ!Gk92V>|3!+BSZ2QsX{{JbPbxsCQW`4bEO^et+&tK3M3@PWKNzl1ve;m^m1Zq% zUSBLj6oZZ7w$jTt`uv;9_bP_5NdK!IGjlDfGkE@bRFz8aL83R0mh86rF%!m$P$|FDnO zkV2tvi!Kucv6jr)YiMcO!zKET83BCXaRJZ16lAxj?Lb1`p2QGci7*s@Lxmvqg?{erjeC$-xXTv!CoI5kqJvo1`Hlm*0gZN6qr zx1Bg_4Hq$52>N#)98ttDPdt!f64IOq=FmZD-rpvmM1Bcxoc)_6yLmrY_cG;YUm3=3 zT2(g4vM>Hj6o-LT|L?gml}T0_e84SC#v3}?;!{{>M@r7j`i4=HVr|#Qs3pB=>r>Lw zirN?e!azY?dzpoHmj!`g2Yy}=7}h5!7}r4LzQxUJ)V%;WNy}IIn>lpAevV!;KKM}7 zW{~=r&43z0QkdNMYU5s43#Xv&yhFBPWuALx$7#2s;_Q`7X3(hWD9tAY+S zTkD3Os)`gTdqt*=U!c}RY`}Ul`@2B~bCLriJu2QN>h(KG*zyjlh{#~ukpl)>in^H^ z6K7X){VU+k(YBwp;N-1;XWK;YANd&pcB1O%il8dIj>0>wrxjl>vrL*es{Px9{yni` zL!qZ$sqxBmiOD^K^fq zK&S}xdJ{6SK%(4;1Rl;LA65}mM{lB8$nmth>i+UbSML-xr6qDmDuaW4T^{qSX??uO z!#PD@?wOS@|IB$)zVyENW+uN=&SHdS9>*_|f1MMn%mTUSpkhCsav=@x^5P)kTWaPd zJX+5Q%W{Rt-hPUbOBE=0#bpW?KyR6X<}SEMp|i_9lwWhx(OGWAu4nKzJ2(+!wj?iO z+zO@$4USM>k}zj2Qu1zo%v5w6sbwPRyCo2UX{f@JE#wDrcZ|_ zkRZI3++a&bZpv!c}6XXo~TKa2}6W5I&2C%2O-ho!&mb6G~Y)`RismK}a8MDEI zNn&%2x3{_WH%Ilg^xvG%37tUiWBq{w4p2jf=Y)K3J)oWm`7oReHu=(M7XnX@ zf)g%8f3WN`YbPV$F}!8KD8eL(k-?ZxdO@ByAiYaguumZ!N(1CraCXulM376!3|VVA zMahkV=3GO&dKAlD))>y=VXFsnv{~4GGl4FhtN<2I^VnB}$~r2Ibxp&CrrDh;{bbVQ zzeB*4d!>=cSb+?}bFV9EG%pqC^3k|Y(Iz|hhN4OPvQ?3P$0jYC-TEFNKR|*EB0dUD zd7$~GrwTX!SOa6hASiXNb)ljiuUvO##XAJ;15(Q&kvj2SYQhALg@!21vxLB6!65-V z4<0DqX-%mR@i0=AZ+=X4x=dJirFoKm$!umBuiPGo%4qtH?R+!5uEUO}Yq)qu= zE`n|j1T4;sC~o7P8uS-Hr8z#`b!qRL{)^;+LozLs7ZxGbv_vf^{v8BW|9Ul%tU(xP zJRCF=3(rN99SV|yi=_xenURzY#9pozaW?1fK5l+_Ib;Oz8l<&hQ1P6B#(;9D z^Y|UGG7k{AxLjw4Z;^Ok!xyaZdIp&RvmUNP^sN|B>E##*~nNgz<6$&q*`ay{Li>EDr zYg2phUQ|HAIuucEWHZc)C(`$i*PDk;x5-Mg&7-YLC45{}v_^Ehof>r}%|6hQZ^*(VF+I&5Exg>S}&l zhq%1h6g70bYzcBFfkmSoD5%lkMk3O7wHa$anK8P zWOeh(??#VPcH(|F4dB-b8tyhfb_mszjV4g;Nmp%3gtML|dUSN_XILQcu`2pdH5N$M z#nN;pJug4o8W?A@eSJ;iHukkE)m)2~ZPSFGRQTGxagEPKiNPZiWhbHvzkZMv#$AbW zso;?wRTnmeGi#4NS%TD!{NmM8B3+sBNo$e8C$%Lfb`_r#hsb!Px|zW~qveNz(xQDfnOa$I7-vnwBlT!rY0 zIR0jy$}sOklGgI3L*eu!y$2V<`@ZaewD09|)9v7t*Go-$+xQJ$Q$`S`vRo9Wbnq&p zWrLRG9s(@RgOI>-k4Z{YmS4mKCOYOq==UhNfk95gRe5tEqJoQuUKkpK2}@ru+-hNn zYz#yH#xT^iTcKxTXd*pT*W~4NV7JXTfOx);8gLr(2!I`_e1Q#@*MotuLzOSMa=!t#qoY}`VRxP=BAmUS-_n@38? zq_mQK&&ZqY{1F!BOv6kPOTt?BcTGt&;tDHUE%M z&o?*gt&crUuz4W z{-o$>OVu5_X9ye|qkh+_Dlvmf`qQ0&Fl~!C2ikW_Q$W;l+|vjI>Knm1)Ub8|MCE1M zAYt_HnxF6p$G3Gnyh08^M(i9%ZB>{>v5OJSl|h0}1ZB36#vN3~IU;B}7$~|NI6ORZ zMzSk1QMM zOT{U3_xu{)8pwEjk}5u|BFMyrNMMuMK?Bo7?Bt0*0EN#HuBjokFG4uendhSBIL*Cq zYET#EqQV!(*G}gQ%)NSQb8&h7bojO=hMR3|HaG||P#feXTwhQQzTho<(Xn-ih=QZp z-8s(W?4qb^a7WRjFcBOCHEg)bs3GL95|jO^NW+RGz_`g^OcWJ)Gj}7qTa^5ZSG2$Q z$NP(o-M=gY#Qc+4qQ4#P2ZkhX2SOI{UQwaTzzy_pGBVypCb!S*BHT=O7lMnG0g1OW zYU_znQ-=xO-`;eLPJetrrP+g5dOb|j>cJzO9u`QW2UGeO@3gmj;xN3OPF0{ZE&7^G zu+>`37<^o<9Y3P-WyE1kOml->|6L}QeavPzB9v{(X;cy?SCRn}J1);n)P@CXO-#Fc z9U*U?ONgL&iQ<>0%ug+GeC2zJPg69sKto^3GRI=m>`c=Vi{9sD+n*G7uMn_`*d=(zIcHQTqoEXSDE#`o^Rlq&!5rdx=otbG}(@{M?t)P(KG zOcx+pB(s{+OIvqK1ztRDeIg5$!grsX@`%W}J3$(S_NzGy)fiuVK@M@7ozWSH&$p^< zG9P8Hn(195YtoSVOwdiaUrqL{!3)$}XpN0lmjRR0?SBdka08$!D6*v~R6k9F@-JZR zG@X!q@g*t1-V2oXBAt+Y@g=bxfNG1ucnB(aPrx3eQ&1<2rA_-+ysE zjL0G49SBh_dNmEz7k{doetH0j3CF;bv6GT{%KCa}4S@~@BqBjYT@&e-g-AEW6B}s3 z+rJAC5ko=MK>1}^$^sj`!Y6t~YNGtIC?&q2P6_bQwU;oz((5E~H;kPSDbQi@k?*z5 z#9x*szULE#`^z{V5o?(PAA7~iywI0V6Y@(B|CE@w<`H`{`D2ZX@nemT>tk&o{IVqB zQ$L?WM2i88d^%nnSn0of2E9j@u=VT`wx*VQ>)9n3 ziNnkE9}(XHjgRrDZzKP*Jo&CZ5uf4D1&@!r;K45N zJIUN)MltZ|UneE;oDKH~TE!U%qkbN4@9V!Yoj7h0@9qeKN{=Ut51%n@CVKol9p9oy z%u_0_F|zmI*gRPE9u8Zmk&*R?ro{y&Y8twS%hL!*qy`wgPK<&A8+eF~8e7X_VAN<@ zrg*wMPl1>pVDPjX1tm84ARaq3!e|ZyO$K*bPaqTeKXZWor#B?6$k@j>X zj2>H0sgR>-k72ZKi0d(M*3s?CuWP{ z*{3oqTHVeEBSXrsc#GOHYK$97ld|aF3Ydk@9HTU4(wi`{m-R7jBX$ARr)g9*Niypz z5Z(&bx6*vs&vCvK_kpxcc5tl%U1-aF>}vV%>3ets66-<-?v<_4hylDRa9Wk(BF$;5 zIXN^y>$a$9y0&{@?HXWxxrb)!sH)OgPYMH*S?rxJZx zfT%dIdXyTk>70p>2oFe+R*2M9U6|;H+n6Kro{*|VG)n=nBuw`e)h_Nht%1}j00m#C6iZCa;0~>qo1<6wuO4atyqg?4$%9 zcI}6DNI}2X3Nt_u*S3`+0V?aLG%RHNVtLiro$A-yGM;S5$6C{5JU|v7Dd`wl9rfH0 z4oghGTFI#gi*t`(AnJn?MW}nj3GAFmHJYSZy5E3 z+0md-nc3JA zTJ!Y4GB*&A);en#Qj5YWtIuRmA+V3LZQk?~sw;L>`VSJ*pZD4}<&FMUlfB-X2o6fM zC6MhYLUds%&4%NIC10bx^gwfv zf?wnV;e-on*vciiGH|KPFr_DxO3sZsC36w(K*LTF>sgcr7rpG1b7n=ykqdBPssI68 zk|_!aEVoyt_U(`~r>ZJzeS&s4TMIYAtC}*~rn$+AIHyCD6y-+1qg{y}RQ6pRC%@3% zdbEeLL0@Lp-84LFhl0L$_pQKihC5Yfaojp8;W!eVXq~Ri_*~%K^jNf?L0e=c1*x-y z-CYgu<7IGw=>rvgGkN(L%%;iNsXnM0qf4*jz_G-gQX znbq^m_A3iK*zpA^T%;g{w(RyQNb}5|i8^I(SDTi=3up(!M6?%F*wmc^kg?GOkGPxL zXhqS%ROZ%iZl-Ni(UsT4g_@g5Snn84=TI_#xg;-Y6>7u<;0DQWi*wn9=qq%#3yr)UcJyahX=J=HtZIov=>Sg{SW88s((Mx={0%oxzPuj{zAZ zd4upW3L99! z<}a7zeT7H$73JVnWqByu&9TbKkF0pggM$)`cRlbdo?3lWvxJX?Y(Z#@cL;08GjSG5RN z1)WeZ2s|CRkjRoHuUF-CEg)^@UYL9cx+c;upFvt>>GHH+Oa1$sZpp{ceo4sn zZRB4*liV*!Rr=6#-8fus-8i(Z8{-}Vg}&>?nrA5Jhdvgr^Kx9MC53RAHR#Z^Rvh}R zK|AuEm*hpP(uVj|+HktE8e&&zEnMd%xa3K!Q^HUPA|6agWPw+IR5g{WmFbpti!8rU z9jrUvr7nCn-mEgCK6kr{#lq!=l?k79tpP&$eYHg`B7diUlyw4qi|ztL?8X-~^^~~X z>a(=J-dGE~wAq3szboRdSGd_-?qk(O^w zv~MC(BxTx-)8TY<9@mhF7O^u5exhJfoU^(tjzo8)i3>-&{|%j({Ncl~qq^GQwBfC+SvLUI( zvA#*x88C4BCZ3(#x{B|`TrEnA&!Z($(QL^l1#PU=5|r>p&8J0^S|MCpHl;Y^t`XC_NQhavW zIBQSFkQC{bG^c!W6GYak?~;e)Pxj_*WZWRdAo1j>mISlC-=)G;MUm`5dNth90R;sO z`4eG)$%#z*=Xyr<6DbnX?J#K6bk<%=p zXUK|*UBd3|WZt(la04xB$L0~W38Urs%9)rAhfZb~ zC*r}A6UK5$#xT$HZwt>yk3)m(FGxF`vVru=CyW+?Ij-n- zy^A)x^*u6PBOX`cWeXPe^0U~(%|F&Yac6i>cih61otX}?);QS1S0^sc9cVGp`+`<7~5f%7THI=&FyNryh2bg1i6L!VCC%6MLq5!>yD ze%*ek?M*|!ZhwZf`~=SPf}Dmol;<+S{+6=M#_*={_|5KAbvSR;f{T?SROp!ytvYpUK#4ZbR zmt~=0soDvQ1lAQso#Lq>3C(rZBysIthWqd^)j>oh0i}RSVqZ7V zSRWS(plPox545IdR$5i|sER*Mvb{(>k-R*nYNIFp#!0Oj4GT-vr+(ui`?tB}*C_G! z9-5LuQ{NgMy-mfkLlNh!v-%PLBB$y`TUg0^LMrx6GlvfL=DiS87Og%fW<4iuWdC_; zS~}LJAM~vN@1A8#Q)G~?J7SWow=iTB_z5%Vin$8zmjGmAyjbm9hQKLk+K2=FZT5 znrENVW242FARBAB46AAEU@AU*s|!4(#sP#t0!8{Oi%iW_L2XhB(Mx)2mP84DU|S2Ngdx&b%Uk6$qH1| zE;vNo1knrQmK@77!FUmo2se`OzF`B zuJwm+Ist`v0*(%mq(#bM5`pqFfLXiKUqBQ)F;LiW(pZ|+r^uH_-|1Wlh1yVq( zV3={vN1o02JWP#KzscA5;@E?Ia%0ffu!mkPV>rJ}((Wv@G+m)@v+G8VZh)-xKF#j@ z{)HK1=9V$^Y|&k)@d;`se=b> zM<%MCmhaS%TDj>F$@wF$i$~*>%M`NRKz@tL;cS{j8v*Q0@5DO) zm!mo8XlTy{PZm3k}g{V$d8n>j1El;2v34tXzM3&%iQi3l`XHS}^ z*sy=t5CIlGu%?|(m#YjcKkBR{z;;l;fZHEYPvwI&f&vEZVQ2z(|JW4!(!8I5mC!aj zDx)qDW!qDrq7^-r%DA&`-bJ^=4sGSK)o%A%lQ`v%8g!2o6bF~ULB@_*s`TsoMwEG1 zp93sto8G2N<1tlLNv}yxS^_uI;qY#HT|Mp9sjf-U!dgAK@}NrG z5=5*h$aJmBEbyk5TYDf9pA4h6hI(_2a+bHt)xQ(3biw=#>wBkw-_7mEk0Serb@}iYt2WItlty39|0VY z_XOcdl((^4?v6x~zr__I!W4zi0IqqVq;n;{dVCi`j6@0jlak5Xz~^Bp@2)&x){W=7 zNQ;tM#z=j|4`QbS`|UV@HS{ijh~~&$rc?MreryQKi63C?f{AYH`t$X`qWIG7xJ*SU6$dvGig80QwkU z!E1S{p*}{XV=4tg1qNw(jI+YLPg^3yDq1-E69fa_feq1FQ@&UKQ=|7k8xFLZ@qVe7bgxvqAf32&EsF<1`lko z$Smn6I&gFnC$Cs!p5uW1CKos|CHNAZk{pR^lDc1A$D$i7y4%}<1CGm@2skp0_gN9= z*pfJ0wu3-+Pha3bnyYc!0Bb;$zt%q35(~!W&1>AeqJV6gi32v#0aqT_WhLmADQl5! zI0F{lh7UNnLo`V2a9s`pi!4cocViuZd>EC6I?xHX7$fFx!_UX_#YGd3`?k#TV;3UOiN&GACPJhOO z!Ex{2O=7OKTL$&xbpaHxB!7`-%F4__pqOfol;+hyy@k1}mNc@$O5pg>ybx%S?VmV; zwS`4M{v8`uUiHISX9Elb&oL1ebj7reESu(ZQ4p0!V)p3fo;Fsz;Q$ztaKSK{a5f{$ z8d#4SUkfqY4@AP!HWf*hBIOQOMHOZpf z^{bL2t~N$2E>C573p+Np8uD9G5IPQ9nYR5IVl2Xff{*GUh9p%zsr~c?Af;(_+Zs8x z#2wcMOvJ{8ZiVjGTe>72GK~~E;|n9k z_vg|f^o1kok)Z2C!MT`6&*nnZP*&N2+zf`dwmY=r_&W_O&b!; zM)RzvGnEIgwgF4AT~TaOtzD_ zFf`%mr8OOsWKbP2K@3tJr8G=0o=mj$$@ZCk^SdD$0|Z<@My-)*OXBncAkD*rbvu=j zq;FOno=EbbL8U+O)CTFBAV)+uPImIs&%|sG&P*`Na|#p0z7B3enU{7=2$o##)(j7z z^?~_H1)zlS@Zb{GsVF44^%Wh})n#>Urj+!@3SATSCqG6tx-!1?WV({WND`2OekH%M zJAXfi+0&d@`ft&hIX-_$sZu@R!PDs$n#u%_iSAtYT*(!G+eBPhSr)BE>=Tlbrvb>;gV%NoGa@~blp(F zB`R0AVC4$ui~E9=OQ)uPW1~OpTALQTIxd==PToEHOf3(#QtD03tKqT`p@!~4O;pQy zpLV3vFzEKhM75m#X{Dcr!Pa{N({kn~_0gn=ZUEq#;X*Y!T(U-ob9F3SvPQe8EmbAL zg{ws9P$ib=dvUT0)x>bwnix9Oie+n}PBZ$;*FSda=z6tV>C(v7Eep`uyDAhOt^Abw z_ss)4_VySjb?Ij53qCeq7KqIkeQdrUWAj&hZ2r1HZ2qc`&0mqRSv9NhYO@L3+OSgN zj>gAHHX#dKy~g!1uFwW0d~kVJ7i>{BViWO52b)MYhELHcA>rpA>RMdNPOK`djcYzv z!y~zEB6o3{6@Njewg~sJDA|xD?!R7zXnz;5k2}GFOuvoahN)+h#1%pN)D!u5HdvEo zpRdBdBHS`qFdioWw#HTUjJ5+!5R6G#eMH5Hzj3!1sYj+5D6gnZWHvCUuOlw6Q15R3 z^8cbsvw-&UCYYEA{MQ#Bdjs0j-e_VX@Egw8Z=QyJ(@?V4d<;8u9Srqo`>}m9rUnOQ zcF$Ow1$+w0Z;OrZAjouJm2PnEEjoJoYkBHAvzcp?B3B2fh zmkGR6)SA`)#mXXMd?(tP0K=io|Af1_ydf=pV|+<^-p6n_GuF)ImFe;8@k9oooeme| zWZxpp^r||>Iy<~BOUYh@^qG_EX@W*&gE>`QIVhs*g_C5F#E4?aVd!GOH8p(bLZBmT z<4k`u=3LA;FlbIMs3v(-*0Or!rIxn(V9g$_-lWFFRfGrox;$cxNgihSBl~ji0xGZN zTXc+zkI&R-%g<&1lvFwun0ii8)<;ejFHCSshK`zn4qZ+4d>$24B}6T4`z>lumb1I9 zhHw`g=CQWf>*_d>E170S+}PB@hbd1+I^OdlGk{|~Q>@cBar>m*3^P6zO~n18J~AnCQK8)WYqVgEr>&bCScqCAe@blyh^1Ysr=XpteA{an|xKNA61PXJ*!a z+92EMKm!I4k+)r?ZY<{@P>~SO8dZ_CGr}UToeERPx9H zqfqyX$rb(oDL%kcUxo+#yGkZ-sOU{(VEyiURUdelF&>wZH%I}yR2 znWTBZA+dW#UPFHqUX{g})GdK;kruGH?WCf(iMS?>Tx`6#yQTpX-5!aJ>>#Ws#Ya@j zo8|Dq0|Nzn`bU(=TjpJ@FwqGi_VJdU4Y}bdMb2cYsrv%>-20MS*M{xy&^IIgX9%wWAdiO$mm%p%*5!zVW#vbBxX{t?48n< z^%1czy@T0r^f4RhG&OvC)r|*ZT^{?lrOjs;+2g1(cx=<0x|vZz4wj%gxc+)p1Y4>` zD83|I)b-5YJzRZXz}9yo_ZeB6EY!c#D!(dHcDV{F+5#T^lDO)_rtvF7HNpS|+~j;t z!J~!ot%!yihv#Z2-135>`t@^gGWxvPG(g6Qo$sGe)(1ednAGOZB~i<4IOhW z_w9NY-K`&Pci+HKzCiI~A3SA-`vrV^Xt zDUTC^G}xnqDnciqY(tW0HYq7uc8wFfiiu!+?n)L!`oEP~0rtc|K|?C4-Ij>#f34?eP7)@ufc9)INq0HLzFPwnrgMht|dLj@3r1C)2QJ?Egxae?LW9HOjn zq)+m8(t292SZat#j9Z}^farJ*!dg;%EcLV%s-x|3ya`d>N_MtWP5Rb>wWfcgh88wb z>`JJO(<3u9q*?NcJ=8)lJN0^*OxAGb2pYVU=g_88b(*0^KNZM>n17l#vdt zmLo$KI0Ipx6{Nu>6^91D2&qVsHb_UEzJc2>vKngM0$?USBNDfie-YM`A{X=LXz}T% zCEmqZel%SsYE8Zo>GO!?BCn@L<;)x@GG}IKk$uq|FFMB!#KZC2@EjkI=*JBgZ9Q)r zzvN_jT6_xXiM2QNT9fX_cC&*|GdT)53F;K5Y{>Dei4HdrGO?ZG{6rR^tFsojU^*g$ zWH_(~VQ7@sQ)4q>h8A7URpN$M#OSJDc3i)=wf2FKE*W*$z-mkNq*b?&6UE-L?Do7u zvKv-+=F*d`$;9=+K0C8nx-8A8v9j3!w#{{E);~{i z{s{>{KPSJe3)VPZT4p~XZQ0qMPi6B+%kE0v#sTRJ6c+EkL3QOM>f3YRL_PWyq@Yi) zgOXgPPeMui_E<(kre6g~Swl;|=&B}&@6A4RGD+Y7K)KY>&9>!DGaRoVQH z6(rxW14`6;WPwuk9e2!&h8{Ef(0gVdnrFwM|IFTn9Y3?zv#-x_9&O2=C(^Vm7!R^h zL|jtXOvHN*sAY>US@u1No@!EUNgZbmVYfEIZm=}-u(3=7yiC&KYF4hSv%@FJ-CjlC zvnK1W6V{I04@q;XsgnZ%a z%5b{%o&_)@i-{-TAfs=I(#6)S=v~~j*%IzK(Sr6nWAn0fxV4CV%Cn?F$HG&MhZQz@;M zT-2<^dr39I{*0`X7_i*;xE^0A;u$?KHEn%L+EY!Gv>yRM`7%UZd7jO9%9no{aM3rm zzjE`i*-frvHfmB>S+ikCbQSC0sb@c0L3|WrUq}!rrkXm+G)vkA>Dp7Zl)alFeV|D- z0Bt>v(aET)kUp%ow;|XHM+F6YS8)&b(rGfvA0+-&lfC)cxVJ8VY(zrQvTk&spjEvI z*Hc}-f8cCzDBeq_JYn6EJ|Esk&(SO_4xH~>#H5u%mo_MWDoZvNK3S&HNS0X zH#8uTenw%Dlnz61MP~rc&*O}aMr|!GrVN-EF@>>%`9)7Hjy)$bY9m{g_E)0bWzD3E zrGv#bO3GrNDYF0>7SMkC*i5@wSNM4L3l1Nxs*30jR)I0_co>sY!)0<}R>-?l{tSgp z(U7|JNrjGKX6?|$WN*bH;hWI23f>7VD%3Ge_1d(vDJ4x(XBF+&<G&zl33{JQIlkXmF1QT*bVt3;pR6=Xp&b}){xp?P{1+POY*JXZMzy1VvuL81A@vwUHEE;xhzdW1ct`}!EPmx`+tDh!&=a(>F)(d#$ z*c`ieRh|>@D-`qW^&;HY>#xtZPQCW^`f9trfpyy*2HbD=Qa#1fc73(lt*_l&l9!YF zu;rR0hQ$j@oHzy^r%r01upXN{9Xd-lLE5Gq@_>DE{iAZFq^BR?YA zHPzP-*YH`u`tOra+GiHgI?uDJ$ux^EO`au04P8L9VtQl z!gF}X*{lo-+NPD?6}8Sl6~&&A{&P!`Q{7}|VwzW*b`@#h!P_gT321wd&P2!VJUQl5 zW0n{v=d2y4#_V4qhpq>6pfxBR!JHTE`i<5JSGbAuM)MT#r7V?aJ2Ye)=WABX-4gB+ zJ~)!5v7PNNr=K9y5v7}km#&yX&yJN-0nHCm6c37~p0n~|%ZfNRoN=hBpF{BVyDOkB z|3wPtw)l4K*sR{Jck74mPJQt0&XtoCq|TC6p2dx6+rukWXe>DUDZ>*6Rdve8HWOyW zf{gkX$jxzUSM?!T$%{A+jfMcUuO;c53QO(z^ zW(Kl;C&?2Xwq@_`n5S5OE~FuJ9=B|55rBaDsmlY+m77zZ1Fdzy2f3A;1AVlwW$~?q zVERo(j(~4*^SX_Tw4{@?m<4uj(l!t9iAsk759)iVjv|b9e>`cAeK0 zIILT~9B2+jS(9~f&g!x_lA?7_?*cxF>M-#1E-sTOw&yN`bfp)7b7v|-0`_~89U9ls zv81Qav7=M3c#{chPZv41Iu+uUz< z>+5Lsw9!04X1fqofa@^#j>KnzpAz4ZL!5m4$Y@{q*4%{a{+bE*6cF)Yn`Wgm^nUfz zX~ciOzW=)3M&afkZV&74HxF*%926Is+ueHmw59WqZ5TZ~?xOJd>FIH+ zTNyl->1mQ*W-Owq3K2LDFzJ6uvK<{3-fnLGaGLOhpeF|*W_ex)+0R8%CL4<0NC#c*moUL=33G5! z8_2>oF4DM8!?q^zaXr0gbHE>>A8%AGOwA^=f)ul5O zVbS{MRTMsdy}Db4Ar$||ZXII5*Xx_rv-85)h}vB3(2AR|+iSFW2zRT8-G+{i9v^@t z-&S-$b+dU`-RV}i9I&@n7}WRm)$Vb7Mg2q3>(vvYXl(B9pLeUTcbH!Cv<&T@+0raBH(8m*VxJ#2SC7|d_;=baT+`aR4QbO7?N-jo z1s!Q&Mp>7E(JuP>_;}|&Bi!+}9umI4Rm?g3_2cu`JCMT7-Q#Kp0c;*X!C89(4G+b1 z@2%557y^3wBV=PvP-Mbyk6Rdkk7eNqn#xait1D1WK0^!FGcYTkq51NR$;@YHB6rVB z=QmzHUxj~B->KBzWx+yzaSr)c$B+-;*Dm`;)Rn($aoOnX;rZVA;tmxUNOu{{T!1lA zoiILqTj8uwAl?d7RT!_=SDX9Q9mY%##o8H^Ro2bzW{0xFfM_#ZRbgaL7r)YC`8&qW z2*z5vsH@D6Kh|56B?d&>;i?KFE!*qu<_cq`hhpsv$_gugbhhgHda$Jtj5T#pSD3@6 zuG0cr;y|pOPE}#tZFacS;XtgFPE}!ietN1`uD-2wOAESZGS3gsq2uet&&A7Wzb7?GVH+vGZ$f=7G91*~0W3>B znqzQ#kq#b155W-;uw!r}ttr>p`hwOh6{%m!#(j_01-S(fz zm)n1eZ@2%%ysYvQ`L@bW@pYA-n5~09k$VS!ikk<2f;S6vbxvJa=)Tnk4d`E*MHUNS zEb#zL#`bL#aSlYWlL577@Y+y0DPVvi&5kfc`SMQ~peAw3?uLP(n%B4jMxNbdostF! zI=z(peM4GTTvD%Ue46L!l+R#YcVnK5kOX73^cA+K@s8coiiWZx@A@0`yu-B{>={eej{6&y@B z9AYzZFw!4Sd7D+doQ-?N8@H%6wA}?4(1x{Sk>-@t>CmaIT*$u46Y!4Fev8ap6hd4Sd{a&@JKQNk z+UqQ7pIYta;OVwy9kL%`>D|c`T49mZaPV%Nvnv8yWr`!g?E5RH1hS?=_FaEzn1c<9 zwC`4(aq>N`b(B7l8!30}QU^=(%rAXVVkTl{TU3ca6`ayl9z?>6-oS0$QU3;3*tL$+ z8MP^sqa;eR{a$|!-efR+0nka#-gd#H1Qm274)y2{C`myMAmcQAP@Il1MJ6&3ROK5; zkcOvYzX~SEL_`9xV~LO41>XK)~8lg6RfrRBJa`ZC_b!E^D>i5IX z0(kSLo3Cj0^1Wn5Tz@zQ=7-}SNDB$xK!Wr1D{F_q?0!*4-a~R`S3-8f6wO>qyO2#| z8MkfiD$#{5-Gg`QIJAm8hR^6=&z-%Ut~u&wB5d~PNXts0qu;Ff^OW&7rRNixMXVt2 zu7xBgg=0uMl5q@4Khpo=`rsJ7F1%yln&c#I2q?d6Qn_Y!oh7fyv2qOE(7wPqD5L^3 zunN!siYQ;Gp_$`K&4PonlP`rkw}EXPvqv#RN3Jd4Cjj|*yirUCQ136}&6=~1Rh_l3 zN7|Ak-BFd*$Nw2$s-(y~d#S0>$%~d8+OX?W=yz}=Efm?ysU=|KS6XQGF=Gt0aJ|wYD+tb> zu%gA^Xo9J@d~tM;lA4{8iq{V=!O*GE5e+BT`mr=sp0z&lX-+SPAz|G( z=#ceSRvb2u@RmY`2FYv84t1lAbo55syp|N8)Tql}q3m zi8lW<%fX^oWl<15CtAJGj)J5f3?9%e9mF?Y;#)!o6JY!`VTW_@B_Kq~uODx~isRw# z6qB-hoiD*@Yu>c+c%Uv1-M=@BF?Tr#6K)dI;o_Up?(9IP1i8s_+Qwu}3oq&n`cSqv z<*9%dw41z)*}jgaGDD>2&4~?X5t+zOVUFooke|&C03zDY4PQX;fpserfJRotR_ss# zFcy)fn92K@A;qF|kwfYKa(&>j@t5el$?7V9Xd z6$#dEs0`f(Nh|}V^%3!Y{{6i3o0h;>ObPvHT5?3>HHQJmtrt|lUX*}Da2LOTP3~x= zEl==4FMkK#sZVBir-137ix)Pc;df&p!2BJP?!GfDy1SeUjrPG^4z&VgzCw_qvHkgj zSa?n1rYz9#?#e|tdRNCq!;Y25raYouU?(CYVEok>uuX(ee_lLT>K~*ouh~Wi%&3Ju zXGmU2I$cYzhw+U3q<#p^peeihu|wJ$mLVVm@lE-TYJFG^<4Y19u-}9I|BP~%pF3O^ z;6MMjgbbn^60?6YiX@MlMlh^0OhHWH6MAAiF0pBm53>Jncd~8u*qiN9lq*|(HNRR^D<6pf;pC?F*Ji7_zD?T_QFTp!-`|6J5VHu3QuHg#n!%|rL%HA*1CrkI+G*$ZV zY0v+Q-?}z!3M8l+{KBx?+^-*>cl-hjHxdzX;pz8Cl88NBF%&Bun~b~g5nGF@BO?8U ziX%ZkqIC2@x=SsGpJ=^_*j6|Q#RVht6fwIoi2elRy5KH+*|6Hi>kEKT0bUqcx(9K> zcHkHq84a5RQn=V3-Aa@@RgY1aYFpE1qN*>=T>mxg5tCmL-ze;!UIIvBqU~To-h?{q z&L=||>o1-w+M3`0rm6Y;59^;->nDD~=d{{N;3+_0VP{_P*T)@6#_$5ikL_j$;TXe< z99c?>e9->t-&|uOkXPDQ=6&+0*{>(IkZ841T2{QZrX>IQzv7ofo2&HuNshAbR$s4l zqoXmn5bmDP6b6Ll`#@fJ=-0CBH*ZYhXhhfKkTtC#WhSWjrD6LkS}xZI*Vhpv6o;zn zvLbc+0mZR9YO(~T$=YT<9*rvg*h{%USdq|nv>-Vg$YTeFRcw<#7}dnb>McvV zXVK0;*7GA=*5oZKQV^s;7Lo>ANE$>TX|TE7;Bvb`3 ziVg~*sgH==zAlg5fj$TzTVccC@~mkwxc&@IC^TbRf8ikZ#vB+m9I$72{%L_$CAgf_ zbqRZiLxQ%c$rQ%2enSwh&H+_q^+3mrhZ7eZ7(lVllS%F{=E(jYeN zv^k{Tt-_tQDI9_e;eu$NkvuiNq^89rWj?cAPYYwa{5+ucEqYoQ6q2TH=~lRgD^^XD z9SXP5&CtTQ1O>3tpuBLhQzeI)o?Cjb-K;ld?I^?o_l1{El-)t>xHY%XqiLtmrvoIN z-r~$H@xNxpW91mKbuB71=ws~~@~2~#d@ak|)oM-RUrr&f`jw#hfGmJ(LAWZ9bR0+= z!**M!Tm!dRadKn6Cb?@k;#dmVfoaYGSt>XNK0Ae5|LGQtPj0?lp0GL~D))fhGa{$p zH+fmsuCa4%nr_M(*8mPvm;MxRCoNzLD1=9P>e-tz)pY zQ@G9EF_>#qx>pSWL2u|Z!!3B>7>vEDk+l8k0uJHNu7iS2;~4CrbR+y*NrzAD+Fz&8 zcj0TccO$-wk1uKL7PKGsI|X!ZKJUudty{ix6n8Ao_i=mQFIu{UOjj`$0)Y0;T*?k z?3G}*BJWuJ_|b_WJHFm6v}2R;)NL1<5BG6(6Lr_2?;f9`yY=_=U9|eK+U#`eCtCF5 z!`&ZIzu4gf;P*0LJ>K81A9kS&YU|#qZR4zQtB_mLo@%$O3`y%6&bjjo^USfiWzA+y zQpd2R)ACU zp4oYKj_U|NUNc9Z&Z|BwAZ}{(2V2^7(%>PT$NI5zPRI4ZH5@LA!LVJ?);8@cQbFmdYl>XL?z8uZA81eZ08=ty@x?=^Rh8&LO zH%KPPtVn8pB!{pT?S!Lqz9?abdqu_YfWR4dS)X@-{OYc)aLU`9@y9v8KggB;$Ogz! z5<7Nv<4!FX?o$B@{ubxIoWs&KgguLMF#S;^S!sCO!hh2|a_PROgBdosc)DBf*4Nt6 z1rPV1ZQT5tCh**$ArFj3cM+OXX9sc6b{!UD0RcHnv9f<8q^q3T|%;1Pbilu!Q% z3+z08{$)v}W-oPp5_R*bY0~(o$yYjt&+JVJ`^yLn;+N92@xclIQV;Lo=tndz97V() z&sk2AaHFC9OPi6#kEAC3(`#gU3=bN?@P<6qWm_g?ZmraP7&`;ow%VV!NsCrvHw33V z#wl5Xvf@WQvz_pL-un{L%%kJw1sM4nnfYM?h{C12b7bO;=sRsoEF07il$B8Mya{P< z%p$x{`tvr@*B?8hhom7n#?`BF9m85Xc_Y_Xar>rGJ5PV5vu90LScXlD-3yK>HkDLX zQtqRgB!mvE7UN{4t-oUz$9NSN3CZ)BQxnGlmFDD^k*O@w%=os5H5*5$^}T&p4$J%c zt`tStX8Vr?D55yey=ZJl2Dow{yHJ@R+Ltwg_j! zjfco}uMX@|T3t!z3hX=&UnuKt^uaQ1itaMQmTXDvKbFPZRPl9nH6~SF@CqcyXeAE zojmMQuy+#tIYa>mXLE*Vb_i;tSPv!8)@#@ZZu&Baz_UKtbILAJu<0c`APK*8E7Nt$ z`%5zR>-(ORr=qa;1vL+0LOQJH&k#7xH)c5K&nS2p?}=}p7}CCdi9XF^MSg^OjB+j< z=%LPq0zcjf*(JZ-ooB0aoaOOL?msFHNqx3wt~Fm6*rA;Nf4sfvcH=m*HTpzXrz@+< zr_N7VqHT3)YEjCe|8P+xB(cmX3DUOm=|2D*L`ejR2*7u(?#fINdt(knV2BvzP#WsP zG-Bf`dmEbc!$h2g@V#O3HgE=^z{N*RK6u`&KqP$AnyH}J`xZTiHgoNq3D}5B-hqn+ zB3(az|2|Kd@$8MJewiomk!M^@fb&;2GzGL$aQ+Y#PjVI zaS~57yRD`hltxN4e&!Bn%}O+YlXxXQ#Zz-7u2P)jGMA1Js=TdU_Fk${VN;b&YGnKm zLo{YasG#E07}@Z}J}qOo>Dl`CJfk!am(NYy36im!*jVV|F8}RtXLkm8HO-|CBCXp! zU3}s~PT(77WPNlsn+=j@;>nZT6%UH|H3&n4bo}tx;r>EgldQteUhL-Bif>)oySv+c zsL4^w^4Y^MxC_*SRXb(tAy7S08l=b)9lYEVx*A@@ z?7$L~-XXOpz-O?%T!ROmJ!q=gnnkQNp_<6A{3`PZOXv)11rN_-Gbnnff0h)%JY>u1jb2Q4Zk=hAL9<$p3 z4Na2R3`-TplDY??N2qhiTQZdU%8u*tRwry^iE~jSoVb7m8;HWKivdd z^FoN}7HJa1xe3yXz|m!*&3yu0rolZ0MV=xKJ`DGPpfpg^Dl~~{M1akRa3gHG|Ym(V_Fj2Z*!U8YIeBLWO)#wJL=vu7H;cCAwflDLBo~|n zONZKypsH@a_aJ5W-}y@3?Bm=R(cmo|YG~t(8rnFc1~<;=srIi5ZMnh=d$lSwZ1NQ^LdZ+fxb=Z*0=R+Z5d!G|Lnb>3u5A)V@0^Vp^HpF+QBPa zK)&i)T<<+p7~}QLHG{;e*Ug}`IkWsS(`C*5AU4lg-P|xps&?BBNILA;M2*khPFK4v za(3sJn=W9PSz)W4b2vPyRzVcHZaoyR_R$0fXKso-Ez6s**>?_r#ix7!zva*M39&4{ z7Py7FoGh#23O}fyOWhT){B~c$>UYJTu?P3(d|^Akw&Nasvm1x}i0g>#C|APJ9!a<62qnl2jm~1^mVuzhofZU~ zAsfWpixn70VhtFoiuE-JFpf#~`hhPLdkW-Eqxx{cF|K^2L6P;8h2nA&r3p`^4E9dM zdu=yPmw|B$B8LNM0=TIFu4MQiK)M}M|3t46yVMJUZi}b-cyIR9A9~;FUc;|&7e~to zu={22TsD%rnxh|kA|E*5&lHC%3OH{6#YI<=V^NjlKuje$4pT`l^M3z=f;p$3i2AWc z39G;{FklhGp|rj(ct5T9r;bS_e!c)Z^SMCpFiuDgIA9hWPe5c4)9RHr6oV*c1q2l{ z>GmhpB?GTCDn+?j1R*miXm2Dux`9)tHn z#rtJAEGZ_-Vx1E(Qov}Gu%l;K20h8i`QMt{&W zL`?Y%H{x)a36$JlNH3J%#Ko;+$Qr)8sV8&7-3P>pG%%J|Bu*6mI>_$RcB81e zRz-0d6@_b46s$>6xE4h*8WhE8PZX*-QH0h+N6_?85l9i55=Cf96rmwegmy#`nh`~4 zMHHbCQG_-`p_&i{Ye94bZ!oa-Ls6O!MQJ@0tMO2*wnGt`4h3sD6t3Y=uy#Xnnhk|( zH59JV&=EWnlqN%QS_~Z_Y6RC_=m;))Fj@;8!NnCwTlw{+d*kTWm-{^<_S@rszf6*d zO>0V%PS2tZuoJ=GJBhz`pEUJj4`D%1%D^e{zy)n%gzf_@>=nLp9N2kyGlY!^@u?HU zsr)6+AV(1wl=#BE4TR$<=yp~rODhiY;zYTP1STcq6^7vNWPXD~g6I6ecqDJHO zX4dr(^cr~$**)*2g%wRp5Pun9fwKI7^^JXw#M-FWi@ zme12>HXQ>oFWbc&DRA1*kw>Y3I${9HR(l+qbE;mb8lj96-#r^+J69Krjgc9xETQI@ zoJ!&uDPVbht{E$kIVj_ihFpMgoe5klNN7^`2rkhq49U?A7raKj7m6SpBkZKCn7)-g zuUVcp%cvSmh%)_qyo8I!fA8jC#L|Kx<_Z6+hCnR|w&Wv65-i4>$qTH|3+RHeSS`Ve z%%UECfVwPKUlB{~YO-B{LH2mN+kh)&Tk9>Ng!T^Je%qJb#)hMI76ODHeQl_YfbZbJ z2<0o9G}A9inqi9Z&6+L|{m|A>J8a<|BwwQ4{XT=`$5HhPs*XAY8O>Xw99GhRhD7Rd zp$ErNwdn;zHiG~GLo{lMgEy)x<>+o@&!&6krS%g z2>D(%e)4_S2x7lp9^iEI=lh!+MlA=w$`JNXNcuV~qC)yp2AE%`B7W^|A^zpQg~YFu z8g-`?T|hUfdtxl~fGQ8>2$(cRRu3$o%mh0_QPNQAJs2uGbm_yqO3qSyFuBa}>Me%% zNN0T!Bof=gqZ>1ZtKWoR>_sh8i@UtL=^wD!SC<%)wmMTx(kSbnd8T~;W z2nQt0a0*ihz-yUW%8fvxG(SsSJaj?=pTxO$Vul(hCuaGSdW1594VAnaX3Cg|iFr&r zBr&N+v{ECaNmDj;0BlgF8L&thfo8yla}H{ztO$V(Tg1qbSy19+?tAZbv}<7fXy8sH zu@Cn$iT^m`uNhq7i(tZZ(xm$m+6CVOks=)wk`!@PpBUXS-2OYpA4w+pE!`8Gy_bZ`FXmCey-I=nQo~j3! zj?m00Oc?jN)s|p-eQ8TDOct~jUJ$Oe%7Sp+Yd)3&TZ*jr>|YAIEXnGy(pw^G81T$6 zLxJNk!y!zP*CNGWoW}lCM{+$&XOi?h&ypYpVjvBmFm=?aAAh;)EJkR}>xz!?%w8TnI&nfdYcZG}p;rya(;DC_oe$ z6%WSaM297Gk6IPU2+{0|*Y_k2&j!ZD{i+NB$4Tz)HFDSNP7c>;#W>`5^K}@~gbH^G z=q6+YhI;a6;f9*+DLneuca4x7Y+!43OP9BeVQebhjO>W6SN%LG_edw@mZ?;+ZU=X| zAk#p8kkElp-#}hh(XRn{*Ja5}6h*&L{$|R7c6FG}lLd>& zKxEb5oicv+8LdkAysME_W5^MkM`-1=%}|G}z_Q2#GO7|J=~)jib4092Kt6KKmMj@` zTT<=}RGEOOxmrbt+>fw47Ql~bZtm!mfx&fKvUK~Z$IwJJM^hv@+LYzHX?|X$J=ahM z7-$la3(LrHX)Q|OrMcxg@OQ>eB?$4mF`cyL=(vMoGxhCr1}q~>GJ2M7;E9i2Mq>3L zqA zzPB$CX*fQ5Dsn%0kIj-6`zXjwP(IBz_SWR+DG9Cb6KlPlt(FD|#h(VcxFj06K3k=e zn24~#J+Bfl+@2Wa#tEzVuZB2zI>4c37jNz;v^3aXUE)VoyBi%82C2V?M({!b(VO9(sh!A24(&B#INd^CJiEz6uHUT zyVPmk;7T4mC7~-nwYcTGBbtbRteY}vQj8u~tGP8^I`($FwQRYy2xGOa$#$}_OwsX`mtGEg zx`YmhuWf5!Wswrp?#$<^)dU^lXJ8*qY!KM%ZX`Ty20)Tw^gfcq>MeDRueFM~|e zA`JtN>4z)P@I!i%GM!zvlrEn(UL1B1--L2-#W7{2Iq8<}iqR<9qC7)1)2Ua?w(voq zOSu?-cV^42wOOy`W4p?%qb} zMe|Wr{X4oy3pkN?>O1i3hw4JX zbk%}v5iDm0a20I9*^q{!>lcHvMU;P+t)k-FSj89$>7?Z!8!V!{HXKvIjB%)L33>R<~^!C1#+~Q+4gMt zjBbgNB?)~;3=K`5x1RWQLkxV5J4&+tmZOpl0DC}$zxM(vJ$FbZ_TzxLRl}O}brzjP zx=Za7l7bK!IZ7+QzIE1t|1O@kXN8ydI5lW7w4rI>z4qMU=|Tm^Q{HXKbFcOJRgY9J zJ35rXfj6}^kltR0RmA0|EO`e2`O03NX(&`HJC{C9?>mZrx$h?N>%!W;tftQ6eD&>V zW_Rv|T+ny0$>zs;3&bp@e*zKq%lONm4{*?*zkN{!HI3Ib-nsx~2g>hac4A(s8>;3~ zUK70UOZs--lkB%?;D$u<5}=0Mq-ByI45D5ia8hJa>_hUiNOA(k@*ue>;ch^{Q0|t2 zM>P)O+7bo9MR`#fb7W;`fN(sX2X~~;{z=p7f-H_<&5W@@yojtFJ{ZxVhjK*SKT2qrKy*@g|(SY zAeilP2dRU--7rOC+2X`S1c8?Bx-gl(w(G-EQDyT1s=(lB2|+Va3lUl^-H%5mXYLnNbrNNjfalERY+hX zaJ>?z<**J}|G>_z-UX!BjrF(E$Xt`4yjr9(K1 zLvyEEj_dpNL654~YQy_tq^P1D`H9IeMe1g5ga8Mz(pw>BLm8c;jH#;^e z7^I_WJjpT<@Dht>UCe)h!q-V4bpY27!Kq>mT5O)j@PTay{8a>aI=5h>{-cF%f@%^a z2bkP(!{8Wm^%@4-pECl?$#eGAYYW9DVSsZ^K!AEL4Fqsf5Tx8{1VNfh^2&(nCOjm4 z86XFOC}Y+@5D$Mq5r2UIVIuJ})CWLx2#105qNgN-^@`Yt074L$Jcyu>0z9<}=#VVn zW3qq`$^t$r3-GWkz+rweTQA`imRA&7k^yzJ0m;1PZEGGONK;6fJ}mF?7uPxm{u<4U(VrRkz^551J4rIObIJfZl z^~SPo3~*!3tuYG8#ONARWFfU|V0tEi#}HGp2JI{;X7Xdagkrd91O_d}&lZ!dP}q7r zgSXxW+(FK_m)REFct5N;NY*kGpf1)1u-g4?{cy&=0n`5uOaJ%r=HtuA+oLF-x23`#&|29y_$_94fWVKj~AzL9OX#E3-U>(1O z77g5F(+My=uotJRZ%Y`$ngNSsLHok0Z>Iqut2q>40|DP>TNvW$U%>P;XhS{4u=Fq1 zd<{gb7Qi769UU`Z$HD9ofdJ;P7;pZDBEACwOoL=92@o^`&eX+f2bG52{NPw zVhyhPYHcl{2<`|9ILFuUk}+f8>uj}yX0(|tfvv{W$`usxWNoY^R0Co#X5hR)LF@S# zo)c(4se;V@3(sad-oP{3K}8>M&wxYhF?7D!U=7vAXm>VBi?ZQrl#S7&Y^YjfL-it? z+3FK$XM!~y8?3k3a6QC+f~E&6A~syJu;HqO4b?4dxUyiQmS!8iZrbpL(?%_7Hg1Ws z5o?safu;v9YBp-6u@Os+jS=S?_^M$e)&P5Fui?T5Y<$|gCAfbuC4*Txoq0IszT9GpMn%aXA1Bm^(LmuDe9|A4w-<;4Y0ke*yE0=*^-=stAgR~-T`)@(%G zPVj?ckn0c}GdDfy5QNFQ{Pl$jK}2$`QIKXqtknc5$LSC>F2}G0MVjih;fLlp;2_*U z+`EOJRnev8*gF&ABiL4=mOFEjJU5r49~`?o=an(sT)9x$^LM9UO;uD zd~$HoEIB&dt0f#tPb3Uc*w8&YNs*@ow7^M``rt7`yi)>1#Qu8_12LIP8{dTxSf3ZC zZpTp-6PWk-P zhk`LOh_z$wG6?_*!VoUE_*-sxUc)Ne9fD76@lf~84H3}DrNHGocGCzr=i>6udJkEB z2RSD1sS6w$3L?_+8&68A*z(_rqEcEd;DaWVNOgs5Z?PFmgS(kz}rY=Qk z8p-cpx6?Zd7;V`&9%%jm%3Lwz8NQE42*`NF5qthKtZ=N-B#J&trJh1#6pB&sG%u%~K98cmm z7zk{Rmbw&oo#~w*Q}Kd}X`bPbNFbZ#i7a}>Ffv90rQzCok^9%9kAxvJOfsKjDBuSI z<(-Z$rkGwx+zg9LUQx&_PnhnHg_0!1K-s^}u~(!BEK}1^bCThhLK(&=XjW}B0fBrM zsNPY8LgSwJzeC8x?+XFdkLIU0h+JC>7aX}K$MXjgiW4Qxf(ge}d-QN%Fh&#NnvW zMf0TaPQ=F%u)pE)OdiyhD-6gM?KgrNgF{=eGT0k>C5zs0xHxIHRlrE@y}Ak#4#pOF zMh+RFm?_5^H^Y^gBSqjV1U4;lToY%+&)oMA55;DSZQqLe{-!Be+9m$uAPmM2u;V^o9Z)2B{Jy!ktp;81rz8jQ}GX@AdpRnM*dpyHfnuJAOoyuTxXOr}R zo^AYZ&6)>CC)i%j6P+odGrrE%(E_5W>sAKJVeuC|SzJ+|<+1n+({9)wzmk}sDZC`w z2ReA{K)qTAk>ImNw~u_9qq9CFrB;W{+rYZk=E2MMhDBrYHXK@OT=^*}bf)siM4Rfj zr`~!g{(@gKOL*XA2_;?<`+797CcMar7K6qjF8&fr?v1KoHI#q~uc-)#zv%a(jyh2j zq*?^pU_Gg#r4n5je&OMXjx5m9tV)JoL3~Jb#!&vNzWInMK#_Z976?Y9Go=|kIUHm+ zZ4?>whm-E=fYf*q+ODRitE1&&l{6g%O<$?fQDgMf4-LJ+fX<+yFX-tCI!m?wGOf2n zYc0=ul3hcp>q%1nAD@KXk>XWw8e_b|qep3p*B&q>O`ha#=#*oJVp_4b`+<$fVOY5; zuv|W}?nmSCqfWr9tP$;A!;u5GnQD**7a&w~mq=`5muO^Dmtb&9?W6AFntgPCQp0}p zi)ar9i2v|^$S;vL@J<{*UI)N>op*FYl9b5aZr=f5^vAdWH5f||&tY@~HgAJD1R0fH zB9+5p@_|5QB*~6$EW2+b2dWPM4uN!Lo!;Rug}OYi-63M=oQdIsMnGCYxK+wj{s%Ay zM0!YDLDIgT0`KJSm68)Lh}`by_0_lgcCCJYbZOvCxG#W@&e-o)_%?77GLx40FbpQ2 z5;L;$AeKy*VW{Lq_aM^UQzX#$aX`Tt#3aGjD( zj6}A_Fhu7EZ!%vSidd&|%ZS1=(T&5B52WlnL@o{(P)AdWF@^)bKu6GUrpxOQ#BPko z@~td<)qm>b&F38P@o=rYi@j#me~~P~fkR}m!{qqeztGS<8p$VzBlAt5Oc2CxB+KCE*5iEq4QF%A)_o`M5X7}K9vG0qlUX03Thbe=dQKJv55>WMjug8Q*NW^64WA37zW zUVtje^kOC`Z!1(7W~l#D&>X5UHE3GaoelWR&4UEZ(sQ&vghuMx4IE>y-+)o}`Yi{- zUhkxUFVYv9_@4r9^IqT>qx}kvF}be@;3jts2iu7?5NszlK%_-p5x7t{QvDJeA)X5uTXSU&5dE@NN76aVQtid6&*a$nb1>K{OI6L!}0Apv~azM?* zTl@!>0BmQrfcV7(Y-hHB_*}8(-W48h@?60&=3Ya9Gxr)e+T5!daF$n%Mp#}ARKs*? zI1r{&jm4Wz4Fke-YOrwAse%5)N+u2Cr$td4KiUKs>#2+8%?%6OAh4RFb(kq7{6At2 zcc;Nyz+E{$p8s2|$jVTwiUoqn_K7QbMwxcP#cFNFh09y|E@B%xuZ>nJvMX?QHo20$MTcFV1Oj(VD}RvS3%WjudE<|v@nR|^ZpG%662 z6kI%jy4-FX7Rsm{U$w!*i@Pkmh_0?HJ~Cv;pZg)P6p^d2a9OI6<)enKo2WGR zxp!qM0W;+y)FR;DoYc+Sh{8BRo={TZ`lmJ^=$5t})GTF>n^ze?b}vMdo^O=Ak~4*1 zj*=U!lH@^7A`m~cJgMXgmOMEx5(L7AcIAm0g1Q9WQ$+~%O1JcA zeaikU4`S|wN*j3(>EF|pVPDt}91qH{2C>H=1%0w+~F$oaRx_58un^{&`8OC7J>KLcYdQvWP*Y)1I}21M1&af^EV?b zUyQH-`>Ik_9KRAwkm<$$boS?*P$-fQEpZRL9IUxHUT`E9;daqjUavTT z;nXo68&RcYF_qhVZ zKw>1SqWB^iT*k37?&MNMS;bPeEE%QLG0hdzk`GTYDA2~{b1sg*;&rhYUBI{Vj%nC zxGCaTVpd9ViTA{;aJ#7Pv~+bz4|ZEMHzYrf8L@v~j^R3Axeqar4>w9fd5pY40>1lD z4|Np5F--RO>@RB`3a(S~CpQR-Qpk2bu2qBAJ)l{N(Xk9)r9)BAdK5=<{TVulOQcv$ zyVd;x{MyYZF6R;{R^+zK!xcc#v}Y5RC*^;j2ylYyg5<7ok}P))mw}BeL(L>qBNIG@ z=MhQ`FcmTRNZG>4EPv8Iwnx(zT5wuKk()^`&J2*C)*EX+pRMf~Xlb@CGD>-9RTw7U zJSU>?6{^N_@et=|IC6og;Yr$P=_ou+ip(Qu_`8d!`qOwecb>-f7ShGD=jCc+Io5Zs zKFyf^Hnp~l2SULJ7UTKszn1guWwy2K^>_l(-&RGQ7Ww2vyjP$YyF!jU{-=|O-(d6V znx|wCJA@?To3b#njkR8FwzK6kToo>%&SW}!dP3lqNF0y*;XKVY_SWHJXt%KtBs*y4 z_TRHLB>k=t;a3;0Kss0l2U-#9=JK3gZ)*@TlwRg@QwF*=2#`ZF4+^YQ27HHP%>45BMl48lUaEJ*Xx?*W>Fa781?`9GXe@o0RDKzR6n>eF2)PHyt| z!Y=ET3X)&G?RKCezT9mSl)v&|u(hkOZd{e3A3vI0cy3pU4jL(bG3T$#{UCTZ19i>9s-n1tUYi1Wye-DCB@T_Uuv z63S%vb)rf6&&7pYBFQ_r6-ho=1_iowS)FOebq05ht{K`9n^oGs6r@P~M5o_?2)aPGNd`^NUJ_r-Cg;+{(q*=nM!Xf!Bq?|KO5f7G z1FcTjJK&l`W8crJcTGCPraS49WcYYWp{rEb|rUj7L^vpuKe zGrHu$+w=v0F!`Ak7;#De>6vgZjArwgy1CgdxDZ}Nfi_g!XD;Cll~iz<)>=x^&sge8 z=1keu)4b2Tnzc# zNhROa)ntvzo#vi4t5Qf>to~~8e=RO#-9324)lb5tx_DaME7M_oTq9(Ru5wNojOMw-^;}4Pu#ZcFzp6x3_ByQ@1v03^N<1t^Amorft7)HAGp& z!3V!#Ziq6V<`;6t8P#_zOi@a`<)OH;R;7*7rnNr@1B6nCe{d>s0Bc?i6tq$BVNAag zgl1K?G$U^9CdAB=o{=q@esHWdapC4>u@{P!>apBj$TjtFl1>XI0sxfU^#5RKOYOr<8N>%@L4M zX(s?oI&8ZmC{VN_W7F|-QL*zl~> zG_A4~t;4QnN$cdGU`^}L4_nka?4Llbs4rru6|8Fvt!cT|a8l!>=P+@7!>kILGn7_w zLjX)WuqgoL8!)(`bZV9-lvUaKgc8%wS%~PTEJXD4Bn$ln5kNm>wsO`_sQf1gfI;&a zN;qIbE7Fy&I`%=#kWP=cj1rWVPS$#jj+4X2hZ`lgJa_f&Q4ab+|sF{Ez;7?~Y3c%qa|Hq04n0*ipTxc1{ zU*JUnW>Nob7Fh`tF4YW_p}qSxe5*!Ujw>w$S(2KgEK8daSeiJAO%$k2Bg(W)Vx3~u zv8s^85wYcYF}9K*f%5Fr#vi97@3zdk%f0$2-jqHO;>*2z_6fjlmXQcf(X--!$PT3U zcw?BW_0U_Zf~FXHJda|ChW6=t*|fXfK;s$!>osYcgXS5WCSeP1-&@Nvfovw0A19R- z*3%9x7Abt_1(!NWrRr&ORW6ebB==6vU_U`9OCM^6IeCm5LzI!r??9J2X1`tA%O{S* z*3B4042~AV=(6?JICRl3m)5Ae<SeoKOFbU-BDJP#JyQo9U?_3qMBxde3X{$ZH#fQK5h$F0 zIez1CM~BPUbT&Mb%}-+E^S2@t&J{_jKgbNNm<`)U`E({E@i9LcAgp(dwAYhb=D7hS zP7=39vL<2e-dAsG*bA)S6|9ZfyX<~o%V}xJPm(; zsK-zTW5zHXNq+Ub8^a+&ZRs>bc?p#s10T)s%JX;fUswXM;OKOPAkgWFhJe4y)*V_c zGIW#tEE0TeiWm;BymQb|;Ky#K{1R?#J4DwNa0 zGm?VQ(cYuDIx};^`OBff5eBCPD`t>(uM_oGIc~I1lAJA1uG9_aHODo$_4ZvAT11kf z7Ewnj*^gEQxwCZ|#8py$u{4lgf|O#awEzn13H&|)qQzd+2#k)&I~c=5-GV_qcS&WK z$~7Tjh5X1%Z3D;<9Aj=cNR?F?E($2+5hGx^@o5gvE6KQp1BP9i0|M*ysUpENY90V2 z;^hG5nMgmHtd`r^a<|&qnCwQ&@xq#3BI|(hyXEXZI|~TiR$CT|73IkX+{E+)2X4>z zg2AG!!VTPl@5PGeQy5^+CHY=lM4~-gNE`>zkwUofWr+Cdc|TQwX%t2PPs;LeV<0`M z<11j2fgvAo4Eq~lR%y95K%kGUt7(cYSVOqHcv@{1fR4U`TmQBuTP*l*%UWZx_I5J^ zG?f7eV;6fSbt9sg}<;vczd7L|S%=37*R8KwMuoC@H zPX9QbT9Cv~pu|&1>V^FbNxlIk{?7!G+@7oV&*KwQMAcL8Z1v8WjF%H@ZmGB8V&KRZBb>-)@BPyICB0p`gQMAE;kY*x*0OAuhkhQfIAqKuhMH|p&^o7;dM zoh{d!)iWEJHUP5S01|&4t1nTrm3mT}Pbon1=?qY6n_1n;spnr_0K;qkWoiFds!RF# z?;!TyH-L#TpFJ{F1(KYtIgsSmcMC+n7=MQ(wDG^EF~$Wj$M~4+bGjV5t!$;;`)xK(YSww41Bz3!CxsS)F@hEhaC|kmPJ0 z1Cs*=>4w|YfX3Xc0IGuhvV*BoTrzCoJ#2#poxK4lUiM}IP%&6r0z@HOyg&ut&K9u5 z)74JB>}*wEjF&$)7NCQ--?xu|jkn!oZjIGP!)`g=0=jBvTO0MFe_QS5(?`%A)OUz( z`W+%eL;%$KZqoqZ%?$y^2OrYt;+?63t}Cq`OO(5D-byKM&bDJ}-=0pi6WkqATz&N1 z*dw9i7g6fund_0g>%BVMO{MIB=$`wI)DNh;mp=7ZA-F1zDIVQwkyx)*0d-0WAJ0+W z8OJjeF^vo6-^sodDwTolXSL7p;3x} z@V`L0J!mp~Jm6R1u7@Jlv^9;A&C@#}m3O1z4*$N(PGjz$a7Qr>L@%wCB; zEGpMilDsIx28!=xerLVM<5xGfM=ia# zn3%%lb`N?gV_x5{_I zqx^O+I;!9M+q(_ELS1r1z&uwjab(b(2PzJGZtmRy#p@HmKw>7M_^G=Y>#z3>*?f7b z{?<7fukqbLe!-apvMceb6l@SlZ!Rly^gZ2CCCT_rUo8%$sj5chGYJ+2aUD9bb6Hj* z5^vpo;suc#YLusRhFA+PB*}oJP$LP0DB%7^ui6L6Rb8)zwsF)I-7O;rlCg!B{13O( z*^DFME$HCXdqeHK)PMyOd_hc6;CiDF3@opA<1%FuB@b}OX8ndk`2%KLdBvU^9w|z# zk+YMeyqlm5$uAOD-h6Lmc*nw9C+9&OR2S<8BM)fUi%QZn7{rbAvep_&rhXqmOGWO1-ec>a`)2xAUR0x#Ip~S z#IelpOdsssheDW~B{{f!evm;SN0PsjkQw>l%);at#86Q53T}!hq+m=OQgAQD!f0YM z%ZtGIrSKm9Sp?uBX7U&py{J6v@k=&56%M-e z)#0rMbmV47`KhG}0slpdfHmBElKEPts8%xBp^yxn5x?+IEzjK~g@lLS>pK-uXFygU zXX{2-x>AzI$LVD#4Pxg#bJMi{6i&v#p;R4s^g3tx(Yu@8?5C;qxO;XctNGlTY$b0V zYUCAUZjJv|O>2+8TI0@(qut53$Gy1SrKSV5)AQ5Q@a zbFBK-RYCFl^K!SX?!DAEQ*IT)D~cZMs9lcRogQV9*bGZ*ga*g5EW!}osJGxzPdEm3 z64&>gL#69!QuPI+RcA5Mu%jS8B-#{AosmSOS7(XM)F(DG;E>~XAH+WYi=Xfy>~iVT zjrLo4f^ab!m|~GwAX7|zCs)`BoV}3r>wi}qSKw`uCj5w-DZ6%( z<=r71A$aMnClHA*i<$*uDXnGKKkHL5iWF&H-mZewRWqNsFlJ4}e8!4s#B?-U4Kirp||M=+o&+N~q>a{`V-1rsTv!t7%PIKfiO zBx?2TZp75TyWug(g8US*DgWjMVZGIPvm<#$Bf%dFmo0sH75rG0U>~}#yjQ2bD5RRJfJ!ed_rorQMFDYTJ&_M|zJ1cYAK7yiRSJy!KcO8NlXoa2 z-M{*WFU~1)Jt&lV**OIdHhOY@Ltwsq`2&Oc^8tbS{Vz;jzdN`xG90dy4z`?s{`Lid z!=YXYYMz%!e`Wub$24dmuOZb701%{*>RP=R zL{|JJoh!Xy(Fu!4b_4<9(9QZ5xK0d>nArmWg(*NgEg%0XCaz@c{a9fi?uQEh@ntcd z+^o!xH0-H!!^=sNPjrg6Ug-?;#@YZ8oG$-Q%F?dzS0##OyEK z1BZRMA2|F+66Zl45Gse&Df;mvep58%kEFiT?S89n-ILw3h`*eDa-diS{;xl=U|#eu zO--OIeY=sD9%#~wGowu2@a6aJX0N`zY!~x&Lvy=xamONu_dFYdupBD8SBs>&zLMp+ zdvv5HBtXVAq1rT6_K2 z5<}N)ZR^>f&6g3`sW614h+pI6J;n@=A_hsxJe7#YJnfK+?8lewcD;~Zo4w$!0Cw)? z1yuxiVNlQ3&SI6{yGvJndvyIW%X#I*r)!t`j_j6YB3_8tY^1#qw>l5dB-)UlMWvXa zn0RAO%BQ3f2Pi;_Ql;%x8G(d->l~1&=glmXi?#hpbRsoE$5+raOFqsHoA4>KEr?^7 zzUDQ;mlpY{8Nw#mvdcKurZdTPcPkT5H263aLzx%spBi*lBQ$g*$bwK>T?t2tk4GNH@-{JbIA!4(+c4VW^q&tuAxu_YkA`1-=wTh(QgVKv}Fq()S z&6J1Vn=nuwPQ#4n#0(XcKP!fD(MHMB=c)#iKGDF#X(ck-fW~Dzk~j}aXf${hm2WIB zHQ;(NUL~Hzd`FHu7}-=~8AKULaM=dMYroLi@BHG0P?+EJp~~N#L6Z_dEBCdDqjG5Z9JVSeHA784_*3cJENR4V ztQcjaq%NXqJ|{Rh$*VcmGzkOmtk1V@c(ew1NmDPu8Q+|UjnuayJ_UZ=)nAOv>WVie zd2@JUij%KTpU?!Kz{nPu|9kk;WZn7D)GOh%bTDOTbat?frecuJgFVSyU0qwwzj>PQ z#$D8Yb3P>#n>(4!Kbd}+Op}~`dM5GIgpJXaj~j-`JMo=TI#I);vpmrIJbI>uS2=tF zbDZQ()jX!zEA`dkwuu=j+m#C!IG^0VJd026V=Cr=NP$xHjTciJMIIHVsj>>9};IG=@lj-Xy z;%2E^SJsRY*CE7BlJX}RpD;z}W#ux@JN)=Ym)WV!LWA_RUTU`Y_}9;xB=k%_i@Kuy z44MC~HBBbZGef$6C)3C~296(OOb1A^Kto1!v-^p&UfEk*dy0$j%`gSmw=~)eHJ*%& z*YMdwR_=L}M^v^4Qe9($0(l4#TpMv@6EG4<@UuuHu0s^DS(4-!d>Bw1P8z6L z1?YI08#$HpLceXQwt%Zm>Mnf95jfO2HYM*_86Z7SW4UsCmAUTWxh5BkvL_7 zqGd7FmBmy;7SmIa`^h^lUw&;5*T_kR!wJVmAw^=V2ino!{Ugq1Kw zfP=;OS;Me8buIG4UrsB4A41vuaPuTWDanYp6JR@uYb$EE>%T-=2aP+c?)0BHWyK%x!<*f6y%V80R?cX}d3M&Q=M9H$ zMQ`a0)pSG3xuP-JuPHPau9|E^w98XcjH+8o)I@o>)XRvD5WV5!n>=P2YqI8<5}eW2 z9T9B;ec5H-jxM}RzoXJ=_$xBqaRuDgUyNNZAB4cC04>BV>^<4x_B4)7~DbYVk5aZ=an@LOgZxi)wlLJ`z z){?V7=h$WRj!WuyA3{}&cB(tR8zS-S5mCp=(!a!cnt`QJ5B?OUneJa zyQPN~zwvTQ%B)Fha710x8PTMr#QN%PC$-6$a6@f$Hr#L24=-KCRvkrx*^Aa z;?HC*d~O&zv^X4s59Brk$=zo5$af*?WIfvv8L7SWK+BM|w}yHO(WL7wMV)3Gd#7Ze zX>S;1RO`zexVyUoq}sI3M|8P{ubo__RcbZpxm8CF>eQ;|S$dhMpL6Nu13CZF%L#HW z2FywMAOg<|IH1tTMCsr{k6+x4laLhe})@ff@m>*o=u$PZt-YsP^OSz zaRL#Y&CP?o@B>sGTvYZTp9#XRZ@mo&H7GE~0IoT2Odct$C_9)B3#q!nRfhOPO)IgCauDnDlx&kOK z`*w?m^4q;|sD6J;ir61#$0DlNwL8hsW{^YqL;LXTRQ?wwOSmdkc9iekt8-lHq(k)j zZlX9eIL2fwoVa7C5-_JXS32{F;%0d z)n+l?>QU_Gb8Q0M26-~oAhYFkwy`F9O|qP7!8ery84ZHTYBRM>aOif7JzK2jmLA1+ zGn-md6CB#L5j1)Y`)xDZjvqDKgp?c*y?*520eGPqin*aek!j*<1rtxfkDop?@Z8x&oM;fF2@U$Md&oG} zE+>)QgBnDQuKhCLvL3ZOmLnNRl;&p*{A(chqu4bzdE%QDahWGnW0{ zExooW4}}J$w=P_0(Cb2r0xQ=q6gatl!6W7Rg#a(tc`)7BPo%qBQe2VotBK8`3c;2> z+1>0Y!ah(aoZrB?j9d&{Cu^6UWA8{}zULL{5HuHAp?KE4;$m0eA<#m4Wk*cG#VpS= zLQvR*GQsoaW~iLYSVA~xmJ~UgU+Dg77_c3Nm|YCjcNW(N;}bHd^mQn2h`nD5fvVRtVBH?*;Y<~4DW7`*Lo@px-TCj!hv2LRtN~I?&(5Nm0Z?< z;+vQ6pVWq2lELvP#fibt1#X0^22>~aTtpnhH&`iS^%#Vqgv9CR{GM?K+ZZ@%bqFYW ze&lWA4g!tb>{WYmU7i1dfH|VbqOMR-5%bOjpmI0%_*G0HAcBeh zvamakwsU@mi~T{4By%!u9d+&xbY?Qz2mHZAA#rLe$1v^VD7n?x4HBCu@_T;WprEN3 z0F)=Ne3I^K0m=Q1fMoQ@BdrJVaklCW0$YP?lsJm3LiFzHUL%yHX*Js&$0woe zHAE+(C(MXEy$>pWxs{y&GEtrqReEL<=J^=_;KN9M(jkS&UGn!rC;&qhg7DOPnC(;^klfBaQSvgVvz!Op8+%607y+^2Ny=hy2y|-|iFXQshuUxwIo4VIz*DSO3+aKdgN$$p}B9^Ic<>9eR zdsF4%?_u~~dXzL(D)NzrtpD_h0_q&YWM5uy(Pd(j`&GQlFvFH4X}uq)%M}$N4-`mq z6J%)?y!H8m0#LC(d5lRT{aA=Cz~B%Vpo`oOR!wpUK0*>}vvCI_1`3rC{vMS$X~MVV zGHt$rP@;o8BDBh(+Q|h=mj*owQvD(@O(uU&vR4C4?}6}RNAt*~#`swAOw#F(&E=)N zz+G2iN7Zi*TbaT_=JrRGY@a2r&qb8eT0M2DCe|A_BTh9ms9yODtX?&h_Ucs=X^+x2 zk!JgtS^wH>y6azyOMm@qk?F2~Eh_Exuf=6z{j2HBtba9|uJCK|@IQ?Sh`5MqE~3wt zu=O-_Q_X2)uGML=XAR~g2fYH7G*p*_8FR5L+9H%iyH2{APt9XSRk&g^HCN222@e|f z0yN?GGp7`yB?jbZyZGqqgXSL0j~}q%Hbj&K7+zXp6SFDBt-q z*7^ok_6MVu?SmQ1_Q9}a+wf5@Nr@Ba7mNlUd2&b!{UYW3d_2*n(OkJ6v~2bV6E^#U zF`NCtu+9Ep)@FY&ZL>dU*z6A`ZT1J_Hv5B7oBhF@&HiA@W`8hcvp?wD><>n5_6LJD z`-4fF{lT2g{$S8%Z*v*Y6U^=aJQ&>pcrdgB@L+fc;KAq)z=M$;fCpnc01sw%03J;2 z06ZAk0eCRA1MpyI2jIcz4#0!S9e@XeI{?eFD4OTcUJ~+IL9S<7*CBcz3x9ze1s}wB z_!V;Jm7FmwLE4rb2z1a^pb_|%&I?7;B8uEB_|-I|lezH`Rgkwoctv=`?TZBm=6FDJ z(E4=-z=G>d*{$k$!f?UG{H6#5mnTUmxh7J7y}u^X zd~rRm0A@g$zhGKY&%51gl56zd&Fhd>P^foulUo;{)}?h}GA?Gq{e*aDg9*$Ywq?q^B*ehP5lLl6r27g7}bm?cHJKVzT)4FeCA zY3c^qdw?r2Q#Ya_$B(r%V-wdybub&0#6=;QY|SG1Q@K89?!FTA;K&II_KPixVZv52 z3aITrwA9}21SkJ+Co{#5|F&1l@-}v_E^{G}A-P5)cO9dEue?(r(fyul6bK@E)Ig^R zMWH({%l0EGzto*e!~imL-yJyGilHT~5N$VUz|6{P-G02(l~UqmvwAW2QtllMeN zlB5QZ^ZBnn;hA~B)NH>KP<@kO*h6a0 z&>;`RiA6I*G?c&a?}di$uQNDb+W8p$-k#to*_g;wACrr1M@bimPxtL#{ycu1j(<46 zb@X)`cL(?a1^f;L`~e002?abr0sjjDELKZcvkJh!zzBFAU!Vvu;CCqC4=CVIDBuAK z0C)CZP{98I0Q0RgojuRCwmN3=GTu0g@pk}XHMMMO3jl1ElOOhWqmBRy8=$BG3L2o8 z0SXzQhye(%yzZ_R0p^|LRUxV+6Y}4f$Ji0RRpey zz!ed=9s*ZG;93Y=370GD`x>y|Y{t{scfJ&=L$)ugoo%fF0GLP;$(`|Hy->&eU<)&- z-fmu=s&*MBQbYhl2#@0YL9L%eZcx6$r6h-wTsUCZ(ucBlhM|0qS$#cG@?@~m18(q( z0CA|?s$14H&*blvB~b1$x7@(GScM?;!1HK15Sbr8*CwndeRRg~_AUSLlK2gQ1CN0? zbV4^i_P7<60r@b1=f|%#p?U)g%QG;5-y{HoJ`Py~1L0%~;9xpTj>l@ucI>@~ZylR2 zbx7HMW!zI@o5%1x}EWkhs`x&PbHJ5uGu{l%Ff%gkqSJHxk0ov*ptY zvi{7I#m4326okGOI3qC@Z!yi4Y4>jgF^4M_ zjQG5Q${qg=joqXC zVYDI(8wOtOmQcABmaDDofLDen!cfcBZ4oGI;!0#125*~2MPf^d?3~po(rTY83Y|(_ z6DgPvicD;-mOmI_V?#IM_w|$E@h@fkHr^~}OVAzP zHdl*`d@Cgu1;d+6r8|pd66pqG_1O=+T&V_ax(*)hV%-D}zurb-Jr0^D>0I#iofr&I zwM+v@$23*}2viybP*`IJfIw{%00Lxca5YsQ&zQ+_!7qCP-1WiH^R$hn3pY)N$3-Vc zZ6`mu9ure%9L14jXyByhWtcDpvymMtbD?bzmv-1KVqRfl)M%;@ZFrp{MfT4#z9 zN+a{}nvxk7TQ@uE562r?b8~#Twcbd~S7kH3bjN3=r|xM@4EuXlzD3G^ny_{CSZPL| zlf(9$l22i;&OK&RUH1PJq#$NSMVrb<&s`J7Klwk6a+c@N zol|o$yU$!>Hl$S#Icyc>QC~x|>{|O<63)-)C-KldH%*zOx{S46u6^mJk8$KDnPLpGs^unvyl$EVpP5* z0ww15%{uU2Lt>uyGn&?f)nuQkG41q<%g`vjrZhQ9ub7RD(rZTHiD8`uNfzX1v)s&x zG)2s>5BlbpC>gE6bxN9riN2JQv-N@hlWvnK35ovp;J4E6mbsR{Cp6L^9kdzYq4Q>k zB_Wk7Tto)FFB&8})vR&y4XK?QfR4bc!*@__cNcFvFTtLY_dJoa@HOCS;|EfN%nc}M zt{lTJ_)z^r395CrKu<;PC-30Hq}ELhCD^aX?LNL>AMTGV_>c4dF2<9}V_VWa_ZqAO zbmj5wehLi2dv?aUvD~W>qQq@j=`%$-kQ4}ff~ocu1u0(`VoMM+xkK4hOp9EHricql zd`DaafYJ0n4e!Q0Ro>JT`-~?arLr)s9iRd4gB^(Lj#R@0)DZ*7Y2vf0V|yaAUZ;-S zAlxS(ofEqHb~mT%-yhxmIqYiZE8rbM_?0~b5(7X18@hWEQVcqjU1}P@6)_Uoy1@-= zqzcHd#FX{LXRg;~ZIZWu276S$)hy+uMC}?;6E&hnYE-05s1Y1duWXZ}KA3(KyCGK+ zPB@BE&B9?9FQC!9cwwrXPr@K4k>p8JAC`~*LlVl~B=$k&ws9ZI52)u#jt%>8as{Ig zg%gD}5Z5joO8FLf>=6n^^HYT?X9O55MHwh{5uj4gAYs^+rCKeES!5P3m=&f$iRo3B z7@4!)c)D2_bjzaC1B>YstQ8pmJApYA(c2t`8YT>g8YmZBDTzb(h|aleE5<-IDY7KO zGt@I&t0q*xCKOkbi@L7fiPfKu<0WzK1~CP%!wmy=A#Vs+2kH^@1PV|>sb1OH z1i}G@^HeMpt^-wn;uN9kPmDHH{VBU@qylvI=Nv5eTX2LVZ=s`}=ekM+7e7L9JRg}9 z4b3#+ujH(Oe&f+@ka&E~h-I|;GnHIePyzCW#(_~PZS^NgX{fQn!o^{+J?jS?B$&xL%9g`$MKfF_|lB-bDsDdjm7FKrvNMq_Iju{8r~I&q|qiCIx# zXS2W}XEVd1EQl*8)`++!;k~b03A8bC&mw)2462|q$WWKNS#D`Nb2-VgJTRqP*7q(v-sqg z5dxt10}5zI(m5yYlVt}0XLj%asXtOs;xC}o(QoR>5AL2qQuCX1feRRhhcJ=4V(3cF z1Pvf{25QLzEh6>QM>i_()+r|U00lpt(*!VLnbxf~W&_%6KPWQO1Hah`LR6(uO&&w! zZ9soQL}KUxI+U6CkkJwX2Y~#dZFk}_G>3Zf6qFnwGT4*@bZFI`!()*LgLV({5Y!zI z9&HwoI#4S}n!E!@Gl&4nTt9GQfCOcxg3EMgNTYz1A($=%n`}&a!deHUX~8t7+%42P zKhGGSI&TrGPO}eyVIm&ezXjx7Et26S{m601PvwZ}Eu1HgmxE)G6w=G{{RA$}5!vcx zdeANP#f>uh`~pehmBOW6NfB9wU)lN}E?t>& zK*A0v7jsx_xtV}PbMH}DEG6LqiVYZ=w_o=TN&WSHo22=&V1L`z40rpa*8~#es1EZ( zooY+0^N3K5>sSy<9XAXerlFCT)(@=iw+tbC4VOMuE^}p~$ikRiNJSZ?1-~6w8x=Y{c!+J>+C9%`Y%UeCL4|_M2 zAYj?tfmWbn&fqApEy%5YEUtX}1ZlR{IC+oxnHIRW#9ZY6ymU6S$k%fRlKItSQ2_!% z%tw*z>?P_tc;P=T#?!CPc(+~IKbBo_MlZ-~$Yiy#0LiDT>29$G0iITyzd?ZI7M#a& zi^yeZSyKSyX=7QyYfZKQ#Advlt`-o0wODS^n&o}T8j zB_yxi64U$NX7f2@nysDjeD=JwrjET^TN?musXmg+)IS!hovjX;tdiUHD^>vN(T)a?d-K6m5@%4TogFhr z!0EzN&H|JGG)yH)5)klF#K7p4gmJ3Kj^VLeNVx4o_6%3ARaEf&3qwpok>#E|*&FZxn zU}Sen8=jY5niVr+I1ZXcc*A^A1Cv8swu5odn`)Ort-}@|ddb8d;)^RE!cOJBaea7;uq zU`4Z-xpjpBt11>8sR{y!<%WGZdQ_$>V(og*wdV3)v}(=i#_cnXeKN$(6=p* z`1ox>b5bbWhN6_f$v7al6}z*Ut%`^Hyyq&8FcpSqkKz3aNjaY+tV%eyAk85I5XBQ~ zMw2SdT;*{k4b6M|@evfEqRnZ&>6u5TbobJg5ExgAYta~tJCV$G(53)!K~r zkLn$i-)D&w_C0?yW<=YyxNH3$Hlx4WQImKyFlv%N&vtu%>UqxUVfo8{adw_NJO$Yk z>CsE~VK?2mj(5>mPgjn=-8l>QCqUXvUW162*(K(-&ksv? z_QUzL-~4a@i6D-5QFgrC=`fgoRjB%elLmpm<^%Db5Aci5B*@iklnUtWa8|Dr4QK$D2iAy$!M&>yKoVSJl;IzXQ~(j8H>p)^Y)Z_ z=Vp%4>icH>Nh)-poOZSft?<7zmUq*y$MG$sMBR^EtmGcs6Dv*ZYs ziUN{qoVY;c$Y)%JO`9`{U@Ug8#qT41t$kT;mEL025*t*hysrIt^aWdFAJqG(0tZr$-fDcX+Uu1f}Jge8;fvWbEPc1}*qmnU%j+Jd$ ztaX&m1Hm$WMn8gh6t$64uepk01ep=P@lW**2UDS)b$@6#UWaHmUXN&;F25J2`4~Op zp3WHcKwoZz+Mq9IU6%V|)`dn~Rz<6FoaW(0xJ9(>-Ugg}Cw_R2lc-Q$_hBp-(kvrk zw|Z_nn7_zPW=Y(P495wd7_at%iY^L+ienUtVPUaEoYB8SIj6R*=df-;!uP*RSLdpC zEOkH5%D*MTm6t+}pgVHJ=x$iH(c{&Rr~pR~r&w!h?@6*6X$)zPTedq{aaW#S#|MeV z40w>S4^r?dK1g`oaUvtup~92<``@J9b}Fsp^2!g}Wp68?de?}bUuJ`BjO8u|2)#IV^OUfl9QdkEr zt*1ZPC^@7Rn>_GANN-{lU5^h5j#l9giZ``_U7b6qTwgm=s4ls+6R(e8|1Hw}YdXi4 zwx3kH(%lyH^J}~eC*>x-UyxjRg@=_eEB_YVkk_l1s%Bhmo{Qhx!QcqW>mVg84?;3d zs(I(2Akj)X{s7cJOk#fRFa-CS`ZuxUwp4Cf`@7!S{Py>}^eYQTt;u_Wmj(0@a#CNn zxBfl0^1!P2$gh~`PhePSJL&@(R=P{2Z)_{stJ+~??QUjrWZm806c>MImU|hoM(^uJ zark%Sw#2lCRm$eUm_w|b(qxqWvk;n08UNHBVf>j@jr(29et!B!QLGSsjjYM4P&_+U z$;iU?D@RgtOBLtpz$)T2VDdFmkZLhM5Fb32|vEo}tO;$1L8Zms0+_+&JX^(^y+{=}0>vAhjbP;(*BRC}1vybv33R=9?GXlIN zBD!l2AgW_dHC>GsjGDNC@r9#{OD2cv`2X#T0IjY4yC53??cb(z|2zKMsw|1KxA7w~)VMeW_VfFK zQW;_pro70SxML3vaJB(V7x%j{I&dFTNzlfR_(HqT*Ty)Ayw6 z8_))9)rZHfjk7XWxdv*U-NsMz`+B|K4(7)`_Z^tChQjLAV6`H;!La4i2Hj{L-Yr1*y~x9X<6+35T?4OZj#g?g6|!WF1$H-R3@DJpgU ztYQo%@8>0l>XeXol3)Z9T;7*6A!WjFDCSc?&k-g)K5^+NeC_DFh&tMm6pkx%Uf~l| z&fStC4TKXXd?>aBEon#-yn=8t_=U&!B+aQX!%O&{w*>VnA|j4D`l9VoZcMv{tMs7S z;?+F6?e{dl�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 e6EF2@p4V5yYt4?>OU#ZFl`." + displayDimensions: + $ref: DisplayDimensions + title: "Default display dimensions for 2d and 3d projections." + position: + $ref: Position + title: "Global position within each `global dimension<.dimensions>`." + crossSectionOrientation: + $ref: Orientation + title: "Default orientation within the `.displayDimensions`." + crossSectionScale: + $ref: DisplayScale + title: "Default display scale (zoom level) for cross-section views." + crossSectionDepth: + $ref: DepthRange + title: "Default depth-of-field for cross-section views." + projectionOrientation: + $ref: Orientation + title: "Default orientation within the `.displayDimensions`." + projectionScale: + $ref: DisplayScale + title: "Default display scale (zoom level) for projection views." + projectionDepth: + $ref: DepthRange + title: "Default depth-of-field for projection views." + layers: + type: array + items: + $ref: Layer + showAxisLines: + type: boolean + title: "Indicates whether to show the red/green/blue axis lines." + default: true + wireFrame: + type: boolean + title: "Indicates whether to enable wireframe rendering mode (for debugging)." + default: false + showScaleBar: + type: boolean + title: "Indicates whether to show scale bars." + default: true + showDefaultAnnotations: + type: boolean + title: "Indicates whether to show bounding boxes of data sources." + default: true + showSlices: + type: boolean + title: "Indicates whether to show cross sections in the 3-d view of `~DataPanelLayoutType.4panel` layouts." + default: true + gpuMemoryLimit: + type: integer + title: "GPU memory limit, in bytes." + systemMemoryLimit: + type: integer + title: "System memory limit, in bytes." + concurrentDownloads: + type: integer + title: "Maximum number of concurrent downloads." + prefetch: + type: boolean + title: "Indicates whether to use adaptive prefetching." + default: true + title: + type: string + title: "Additional text to include in the page title." + layout: + oneOf: + - $ref: DataPanelLayoutType + - $ref: DataPanelLayout + - $ref: HierarchicalLayout + title: "Data panel and layer group layout." +definitions: + CoordinateSpace: + $id: CoordinateSpace + title: "Specifies a coordinate space." + type: object + properties: + "": + type: array + items: + - type: number + - type: string + title: Specifies a dimension name and the corresponding scale/unit. + + DisplayDimensions: + $id: DisplayDimensions + type: array + items: + type: string + minItems: 0 + maxItems: 3 + uniqueItems: true + title: "Specifies the display dimensions for 2d and 3d projections." + description: | + Orientation: + $id: Orientation + title: "Specifies a 3-d orientation as a unit quaternion." + description: | + For the 3-d projection view and for the `DataPanelLayoutType.xy` cross-section + view, with the default orientation of ``[0, 0, 0, 1]`` the first display + dimension (red axis) points right, the second display dimension (green + axis) points down, and the third display dimension (blue axis) points away + from the camera. + type: array + items: + - type: number + - type: number + - type: number + - type: number + default: [0, 0, 0, 1] + DisplayScale: + $id: DisplayScale + title: "Specifies the scale (zoom level) of a cross-section or 3d projection view." + description: | + For cross-section views, the scale is specified in canonical voxels per + screen pixel, and defaults to ``1``. For 3d projection views, the scale is specified in + canonical voxels per viewport height. + type: number + exclusiveMinimum: 0 + RelativeDisplayScales: + $id: RelativeDisplayScales + title: "Specifies additional relative display scale factors for each `global dimension`." + description: | + The length must be equal to the number of `global + dimensions`. Defaults to a vector of all ones. + type: array + items: + type: number + Position: + $id: Position + title: "Specifies the position within a `CoordinateSpace`." + description: | + The length must be equal to the number of dimensions in the coordinate + space. + type: array + items: + type: number + DepthRange: + $id: DepthRange + title: "Specifies the depth-of-field for cross section or 3d projection views." + type: number + exclusiveMinimum: 0 + HierarchicalLayout: + $id: HierarchicalLayout + title: "Specifies a hierarchical grid of layer groups and data views." + type: object + properties: + type: + type: string + title: Indicates the layout type. + flex: + type: number + title: Indicates the relative size of this layout within its parent stack. + required: + - "type" + DataPanelLayoutType: + $id: DataPanelLayoutType + title: "Specifies a layout of 3-d projection and 2-d cross-section views for a layer group." + oneOf: + - const: "4panel" + title: "2x2 grid layout with `.xy`, `.xz`, `.3d`, and `.yz` panels." + description: | + The top left is an `.xy` cross-section view, the top right is an `.xz` + cross-section view, the bottom left is a `.3d` projection view, and the + bottom right is a `.yz` cross-section view. + - const: "xy" + title: "Single cross-section view in the default orientation." + description: | + with the first display dimension (red) + pointing right, the second display dimension (green) pointing down, and + the third display dimension (blue) pointing away from the camera. + - const: "xz" + title: | + Single cross-section view with the first display dimension (red) + pointing right, the third display dimension (blue) pointing down, and + the second display dimension (green) pointing towards the camera. + - const: "yz" + title: | + Single cross-section view with the second display dimension (green) + pointing down, the third display dimension (blue) pointing left, and + the first display dimension (red) pointing away from the camera. + - const: "3d" + title: "Single 3-d projection view." + - const: "xy-3d" + - const: "xz-3d" + - const: "yz-3d" + DataPanelLayout: + $id: DataPanelLayout + title: "Describes the :ref:`data views` to display." + type: object + properties: + type: + $ref: DataPanelLayoutType + title: Indicates the layout type. + orthographicProjection: + type: boolean + title: | + Indicates whether the :ref:`projection views`, if + present, uses orthographic rather than perspective projection. + default: false + required: + - "type" + LayerGroupViewer: + $id: LayerGroupViewer + title: "Specifies a :json:schema:`DataPanelLayout` for a subset of the layers." + allOf: + - $ref: HierarchicalLayout + - type: object + properties: + type: + const: "viewer" + layers: + type: array + items: + type: string + title: "Names of layers included in this sub-viewer." + description: | + Each name must match the name of a layer specified in the + top-level `ViewerState.layers`. + layout: + oneOf: + - $ref: DataPanelLayoutType + - $ref: DataPanelLayout + title: Layout of the data panels for this viewer. + default: "xy" + + StackLayout: + $id: StackLayout + title: "Specifies a row or column of sub-layouts." + allOf: + - $ref: HierarchicalLayout + - type: object + properties: + type: + oneOf: + - const: "row" + - const: "column" + title: Indicates the stack direction. + children: + type: array + items: + $ref: HierarchicalLayout diff --git a/docs/pyproject.toml b/docs/pyproject.toml new file mode 100644 index 000000000..c9184b31a --- /dev/null +++ b/docs/pyproject.toml @@ -0,0 +1,2 @@ +[tool.ruff] +exclude = ["*"] diff --git a/docs/python/api/.gitignore b/docs/python/api/.gitignore new file mode 100644 index 000000000..e15a7a67e --- /dev/null +++ b/docs/python/api/.gitignore @@ -0,0 +1,2 @@ +-index.rst +*.rst diff --git a/docs/python/api/index.rst b/docs/python/api/index.rst new file mode 100644 index 000000000..074fbbec8 --- /dev/null +++ b/docs/python/api/index.rst @@ -0,0 +1,78 @@ +API Reference +============= + +Core +---- + +.. python-apigen-group:: core + +Viewer state +------------ + +.. python-apigen-group:: viewer-state + +Segment sets +^^^^^^^^^^^^ + +.. python-apigen-group:: viewer-state-segments + +URL representation +^^^^^^^^^^^^^^^^^^ + +.. python-apigen-group:: viewer-state-url + +Coordinate space +^^^^^^^^^^^^^^^^ + +.. python-apigen-group:: coordinate-space + +Layers +^^^^^^ + +.. python-apigen-group:: viewer-state-layers + +Tools +^^^^^ + +.. python-apigen-group:: viewer-state-tools + +Viewer Config state +------------------- + +.. python-apigen-group:: viewer-config-state + + +Exposing local data as data source +---------------------------------- + +.. python-apigen-group:: serve-data + +Credentials +----------- + +.. python-apigen-group:: credentials + +Capturing Screenshots +--------------------- + +.. python-apigen-group:: screenshots + +Server +------ + +.. python-apigen-group:: server + + +Utilities +--------- + +JSON Containers +^^^^^^^^^^^^^^^ + +.. python-apigen-group:: json-containers + + +Trackable state +^^^^^^^^^^^^^^^ + +.. python-apigen-group:: trackable-state diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..1cb6b52fc --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,7 @@ +sphinx-immaterial[black,json]>=0.12.0 +sphinx>=7.4.0 +pyyaml +jsonschema +numpy +tensorstore +-r ../python/requirements.txt diff --git a/docs/update_intersphinx_inventories.py b/docs/update_intersphinx_inventories.py new file mode 100644 index 000000000..8ab6fd7a6 --- /dev/null +++ b/docs/update_intersphinx_inventories.py @@ -0,0 +1,42 @@ +# Copyright 2020 The TensorStore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Downloads the intersphinx inventories referenced by `conf.py`. + +This allows the documentation build to be hermetic. +""" + +import os +import requests + +if __name__ == "__main__": + docs_dir = os.path.dirname(os.path.realpath(__file__)) + conf_path = os.path.join(docs_dir, "conf.py") + conf_module = { + "__file__": conf_path, + } + with open(conf_path, "r") as f: + exec(f.read(), conf_module) + intersphinx_mapping = conf_module["intersphinx_mapping"] + for _, (url, (local_path, _)) in intersphinx_mapping.items(): + if not url.endswith("/"): + url += "/" + full_url = url + "objects.inv" + full_path = os.path.join(docs_dir, local_path) + print("Fetching: %r" % (full_url,)) + resp = requests.get(full_url) + resp.raise_for_status() + os.makedirs(os.path.dirname(full_path), exist_ok=True) + with open(full_path, "wb") as f: + f.write(resp.content) + print("Fetched %s -> %s" % (full_url, full_path)) diff --git a/docs/user-guide/navigation.rst b/docs/user-guide/navigation.rst new file mode 100644 index 000000000..7ef701e8e --- /dev/null +++ b/docs/user-guide/navigation.rst @@ -0,0 +1,43 @@ +Navigation +========== + +The position, orientation, and zoom level of :ref:`data views` can +be controlled using :ref:`mouse` and +:ref:`keyboard` bindings as well as UI controls. + +.. _mouse-navigation: + +Mouse navigation +---------------- + +Translating cross-section views in-plane +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can translate a :ref:`cross-section view` in-plane by +left-clicking within the view and dragging the mouse while holding down the left +button. As you drag, the `global center position` changes but the :ref:`global mouse +position` remains fixed. + +.. + Videos not yet supported + .. neuroglancer-video:: user-guide/navigation_mouse_cross_section_translate + +Adjusting the zoom level of cross-section views +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can adjust the zoom level of a :ref:`cross-section view` +by holding down :kbd:`Control` and moving the mouse wheel up or down. As you +move the mouse wheel, the `global center position` may change but the +:ref:`global mouse position` remains fixed. + +.. + Videos not yet supported + .. neuroglancer-video:: user-guide/navigation_mouse_cross_section_zoom + + +.. _keyboard-navigation: + +Keyboard navigation +------------------- + +TODO diff --git a/docs/user-guide/navigation_mouse_cross_section_translate.video.py b/docs/user-guide/navigation_mouse_cross_section_translate.video.py new file mode 100644 index 000000000..afd6c3508 --- /dev/null +++ b/docs/user-guide/navigation_mouse_cross_section_translate.video.py @@ -0,0 +1,28 @@ +rec.begin( + { + "dimensions": {"x": [8e-9, "m"], "y": [8e-9, "m"], "z": [8e-9, "m"]}, + "position": [3242.833251953125, 3334.499755859375, 4045.5], + "crossSectionScale": 1, + "projectionOrientation": [ + 0.23160003125667572, + 0.20444951951503754, + -0.017615893855690956, + 0.9509214162826538, + ], + "projectionScale": 512, + "layers": [ + { + "type": "image", + "source": "precomputed://gs://neuroglancer-public-data/flyem_fib-25/image", + "tab": "source", + "name": "image", + } + ], + "selectedLayer": {"layer": "image"}, + "layout": "4panel", + } +) +panel = rec.get_data_panels()[0] +rec.move_to_element_smoothly(panel, 0.1, 0.1) +with rec.mouse_buttons_held(1): + rec.move_to_element_smoothly(panel, 0.8, 0.9, speed=0.1) diff --git a/docs/user-guide/navigation_mouse_cross_section_zoom.video.py b/docs/user-guide/navigation_mouse_cross_section_zoom.video.py new file mode 100644 index 000000000..9d176578b --- /dev/null +++ b/docs/user-guide/navigation_mouse_cross_section_zoom.video.py @@ -0,0 +1,30 @@ +rec.begin( + { + "dimensions": {"x": [8e-9, "m"], "y": [8e-9, "m"], "z": [8e-9, "m"]}, + "position": [3242.833251953125, 3334.499755859375, 4045.5], + "crossSectionScale": 1, + "projectionOrientation": [ + 0.23160003125667572, + 0.20444951951503754, + -0.017615893855690956, + 0.9509214162826538, + ], + "projectionScale": 512, + "layers": [ + { + "type": "image", + "source": "precomputed://gs://neuroglancer-public-data/flyem_fib-25/image", + "tab": "source", + "name": "image", + } + ], + "selectedLayer": {"layer": "image"}, + "layout": "4panel", + } +) +panel = rec.get_data_panels()[0] +rec.move_to_element_smoothly(panel, 0.8, 0.7) +time.sleep(0.5) +with rec.keys_held("leftctrl"): + rec.mouse_wheel_smoothly(-0.3) + rec.mouse_wheel_smoothly(0.3) diff --git a/firebase.json b/firebase.json index ae0bf3ae7..1e4aed1f6 100644 --- a/firebase.json +++ b/firebase.json @@ -2,5 +2,9 @@ "hosting": { "target": "app", "public": "dist/client" + }, + "hosting": { + "target": "docs", + "public": "dist/docs" } } diff --git a/noxfile.py b/noxfile.py index f033de152..147d604f9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,3 +1,5 @@ +import os + import nox nox.options.reuse_existing_virtualenvs = True @@ -20,3 +22,22 @@ def format(session): def mypy(session): session.install("-r", "python/requirements-mypy.txt") session.run("mypy", ".") + + +@nox.session +def docs(session): + session.install("-r", "docs/requirements.txt") + session.run( + "sphinx-build", + "docs", + "dist/docs", + "-E", + "-j", + "auto", + "-T", + "-W", + "--keep-going", + env={ + "PYTHONPATH": os.path.join(os.path.dirname(__file__), "python"), + }, + ) From 2e2811bad256887be6514cc56e526e09a6c0228b Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 23:11:11 -0700 Subject: [PATCH 25/45] chore(firebase): fix firebase.json --- firebase.json | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/firebase.json b/firebase.json index 1e4aed1f6..cd8655e51 100644 --- a/firebase.json +++ b/firebase.json @@ -1,10 +1,12 @@ { - "hosting": { - "target": "app", - "public": "dist/client" - }, - "hosting": { - "target": "docs", - "public": "dist/docs" - } + "hosting": [ + { + "target": "app", + "public": "dist/client" + }, + { + "target": "docs", + "public": "dist/docs" + } + ] } From 5c8744d76f6f90aebee084b4959d132e75521adb Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Tue, 23 Jul 2024 23:35:23 -0700 Subject: [PATCH 26/45] docs(github): fix build status badge in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74dc170d8..67ce4388f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![PyPI](https://img.shields.io/pypi/v/neuroglancer)](https://pypi.org/project/neuroglancer) -![Build](https://github.com/google/neuroglancer/workflows/Build/badge.svg) +![Build](https://github.com/google/neuroglancer/actions/workflows/build.yml/badge.svg) [![DOI](https://zenodo.org/badge/59798355.svg)](https://zenodo.org/badge/latestdoi/59798355) Neuroglancer is a WebGL-based viewer for volumetric data. It is capable of displaying arbitrary (non axis-aligned) cross-sectional views of volumetric data, as well as 3-D meshes and line-segment based models (skeletons). From 4e378b4d7a1f0c71cd717dc5feb974f1ad88d321 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 24 Jul 2024 17:20:16 +0200 Subject: [PATCH 27/45] feat(volume-rendering): picking, depth testing, and blending improvements (#589) * feat: add a mode override to VR layers this allows to run second passes in different modes in the background, without affecting the UI value * feat: run a second rendering pass on VR layers for picking * feat: detect camera move in perspective panel * feat: allow render context to know camera move * feat: only two pass render VR pick when no camera movement * refactor: simplify gl state setting in render loop for VR * feat: only redraw if VR present as only VR uses redraw * temp: second pass in single draw call progress * temp: establish more shader control * fix: show on VR color * fix: correct setting of chunk translation * feat: add context tracking of continous camera motion * feat: link perspective panel to context camera tracking Also only redraw if volume rendering is present after camera motion * fix: rename camera movement in layers * feat: mark rotation in panel as continuous * feat: mark rendered data panel actions as camera move * feat: mark slice rotations as continous camera * refactor: clearer gl state tracking for vr on/max * refactor: interface shader uniforms and reduce duplication * fix: set new source outside of loop, ensure mode override can't get stuck on * refactor: unify naming of camera motion in contexts * fix: make unvarying const * refactor: cleaner integration of new camera tracking * fix: logic for when VR picking is available * fix: correctly draw VR to new VR buffer in max/normal hybrid * fix: OIT blend VR layer and other transparent layers after new buffer made * refactor: normalize naming across files * refactor: clearer buffer interaction during VR rendering * fix: correctly set back to state and buffer during VR if a second pass or histogram is used * refactor: re-use shader uniform setting function in max and non max VR * refactor: fix typo in var name * chore: fix formatting * fix: turn off pre-depth testing in VR to allow in shader test instead * feat: remove unused epth shader * fix: enable required depth test for second pass max projection * fix: allow wireframe mode in VR to work again * feat: allow 8x VR downsampling * refactor: remove unused "needToCleanUpVolumeRendering" variable This always had the same value as "hasVolumeRendering", so "hasVolumeRendering" is used instead --- src/perspective_view/panel.ts | 192 ++++++------ src/perspective_view/render_layer.ts | 12 +- src/volume_rendering/volume_render_layer.ts | 308 +++++++++++++++----- 3 files changed, 348 insertions(+), 164 deletions(-) diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index 269ff2dda..1ab88d5e1 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -196,17 +196,17 @@ v4f_fragColor = vec4(accum.rgb / accum.a, revealage); `); } -// Copy the depth from opaque pass to the depth buffer for OIT. -// This copy is required because the OIT depth buffer might be -// smaller than the main depth buffer. -function defineDepthCopyShader(builder: ShaderBuilder) { +function defineTransparentToTransparentCopyShader(builder: ShaderBuilder) { builder.addOutputBuffer("vec4", "v4f_fragData0", 0); builder.addOutputBuffer("vec4", "v4f_fragData1", 1); + builder.addFragmentCode(glsl_perspectivePanelEmitOIT); builder.setFragmentMain(` - v4f_fragData0 = vec4(0.0, 0.0, 0.0, 1.0); - v4f_fragData1 = vec4(0.0, 0.0, 0.0, 1.0); - vec4 v0 = getValue0(); - gl_FragDepth = 1.0 - v0.r; +vec4 v0 = getValue0(); +vec4 v1 = getValue1(); +vec4 accum = vec4(v0.rgb, v1.r); +float revealage = v0.a; + +emitAccumAndRevealage(accum, 1.0 - revealage, 0u); `); } @@ -276,6 +276,7 @@ export class PerspectivePanel extends RenderedDataPanel { protected visibleLayerTracker: Owned< VisibleRenderLayerTracker >; + private hasVolumeRendering = false; get rpc() { return this.sharedObject.rpc!; @@ -293,20 +294,18 @@ export class PerspectivePanel extends RenderedDataPanel { // to avoid flickering when the camera is moving private frameRateCalculator = new DownsamplingBasedOnFrameRateCalculator( 6 /* numberOfStoredFrameDeltas */, - 4 /* maxDownsamplingFactor */, + 8 /* maxDownsamplingFactor */, 8 /* desiredFrameTimingMs */, 60 /* downsamplingPersistenceDurationInFrames */, ); - private isCameraInContinuousMotion = false; + private isContinuousCameraMotionInProgress = false; get shouldDownsample() { return ( this.viewer.enableAdaptiveDownsampling.value && - this.isCameraInContinuousMotion && + this.isContinuousCameraMotionInProgress && this.hasVolumeRendering ); } - private hasVolumeRendering = false; - private hasTransparent = false; /** * If boolean value is true, sliceView is shown unconditionally, regardless of the value of @@ -374,12 +373,16 @@ export class PerspectivePanel extends RenderedDataPanel { protected transparencyCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineTransparencyCopyShader, 2), ); + protected transparentToTransparentCopyHelper = this.registerDisposer( + OffscreenCopyHelper.get( + this.gl, + defineTransparentToTransparentCopyShader, + 2, + ), + ); protected maxProjectionColorCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineMaxProjectionColorCopyShader, 2), ); - protected offscreenDepthCopyHelper = this.registerDisposer( - OffscreenCopyHelper.get(this.gl, defineDepthCopyShader, 1), - ); protected maxProjectionPickCopyHelper = this.registerDisposer( OffscreenCopyHelper.get(this.gl, defineMaxProjectionPickCopyShader, 2), ); @@ -472,7 +475,7 @@ export class PerspectivePanel extends RenderedDataPanel { this.registerDisposer( this.context.continuousCameraMotionFinished.add(() => { - this.isCameraInContinuousMotion = false; + this.isContinuousCameraMotionInProgress = false; if (this.hasVolumeRendering) { this.scheduleRedraw(); this.frameRateCalculator.resetForNewFrameSet(); @@ -481,7 +484,7 @@ export class PerspectivePanel extends RenderedDataPanel { ); this.registerDisposer( this.context.continuousCameraMotionStarted.add(() => { - this.isCameraInContinuousMotion = true; + this.isContinuousCameraMotionInProgress = true; }), ); @@ -995,7 +998,7 @@ export class PerspectivePanel extends RenderedDataPanel { frameNumber: this.context.frameNumber, sliceViewsPresent: this.sliceViews.size > 0, isContinuousCameraMotionInProgress: - this.context.isContinuousCameraMotionInProgress, + this.isContinuousCameraMotionInProgress, }; mat4.copy( @@ -1005,8 +1008,8 @@ export class PerspectivePanel extends RenderedDataPanel { const { visibleLayers } = this.visibleLayerTracker; - this.hasTransparent = false; - let hasMaxProjection = false; + let hasTransparent = false; + let hasVolumeRenderingPick = false; let hasAnnotation = false; let hasVolumeRendering = false; @@ -1019,11 +1022,14 @@ export class PerspectivePanel extends RenderedDataPanel { hasAnnotation = true; } } else { - this.hasTransparent = true; + hasTransparent = true; if (renderLayer.isVolumeRendering) { hasVolumeRendering = true; - hasMaxProjection = - hasMaxProjection || + // Volume rendering layers are not pickable when the camera is moving. + // Unless the layer is a projection layer. + hasVolumeRenderingPick = + hasVolumeRenderingPick || + !this.isContinuousCameraMotionInProgress || isProjectionLayer(renderLayer as VolumeRenderingRenderLayer); } } @@ -1070,7 +1076,7 @@ export class PerspectivePanel extends RenderedDataPanel { /*dppass=*/ WebGL2RenderingContext.KEEP, ); - if (this.hasTransparent) { + if (hasTransparent) { //Draw transparent objects. let volumeRenderingBufferWidth = width; @@ -1095,10 +1101,13 @@ export class PerspectivePanel extends RenderedDataPanel { } } - // Create max projection buffer if needed. + // Create volume rendering related buffers. let bindMaxProjectionBuffer: () => void = () => {}; let bindMaxProjectionPickingBuffer: () => void = () => {}; - if (hasMaxProjection) { + let bindVolumeRenderingBuffer: () => void = () => {}; + if (this.hasVolumeRendering) { + // Max projection setup + renderContext.maxProjectionEmit = maxProjectionEmit; const { maxProjectionConfiguration } = this; bindMaxProjectionBuffer = () => { maxProjectionConfiguration.bind( @@ -1116,6 +1125,7 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.DEPTH_BUFFER_BIT, ); + // Max projection picking setup const { maxProjectionPickConfiguration } = this; bindMaxProjectionPickingBuffer = () => { maxProjectionPickConfiguration.bind( @@ -1128,10 +1138,8 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.COLOR_BUFFER_BIT | WebGL2RenderingContext.DEPTH_BUFFER_BIT, ); - } - let bindVolumeRenderingBuffer: () => void = () => {}; - if (hasVolumeRendering) { + // Volume rendering setup bindVolumeRenderingBuffer = () => { this.volumeRenderingConfiguration.bind( volumeRenderingBufferWidth, @@ -1139,17 +1147,13 @@ export class PerspectivePanel extends RenderedDataPanel { ); }; bindVolumeRenderingBuffer(); - // Copy the depth buffer from the offscreen framebuffer to the volume rendering framebuffer. - gl.depthMask(true); + renderContext.bindVolumeRenderingBuffer = bindVolumeRenderingBuffer; gl.clearDepth(1.0); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear( WebGL2RenderingContext.COLOR_BUFFER_BIT | WebGL2RenderingContext.DEPTH_BUFFER_BIT, ); - this.offscreenDepthCopyHelper.draw( - this.offscreenFramebuffer.colorBuffers[OffscreenTextures.Z].texture, - ); } const { transparentConfiguration } = this; @@ -1174,30 +1178,58 @@ export class PerspectivePanel extends RenderedDataPanel { let currentTransparentRenderingState = TransparentRenderingState.TRANSPARENT; for (const [renderLayer, attachment] of visibleLayers) { - if (renderLayer.isTransparent) { + if (renderLayer.isVolumeRendering) { renderContext.depthBufferTexture = this.offscreenFramebuffer.colorBuffers[OffscreenTextures.Z].texture; - } - // Draw max projection layers - if ( - renderLayer.isVolumeRendering && - isProjectionLayer(renderLayer as VolumeRenderingRenderLayer) - ) { - // Set state for max projection mode and draw - gl.depthMask(true); - gl.disable(WebGL2RenderingContext.BLEND); - gl.depthFunc(WebGL2RenderingContext.GREATER); - if ( - currentTransparentRenderingState !== - TransparentRenderingState.MAX_PROJECTION - ) { - renderContext.emitter = maxProjectionEmit; - bindMaxProjectionBuffer(); + const isVolumeProjectionLayer = isProjectionLayer( + renderLayer as VolumeRenderingRenderLayer, + ); + const needsSecondPickingPass = + !isVolumeProjectionLayer && + !this.isContinuousCameraMotionInProgress && + !renderContext.wireFrame; + + // Bind the appropriate buffer and set state + if (isVolumeProjectionLayer) { + gl.depthMask(true); + gl.disable(WebGL2RenderingContext.BLEND); + gl.depthFunc(WebGL2RenderingContext.GREATER); + if ( + currentTransparentRenderingState !== + TransparentRenderingState.MAX_PROJECTION + ) { + renderContext.emitter = maxProjectionEmit; + bindMaxProjectionBuffer(); + } + } else { + if ( + currentTransparentRenderingState !== + TransparentRenderingState.VOLUME_RENDERING + ) { + renderContext.emitter = perspectivePanelEmitOIT; + bindVolumeRenderingBuffer(); + } + gl.disable(WebGL2RenderingContext.DEPTH_TEST); + currentTransparentRenderingState = + TransparentRenderingState.VOLUME_RENDERING; } + + // Two cases for volume rendering layers + // Either way, a draw call is needed first renderLayer.draw(renderContext, attachment); + gl.enable(WebGL2RenderingContext.DEPTH_TEST); - // Copy max projection result to picking buffer + // Case 1 - No picking pass needed and not a projection layer + // we already have the color information, so we skip the max projection pass + if (!needsSecondPickingPass && !isVolumeProjectionLayer) { + continue; + } + + // Case 2 - Picking will be computed from a max projection + // And a second pass may be needed to do this picking + + // Copy the volume rendering picking result to the main picking buffer // Depth testing on to combine max layers into one pick buffer via depth bindMaxProjectionPickingBuffer(); this.maxProjectionToPickCopyHelper.draw( @@ -1207,11 +1239,7 @@ export class PerspectivePanel extends RenderedDataPanel { this.maxProjectionConfiguration.colorBuffers[3 /*pick*/].texture, ); - // Copy max projection color result to the transparent buffer with OIT - // Depth testing off to combine max layers into one color via blend - bindVolumeRenderingBuffer(); - gl.depthMask(false); - gl.disable(WebGL2RenderingContext.DEPTH_TEST); + // Turn back on OIT blending gl.enable(WebGL2RenderingContext.BLEND); gl.blendFuncSeparate( WebGL2RenderingContext.ONE, @@ -1219,13 +1247,22 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.ZERO, WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, ); - this.maxProjectionColorCopyHelper.draw( - this.maxProjectionConfiguration.colorBuffers[0 /*color*/].texture, - this.maxProjectionConfiguration.colorBuffers[1 /*depth*/].texture, - ); - // Reset the max projection buffer + // Copy max projection color result to the transparent buffer with OIT + // Depth testing off to combine max layers into one color via blending + if (isVolumeProjectionLayer) { + bindVolumeRenderingBuffer(); + gl.depthMask(false); + gl.disable(WebGL2RenderingContext.DEPTH_TEST); + this.maxProjectionColorCopyHelper.draw( + this.maxProjectionConfiguration.colorBuffers[0 /*color*/].texture, + this.maxProjectionConfiguration.colorBuffers[1 /*depth*/].texture, + ); + } + + // Reset the max projection color, depth, and picking buffer bindMaxProjectionBuffer(); + renderContext.emitter = maxProjectionEmit; gl.depthMask(true); gl.clearColor(0.0, 0.0, 0.0, 0.0); gl.clearDepth(0.0); @@ -1234,7 +1271,7 @@ export class PerspectivePanel extends RenderedDataPanel { WebGL2RenderingContext.DEPTH_BUFFER_BIT, ); - // Set back to non-max projection state + // Set some values back to non-max projection state gl.clearDepth(1.0); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.depthMask(false); @@ -1243,17 +1280,6 @@ export class PerspectivePanel extends RenderedDataPanel { currentTransparentRenderingState = TransparentRenderingState.MAX_PROJECTION; - } else if (renderLayer.isVolumeRendering) { - if ( - currentTransparentRenderingState !== - TransparentRenderingState.VOLUME_RENDERING - ) { - renderContext.emitter = perspectivePanelEmitOIT; - bindVolumeRenderingBuffer(); - } - currentTransparentRenderingState = - TransparentRenderingState.VOLUME_RENDERING; - renderLayer.draw(renderContext, attachment); } // Draw regular transparent layers else if (renderLayer.isTransparent) { @@ -1271,18 +1297,18 @@ export class PerspectivePanel extends RenderedDataPanel { } // Copy transparent rendering result back to primary buffer. gl.disable(WebGL2RenderingContext.DEPTH_TEST); - gl.viewport(0, 0, width, height); - this.offscreenFramebuffer.bindSingle(OffscreenTextures.COLOR); - gl.blendFunc( - WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, - WebGL2RenderingContext.SRC_ALPHA, - ); if (hasVolumeRendering) { - this.transparencyCopyHelper.draw( + renderContext.bindFramebuffer(); + this.transparentToTransparentCopyHelper.draw( this.volumeRenderingConfiguration.colorBuffers[0].texture, this.volumeRenderingConfiguration.colorBuffers[1].texture, ); } + gl.blendFunc( + WebGL2RenderingContext.ONE_MINUS_SRC_ALPHA, + WebGL2RenderingContext.SRC_ALPHA, + ); + this.offscreenFramebuffer.bindSingle(OffscreenTextures.COLOR); this.transparencyCopyHelper.draw( transparentConfiguration.colorBuffers[0].texture, transparentConfiguration.colorBuffers[1].texture, @@ -1319,7 +1345,7 @@ export class PerspectivePanel extends RenderedDataPanel { /*dppass=*/ WebGL2RenderingContext.REPLACE, ); gl.stencilMask(2); - if (hasMaxProjection) { + if (hasVolumeRenderingPick) { this.maxProjectionPickCopyHelper.draw( this.maxProjectionPickConfiguration.colorBuffers[0].texture /*depth*/, this.maxProjectionPickConfiguration.colorBuffers[1].texture /*pick*/, diff --git a/src/perspective_view/render_layer.ts b/src/perspective_view/render_layer.ts index 7316717b6..c05482230 100644 --- a/src/perspective_view/render_layer.ts +++ b/src/perspective_view/render_layer.ts @@ -22,7 +22,7 @@ import type { } from "#src/renderlayer.js"; import { VisibilityTrackedRenderLayer } from "#src/renderlayer.js"; import type { vec3 } from "#src/util/geom.js"; -import type { ShaderModule } from "#src/webgl/shader.js"; +import type { ShaderBuilder, ShaderModule } from "#src/webgl/shader.js"; import type { SharedObject } from "#src/worker_rpc.js"; export type PerspectiveViewReadyRenderContext = @@ -70,6 +70,16 @@ export interface PerspectiveViewRenderContext * Specifices how to bind the max projection buffer */ bindMaxProjectionBuffer?: () => void | undefined; + + /** + * Specifies how to bind the volume rendering buffer + */ + bindVolumeRenderingBuffer?: () => void | undefined; + + /** + * Specifies how to assign the max projection emitter + */ + maxProjectionEmit?: (builder: ShaderBuilder) => void | undefined; } // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 66c486d2b..2eb4325d6 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -68,6 +68,7 @@ import type { TrackableVolumeRenderingModeValue } from "#src/volume_rendering/tr import { VolumeRenderingModes, isProjectionMode, + trackableShaderModeValue, } from "#src/volume_rendering/trackable_volume_rendering_mode.js"; import { drawBoxes, @@ -154,13 +155,34 @@ interface VolumeRenderingShaderParameters { mode: VolumeRenderingModes; } -interface StoredChunkInfoForHistogram { +interface StoredChunkDataForMultipass { chunk: VolumeChunk; fixedPositionWithinChunk: Uint32Array; chunkDisplayDimensionIndices: number[]; channelToChunkDimensionIndices: readonly number[]; chunkDataDisplaySize: vec3; - chunkFormat: ChunkFormat; + chunkFormat: ChunkFormat | null | undefined; +} + +interface ShaderSetupUniforms { + uNearLimitFraction: number; + uFarLimitFraction: number; + uMaxSteps: number; + uBrightnessFactor: number; + uGain: number; + uPickId: number; + uLowerClipBound: vec3; + uUpperClipBound: vec3; + uModelViewProjectionMatrix: mat4; + uInvModelViewProjectionMatrix: mat4; +} + +/** + * Represents the uniform variables used by the shader for each chunk in the volume rendering layer. + */ +interface PerChunkShaderUniforms { + uTranslation: vec3; + uChunkDataSize: vec3; } const tempMat4 = mat4.create(); @@ -198,6 +220,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { chunkResolutionHistogram: RenderScaleHistogram; mode: TrackableVolumeRenderingModeValue; backend: ChunkRenderLayerFrontend; + private modeOverride: TrackableVolumeRenderingModeValue; private vertexIdHelper: VertexIdHelper; private dataHistogramSpecifications: HistogramSpecifications; @@ -242,6 +265,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { this.depthSamplesTarget = options.depthSamplesTarget; this.chunkResolutionHistogram = options.chunkResolutionHistogram; this.mode = options.mode; + this.modeOverride = trackableShaderModeValue(); this.dataHistogramSpecifications = this.shaderControlState.histogramSpecifications; this.histogramIndexBuffer = this.registerDisposer( @@ -262,15 +286,17 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { ( space: CoordinateSpace, mode: VolumeRenderingModes, + modeOverride: VolumeRenderingModes, dataHistogramChannelSpecifications: HistogramChannelSpecification[], ) => ({ numChannelDimensions: space.rank, - mode, + mode: modeOverride === VolumeRenderingModes.OFF ? mode : modeOverride, dataHistogramChannelSpecifications, }), [ this.channelCoordinateSpace, this.mode, + this.modeOverride, this.dataHistogramSpecifications.channels, ], ), @@ -738,26 +764,32 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); const { gl } = this; this.vertexIdHelper.enable(); + this.modeOverride.value = VolumeRenderingModes.OFF; const { chunkResolutionHistogram: renderScaleHistogram } = this; renderScaleHistogram.begin( this.chunkManager.chunkQueueManager.frameNumberCounter.frameNumber, ); - const restoreDrawingBuffers = () => { - if (isProjectionMode(this.mode.value)) { + const restoreDrawingBuffersAndState = () => { + const performedSecondPassForPicking = + !isProjectionMode(this.mode.value) && + !renderContext.isContinuousCameraMotionInProgress; + // If the layer is in projection mode or the second pass for picking has been performed, + // the max projection state is needed + // the max projection buffer is not bound, because it is immediately read back + // in the perspective panel to update the max projection picking buffer + if (isProjectionMode(this.mode.value) || performedSecondPassForPicking) { + gl.depthMask(true); gl.disable(WebGL2RenderingContext.BLEND); - if (renderContext.bindMaxProjectionBuffer !== undefined) { - renderContext.bindMaxProjectionBuffer(); - } else { - throw new Error( - "bindMaxProjectionBuffer is undefined in VolumeRenderingRenderLayer", - ); - } + gl.depthFunc(WebGL2RenderingContext.GREATER); } else { - renderContext.bindFramebuffer(); + // Otherwise, the regular OIT buffer is needed along with the state + gl.depthMask(false); + gl.enable(WebGL2RenderingContext.BLEND); + gl.depthFunc(WebGL2RenderingContext.LESS); + renderContext.bindVolumeRenderingBuffer!(); } - gl.enable(WebGL2RenderingContext.DEPTH_TEST); }; const endShader = () => { @@ -820,14 +852,20 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); !renderContext.wireFrame && !renderContext.sliceViewsPresent && !renderContext.isContinuousCameraMotionInProgress; + const needPickingPass = + !isProjectionMode(this.mode.value) && + !renderContext.isContinuousCameraMotionInProgress && + !renderContext.wireFrame; + const hasPicking = isProjectionMode(this.mode.value) || needPickingPass; + + const pickId = hasPicking ? renderContext.pickIDs.register(this) : 0; + const chunkInfoForMultipass: StoredChunkDataForMultipass[] = []; + const shaderUniformsForSecondPass: PerChunkShaderUniforms[] = []; + let shaderSetupUniforms: ShaderSetupUniforms | undefined; gl.enable(WebGL2RenderingContext.CULL_FACE); gl.cullFace(WebGL2RenderingContext.FRONT); - const chunkInfoForHistogram: StoredChunkInfoForHistogram[] = []; - const pickId = isProjectionMode(this.mode.value) - ? renderContext.pickIDs.register(this) - : 0; forEachVisibleVolumeRenderingChunk( renderContext.projectionParameters, this.localPosition.value, @@ -875,25 +913,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); this.shaderControlState, shaderResult.parameters.parseResult.controls, ); - if ( - renderContext.depthBufferTexture !== undefined && - renderContext.depthBufferTexture !== null - ) { - const depthTextureUnit = shader.textureUnit( - depthSamplerTextureUnit, - ); - gl.activeTexture( - WebGL2RenderingContext.TEXTURE0 + depthTextureUnit, - ); - gl.bindTexture( - WebGL2RenderingContext.TEXTURE_2D, - renderContext.depthBufferTexture, - ); - } else { - throw new Error( - "Depth buffer texture ID for volume rendering is undefined or null", - ); - } + this.bindDepthBufferTexture(renderContext, shader); chunkFormat.beginDrawing(gl, shader); chunkFormat.beginSource(gl, shader); } @@ -911,19 +931,10 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); projectionParameters.viewProjectionMat, chunkLayout.transform, ); - gl.uniformMatrix4fv( - shader.uniform("uModelViewProjectionMatrix"), - false, - modelViewProjection, - ); const clippingPlanes = tempVisibleVolumetricClippingPlanes; getFrustrumPlanes(clippingPlanes, modelViewProjection); - mat4.invert(modelViewProjection, modelViewProjection); - gl.uniformMatrix4fv( - shader.uniform("uInvModelViewProjectionMatrix"), - false, - modelViewProjection, - ); + const inverseModelViewProjection = mat4.create(); + mat4.invert(inverseModelViewProjection, modelViewProjection); const { near, far, adjustedNear, adjustedFar } = getVolumeRenderingNearFarBounds( clippingPlanes, @@ -933,24 +944,21 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); const optimalSampleRate = optimalSamples; const actualSampleRate = this.depthSamplesTarget.value; const brightnessFactor = optimalSampleRate / actualSampleRate; - gl.uniform1f(shader.uniform("uBrightnessFactor"), brightnessFactor); const nearLimitFraction = (adjustedNear - near) / (far - near); const farLimitFraction = (adjustedFar - near) / (far - near); - gl.uniform1f(shader.uniform("uNearLimitFraction"), nearLimitFraction); - gl.uniform1f(shader.uniform("uFarLimitFraction"), farLimitFraction); - gl.uniform1f(shader.uniform("uGain"), Math.exp(this.gain.value)); - gl.uniform1i( - shader.uniform("uMaxSteps"), - this.depthSamplesTarget.value, - ); - gl.uniform3fv( - shader.uniform("uLowerClipBound"), - transformedSource.lowerClipDisplayBound, - ); - gl.uniform3fv( - shader.uniform("uUpperClipBound"), - transformedSource.upperClipDisplayBound, - ); + shaderSetupUniforms = { + uNearLimitFraction: nearLimitFraction, + uFarLimitFraction: farLimitFraction, + uMaxSteps: this.depthSamplesTarget.value, + uBrightnessFactor: brightnessFactor, + uGain: Math.exp(this.gain.value), + uPickId: pickId, + uLowerClipBound: transformedSource.lowerClipDisplayBound, + uUpperClipBound: transformedSource.upperClipDisplayBound, + uModelViewProjectionMatrix: modelViewProjection, + uInvModelViewProjectionMatrix: inverseModelViewProjection, + }; + this.setShaderUniforms(shader, shaderSetupUniforms); }, (transformedSource) => { if (shader === null) return; @@ -992,6 +1000,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); ? 0 : originalChunkSize[i] * chunkGridPosition[chunkDim]; } + gl.uniform3fv(shader.uniform("uTranslation"), chunkPosition); if (prevChunkFormat != null) { prevChunkFormat.bindChunk( gl, @@ -1002,19 +1011,28 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); channelToChunkDimensionIndices, newSource, ); - if (needToDrawHistogram) { - chunkInfoForHistogram.push({ - chunk, - fixedPositionWithinChunk, - chunkDisplayDimensionIndices, - channelToChunkDimensionIndices, - chunkDataDisplaySize, - chunkFormat: prevChunkFormat, - }); - } } - gl.uniform3fv(shader.uniform("uTranslation"), chunkPosition); - gl.uniform1ui(shader.uniform("uPickId"), pickId); + // Save information for possible repasses through the data + if (needToDrawHistogram || needPickingPass) { + chunkInfoForMultipass.push({ + chunk, + fixedPositionWithinChunk, + chunkDisplayDimensionIndices, + channelToChunkDimensionIndices, + chunkDataDisplaySize, + chunkFormat: prevChunkFormat, + }); + } + if (needPickingPass) { + const copiedDisplaySize = vec3.create(); + const copiedPosition = vec3.create(); + vec3.copy(copiedDisplaySize, chunkDataDisplaySize); + vec3.copy(copiedPosition, chunkPosition); + shaderUniformsForSecondPass.push({ + uChunkDataSize: copiedDisplaySize, + uTranslation: copiedPosition, + }); + } drawBoxes(gl, 1, 1); newSource = false; @@ -1024,9 +1042,81 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); } }, ); - gl.disable(WebGL2RenderingContext.CULL_FACE); endShader(); + + shader = null; + prevChunkFormat = null; + if (needPickingPass) { + gl.enable(WebGL2RenderingContext.DEPTH_TEST); + gl.depthMask(true); + gl.disable(WebGL2RenderingContext.BLEND); + gl.depthFunc(WebGL2RenderingContext.GREATER); + renderContext.emitter = renderContext.maxProjectionEmit!; + renderContext.bindMaxProjectionBuffer!(); + this.modeOverride.value = VolumeRenderingModes.MAX; + + const endPickingPassShader = () => { + if (shader === null) return; + shader.unbindTransferFunctionTextures(); + if (prevChunkFormat !== null) { + prevChunkFormat!.endDrawing(gl, shader); + } + }; + + newSource = true; + for (let j = 0; j < presentCount; ++j) { + const chunkInfo = chunkInfoForMultipass[j]; + const uniforms = shaderUniformsForSecondPass[j]; + const chunkFormat = chunkInfo.chunkFormat; + if (chunkFormat !== prevChunkFormat) { + prevChunkFormat = chunkFormat; + endPickingPassShader(); + shaderResult = this.shaderGetter({ + emitter: renderContext.emitter, + chunkFormat: chunkFormat!, + wireFrame: renderContext.wireFrame, + }); + shader = shaderResult.shader; + if (shader !== null && shaderSetupUniforms !== undefined) { + shader.bind(); + if (chunkFormat !== null && chunkFormat !== undefined) { + setControlsInShader( + gl, + shader, + this.shaderControlState, + shaderResult.parameters.parseResult.controls, + ); + this.bindDepthBufferTexture(renderContext, shader); + this.setShaderUniforms(shader, shaderSetupUniforms); + chunkFormat.beginDrawing(gl, shader); + chunkFormat.beginSource(gl, shader); + } + } + } + if (shader === null) break; + if (chunkFormat != null) { + chunkFormat.bindChunk( + gl, + shader, + chunkInfo.chunk, + chunkInfo.fixedPositionWithinChunk, + chunkInfo.chunkDisplayDimensionIndices, + chunkInfo.channelToChunkDimensionIndices, + newSource, + ); + } + gl.uniform3fv(shader.uniform("uTranslation"), uniforms.uTranslation); + gl.uniform3fv( + shader.uniform("uChunkDataSize"), + uniforms.uChunkDataSize, + ); + drawBoxes(gl, 1, 1); + newSource = false; + } + this.modeOverride.value = VolumeRenderingModes.OFF; + } this.vertexIdHelper.disable(); + gl.disable(WebGL2RenderingContext.CULL_FACE); if (needToDrawHistogram) { let histogramShader: ShaderProgram | null = null; @@ -1078,7 +1168,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); gl.disable(WebGL2RenderingContext.DEPTH_TEST); for (let j = 0; j < presentCount; ++j) { newSource = true; - const chunkInfo = chunkInfoForHistogram[j]; + const chunkInfo = chunkInfoForMultipass[j]; const chunkFormat = chunkInfo.chunkFormat; if (chunkFormat !== prevChunkFormat) { prevChunkFormat = chunkFormat; @@ -1088,7 +1178,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); }); histogramShader = histogramShaderResult.shader; if (histogramShader !== null) { - if (chunkFormat !== null) { + if (chunkFormat !== null && chunkFormat !== undefined) { chunkFormat.beginDrawing(gl, histogramShader); chunkFormat.beginSource(gl, histogramShader); } @@ -1167,8 +1257,66 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); } } endHistogramShader(); - restoreDrawingBuffers(); } + if (needPickingPass || needToDrawHistogram) { + restoreDrawingBuffersAndState(); + } + } + + private bindDepthBufferTexture( + renderContext: PerspectiveViewRenderContext, + shader: ShaderProgram, + ) { + const { gl } = this; + if ( + renderContext.depthBufferTexture !== undefined && + renderContext.depthBufferTexture !== null + ) { + const depthTextureUnit = shader.textureUnit(depthSamplerTextureUnit); + gl.activeTexture(WebGL2RenderingContext.TEXTURE0 + depthTextureUnit); + gl.bindTexture( + WebGL2RenderingContext.TEXTURE_2D, + renderContext.depthBufferTexture, + ); + } else { + throw new Error( + "Depth buffer texture ID for volume rendering is undefined or null", + ); + } + } + + private setShaderUniforms( + shader: ShaderProgram, + uniforms: ShaderSetupUniforms, + ) { + const { gl } = this; + gl.uniformMatrix4fv( + shader.uniform("uModelViewProjectionMatrix"), + false, + uniforms.uModelViewProjectionMatrix, + ); + gl.uniformMatrix4fv( + shader.uniform("uInvModelViewProjectionMatrix"), + false, + uniforms.uInvModelViewProjectionMatrix, + ); + gl.uniform1f( + shader.uniform("uNearLimitFraction"), + uniforms.uNearLimitFraction, + ); + gl.uniform1f( + shader.uniform("uFarLimitFraction"), + uniforms.uFarLimitFraction, + ); + gl.uniform1f(shader.uniform("uGain"), uniforms.uGain); + gl.uniform1ui(shader.uniform("uPickId"), uniforms.uPickId); + gl.uniform1i(shader.uniform("uMaxSteps"), uniforms.uMaxSteps); + gl.uniform3fv(shader.uniform("uLowerClipBound"), uniforms.uLowerClipBound); + gl.uniform3fv(shader.uniform("uUpperClipBound"), uniforms.uUpperClipBound); + gl.uniform1f( + shader.uniform("uBrightnessFactor"), + uniforms.uBrightnessFactor, + ); } isReady( From aa9efda5648bdba0445f458b0a754f06c95fc9fd Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 24 Jul 2024 17:25:15 +0200 Subject: [PATCH 28/45] feat(transfer-function): show data CDF in transfer function (#607) * feat: mark transfer function as needing histogram * feat: mark bounds for transfer function histogram * refactor: pull histogram calculation into function * feat: link up a transfer function CDF line shader * fix: linting * fix(log): correect console.log of histogram from VR * fix: correct histogram index when invlerp and tfs are mixed * feat: change transfer function line colours * refactor: define CDF shader as a function --- src/volume_rendering/volume_render_layer.ts | 2 +- src/webgl/shader_ui_controls.ts | 11 +- src/widget/invlerp.ts | 105 ++++++++++---------- src/widget/shader_controls.ts | 55 ++++++---- src/widget/transfer_function.ts | 77 +++++++++++++- 5 files changed, 171 insertions(+), 79 deletions(-) diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index 2eb4325d6..f7b68bfed 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -1253,7 +1253,7 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); for (let j = 0; j < 256; ++j) { tempBuffer2[j] = tempBuffer[j * 4]; } - console.log("histogram%d", i, tempBuffer2.join(" ")); + console.log(`histogram${i}`, tempBuffer2.join(" ")); } } endHistogramShader(); diff --git a/src/webgl/shader_ui_controls.ts b/src/webgl/shader_ui_controls.ts index b046fb3b1..98ebde8a8 100644 --- a/src/webgl/shader_ui_controls.ts +++ b/src/webgl/shader_ui_controls.ts @@ -1418,7 +1418,11 @@ export class ShaderControlState (state) => { const channels: HistogramChannelSpecification[] = []; for (const { control, trackable } of state.values()) { - if (control.type !== "imageInvlerp") continue; + if ( + control.type !== "imageInvlerp" && + control.type !== "transferFunction" + ) + continue; channels.push({ channel: trackable.value.channel }); } return channels; @@ -1444,7 +1448,10 @@ export class ShaderControlState const histogramBounds = makeCachedLazyDerivedWatchableValue((state) => { const bounds: DataTypeInterval[] = []; for (const { control, trackable } of state.values()) { - if (control.type === "imageInvlerp") { + if ( + control.type === "imageInvlerp" || + control.type === "transferFunction" + ) { bounds.push(trackable.value.window); } else if (control.type === "propertyInvlerp") { const { dataType, range, window } = diff --git a/src/widget/invlerp.ts b/src/widget/invlerp.ts index 263f620b7..336ab3c4a 100644 --- a/src/widget/invlerp.ts +++ b/src/widget/invlerp.ts @@ -49,6 +49,7 @@ import { Uint64 } from "#src/util/uint64.js"; import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import type { GL } from "#src/webgl/context.js"; import type { ParameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; @@ -78,6 +79,55 @@ const inputEventMap = EventActionMap.fromObject({ "shift?+wheel": { action: "zoom-via-wheel" }, }); +export function createCDFLineShader(gl: GL, textureUnit: symbol) { + const builder = new ShaderBuilder(gl); + defineLineShader(builder); + builder.addTextureSampler("sampler2D", "uHistogramSampler", textureUnit); + builder.addOutputBuffer("vec4", "out_color", 0); + builder.addAttribute("uint", "aDataValue"); + builder.addUniform("float", "uBoundsFraction"); + builder.addVertexCode(` +float getCount(int i) { + return texelFetch(uHistogramSampler, ivec2(i, 0), 0).x; +} +vec4 getVertex(float cdf, int i) { + float x; + if (i == 0) { + x = -1.0; + } else if (i == 255) { + x = 1.0; + } else { + x = float(i) / 254.0 * uBoundsFraction * 2.0 - 1.0; + } + return vec4(x, cdf * (2.0 - uLineParams.y) - 1.0 + uLineParams.y * 0.5, 0.0, 1.0); +} +`); + builder.setVertexMain(` +int lineNumber = int(aDataValue); +int dataValue = lineNumber; +float cumSum = 0.0; +for (int i = 0; i <= dataValue; ++i) { + cumSum += getCount(i); +} +float total = cumSum + getCount(dataValue + 1); +float cumSumEnd = dataValue == ${NUM_CDF_LINES - 1} ? cumSum : total; +if (dataValue == ${NUM_CDF_LINES - 1}) { + cumSum + getCount(dataValue + 1); +} +for (int i = dataValue + 2; i < 256; ++i) { + total += getCount(i); +} +total = max(total, 1.0); +float cdf1 = cumSum / total; +float cdf2 = cumSumEnd / total; +emitLine(getVertex(cdf1, lineNumber), getVertex(cdf2, lineNumber + 1), 1.0); +`); + builder.setFragmentMain(` +out_color = vec4(0.0, 1.0, 1.0, getLineAlpha()); +`); + return builder.build(); +} + export class CdfController< T extends RangeAndWindowIntervals, > extends RefCounted { @@ -287,7 +337,7 @@ export function getUpdatedRangeAndWindowParameters< // 256 bins in total. The first and last bin are for values below the lower bound/above the upper // bound. const NUM_HISTOGRAM_BINS_IN_RANGE = 254; -const NUM_CDF_LINES = NUM_HISTOGRAM_BINS_IN_RANGE + 1; +export const NUM_CDF_LINES = NUM_HISTOGRAM_BINS_IN_RANGE + 1; /** * Panel that shows Cumulative Distribution Function (CDF) of visible data. @@ -325,58 +375,7 @@ class CdfPanel extends IndirectRenderedPanel { ).value; private lineShader = this.registerDisposer( - (() => { - const builder = new ShaderBuilder(this.gl); - defineLineShader(builder); - builder.addTextureSampler( - "sampler2D", - "uHistogramSampler", - histogramSamplerTextureUnit, - ); - builder.addOutputBuffer("vec4", "out_color", 0); - builder.addAttribute("uint", "aDataValue"); - builder.addUniform("float", "uBoundsFraction"); - builder.addVertexCode(` -float getCount(int i) { - return texelFetch(uHistogramSampler, ivec2(i, 0), 0).x; -} -vec4 getVertex(float cdf, int i) { - float x; - if (i == 0) { - x = -1.0; - } else if (i == 255) { - x = 1.0; - } else { - x = float(i) / 254.0 * uBoundsFraction * 2.0 - 1.0; - } - return vec4(x, cdf * (2.0 - uLineParams.y) - 1.0 + uLineParams.y * 0.5, 0.0, 1.0); -} -`); - builder.setVertexMain(` -int lineNumber = int(aDataValue); -int dataValue = lineNumber; -float cumSum = 0.0; -for (int i = 0; i <= dataValue; ++i) { - cumSum += getCount(i); -} -float total = cumSum + getCount(dataValue + 1); -float cumSumEnd = dataValue == ${NUM_CDF_LINES - 1} ? cumSum : total; -if (dataValue == ${NUM_CDF_LINES - 1}) { - cumSum + getCount(dataValue + 1); -} -for (int i = dataValue + 2; i < 256; ++i) { - total += getCount(i); -} -total = max(total, 1.0); -float cdf1 = cumSum / total; -float cdf2 = cumSumEnd / total; -emitLine(getVertex(cdf1, lineNumber), getVertex(cdf2, lineNumber + 1), 1.0); -`); - builder.setFragmentMain(` -out_color = vec4(0.0, 1.0, 1.0, getLineAlpha()); -`); - return builder.build(); - })(), + (() => createCDFLineShader(this.gl, histogramSamplerTextureUnit))(), ); private regionCornersBuffer = getSquareCornersBuffer(this.gl, 0, -1, 1, 1); diff --git a/src/widget/shader_controls.ts b/src/widget/shader_controls.ts index aa19a7719..f9a392143 100644 --- a/src/widget/shader_controls.ts +++ b/src/widget/shader_controls.ts @@ -75,16 +75,6 @@ function getShaderLayerControlFactory( case "checkbox": return checkboxLayerControl(() => controlState.trackable); case "imageInvlerp": { - let histogramIndex = 0; - for (const [ - otherName, - { - control: { type: otherType }, - }, - ] of shaderControlState.state) { - if (otherName === controlId) break; - if (otherType === "imageInvlerp") ++histogramIndex; - } return channelInvlerpLayerControl(() => ({ dataType: control.dataType, defaultChannel: control.default.channel, @@ -92,26 +82,16 @@ function getShaderLayerControlFactory( channelCoordinateSpaceCombiner: shaderControlState.channelCoordinateSpaceCombiner, histogramSpecifications: shaderControlState.histogramSpecifications, - histogramIndex, + histogramIndex: calculateHistogramIndex(), legendShaderOptions: layerShaderControls.legendShaderOptions, })); } case "propertyInvlerp": { - let histogramIndex = 0; - for (const [ - otherName, - { - control: { type: otherType }, - }, - ] of shaderControlState.state) { - if (otherName === controlId) break; - if (otherType === "propertyInvlerp") ++histogramIndex; - } return propertyInvlerpLayerControl(() => ({ properties: control.properties, watchableValue: controlState.trackable, histogramSpecifications: shaderControlState.histogramSpecifications, - histogramIndex, + histogramIndex: calculateHistogramIndex(), legendShaderOptions: layerShaderControls.legendShaderOptions, })); } @@ -122,9 +102,40 @@ function getShaderLayerControlFactory( channelCoordinateSpaceCombiner: shaderControlState.channelCoordinateSpaceCombiner, defaultChannel: control.default.channel, + histogramSpecifications: shaderControlState.histogramSpecifications, + histogramIndex: calculateHistogramIndex(), })); } } + + function calculateHistogramIndex(controlType: string = control.type) { + const isMatchingControlType = (otherControlType: string) => { + if ( + controlType === "imageInvlerp" || + controlType === "transferFunction" + ) { + return ( + otherControlType === "imageInvlerp" || + otherControlType === "transferFunction" + ); + } else if (controlType === "propertyInvlerp") { + return otherControlType === "propertyInvlerp"; + } else { + throw new Error(`${controlType} does not support histogram index.`); + } + }; + let histogramIndex = 0; + for (const [ + otherName, + { + control: { type: otherType }, + }, + ] of shaderControlState.state) { + if (otherName === controlId) break; + if (isMatchingControlType(otherType)) histogramIndex++; + } + return histogramIndex; + } } function getShaderLayerControlDefinition( diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 1d47f3581..3ac1f21e1 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -41,6 +41,7 @@ import { computeInvlerp, computeLerp, defaultDataTypeRange, + getIntervalBoundsEffectiveFraction, parseDataTypeValue, } from "#src/util/lerp.js"; import { MouseEventBinder } from "#src/util/mouse_bindings.js"; @@ -50,6 +51,7 @@ import type { WatchableVisibilityPriority } from "#src/visibility_priority/front import type { Buffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; +import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { defineInvlerpShaderFunction, enableLerpShaderFunction, @@ -71,6 +73,8 @@ import { getUpdatedRangeAndWindowParameters, updateInputBoundValue, updateInputBoundWidth, + createCDFLineShader, + NUM_CDF_LINES, } from "#src/widget/invlerp.js"; import type { LayerControlFactory, @@ -88,6 +92,7 @@ const TRANSFER_FUNCTION_BORDER_WIDTH = 0.05; const transferFunctionSamplerTextureUnit = Symbol( "transferFunctionSamplerTexture", ); +const histogramSamplerTextureUnit = Symbol("histogramSamplerTexture"); const defaultTransferFunctionSizes: Record = { [DataType.UINT8]: 256, @@ -631,6 +636,18 @@ class TransferFunctionPanel extends IndirectRenderedPanel { }, ), ); + private dataValuesBuffer = this.registerDisposer( + getMemoizedBuffer(this.gl, WebGL2RenderingContext.ARRAY_BUFFER, () => { + const array = new Uint8Array(NUM_CDF_LINES * VERTICES_PER_LINE); + for (let i = 0; i < NUM_CDF_LINES; ++i) { + for (let j = 0; j < VERTICES_PER_LINE; ++j) { + array[i * VERTICES_PER_LINE + j] = i; + } + } + return array; + }), + ).value; + constructor(public parent: TransferFunctionWidget) { super(parent.display, document.createElement("div"), parent.visibility); const { element, gl } = this; @@ -963,6 +980,10 @@ class TransferFunctionPanel extends IndirectRenderedPanel { } } + private histogramLineShader = this.registerDisposer( + (() => createCDFLineShader(this.gl, histogramSamplerTextureUnit))(), + ); + private transferFunctionLineShader = this.registerDisposer( (() => { const builder = new ShaderBuilder(this.gl); @@ -976,7 +997,7 @@ vec4 end = vec4(aLineStartEnd[2], aLineStartEnd[3], 0.0, 1.0); emitLine(start, end, 1.0); `); builder.setFragmentMain(` -out_color = vec4(0.0, 1.0, 1.0, getLineAlpha()); +out_color = vec4(0.35, 0.35, 0.35, getLineAlpha()); `); return builder.build(); })(), @@ -1042,6 +1063,7 @@ out_color = tempColor * alpha; gl, transferFunctionShader, controlPointsShader, + histogramLineShader: lineShader, } = this; this.setGLLogicalViewport(); gl.clearColor(0.0, 0.0, 0.0, 0.0); @@ -1078,6 +1100,42 @@ out_color = tempColor * alpha; gl.disableVertexAttribArray(aVertexPosition); gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, null); } + // Draw CDF lines + if (this.parent.histogramSpecifications.producerVisibility.visible) { + const { renderViewport } = this; + lineShader.bind(); + initializeLineShader( + lineShader, + { + width: renderViewport.logicalWidth, + height: renderViewport.logicalHeight, + }, + /*featherWidthInPixels=*/ 1.0, + ); + const histogramTextureUnit = lineShader.textureUnit( + histogramSamplerTextureUnit, + ); + gl.uniform1f( + lineShader.uniform("uBoundsFraction"), + getIntervalBoundsEffectiveFraction( + this.parent.dataType, + this.parent.trackable.value.window, + ), + ); + gl.activeTexture(WebGL2RenderingContext.TEXTURE0 + histogramTextureUnit); + gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, this.parent.texture); + setRawTextureParameters(gl); + const aDataValue = lineShader.attribute("aDataValue"); + this.dataValuesBuffer.bindToVertexAttribI( + aDataValue, + /*componentsPerVertexAttribute=*/ 1, + /*attributeType=*/ WebGL2RenderingContext.UNSIGNED_BYTE, + ); + drawLines(gl, /*linesPerInstance=*/ NUM_CDF_LINES, /*numInstances=*/ 1); + gl.disableVertexAttribArray(aDataValue); + gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, null); + } + // Draw lines and control points on top of transfer function - if there are any if (this.controlPointsPositionArray.length > 0) { const { renderViewport } = this; @@ -1481,13 +1539,24 @@ class TransferFunctionWidget extends Tab { ); window = createWindowBoundInputs(this.dataType, this.trackable); + + get texture() { + return this.histogramSpecifications.getFramebuffers(this.display.gl)[ + this.histogramIndex + ].colorBuffers[0].texture; + } constructor( visibility: WatchableVisibilityPriority, public display: DisplayContext, public dataType: DataType, public trackable: WatchableValueInterface, + public histogramSpecifications: HistogramSpecifications, + public histogramIndex: number, ) { super(visibility); + this.registerDisposer( + histogramSpecifications.visibility.add(this.visibility), + ); const { element } = this; element.classList.add("neuroglancer-transfer-function-widget"); element.appendChild(this.transferFunctionPanel.element); @@ -1660,6 +1729,8 @@ export function transferFunctionLayerControl( watchableValue: WatchableValueInterface; defaultChannel: number[]; channelCoordinateSpaceCombiner: CoordinateSpaceCombiner | undefined; + histogramSpecifications: HistogramSpecifications; + histogramIndex: number; dataType: DataType; }, ): LayerControlFactory { @@ -1669,6 +1740,8 @@ export function transferFunctionLayerControl( watchableValue, channelCoordinateSpaceCombiner, defaultChannel, + histogramSpecifications, + histogramIndex, dataType, } = getter(layer); @@ -1717,6 +1790,8 @@ export function transferFunctionLayerControl( options.display, dataType, watchableValue, + histogramSpecifications, + histogramIndex, ), ); return { control, controlElement: control.element }; From c94650f27bdbf5e69a51b7b996214ea086d58279 Mon Sep 17 00:00:00 2001 From: Sean Martin Date: Wed, 24 Jul 2024 17:25:56 +0200 Subject: [PATCH 29/45] feat(transfer-function): add zoom via wheel as in the invlerp widget to the transfer function widget (#610) --- src/widget/transfer_function.ts | 50 +++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index 3ac1f21e1..7d60548a2 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -47,6 +47,7 @@ import { import { MouseEventBinder } from "#src/util/mouse_bindings.js"; import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import type { Uint64 } from "#src/util/uint64.js"; +import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; import type { Buffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; @@ -1257,6 +1258,7 @@ const inputEventMap = EventActionMap.fromObject({ "shift?+mousedown0": { action: "add-or-drag-point" }, "shift+dblclick0": { action: "remove-point" }, "shift?+mousedown2": { action: "change-point-color" }, + "shift?+wheel": { action: "zoom-via-wheel" }, }); /** @@ -1323,6 +1325,40 @@ class TransferFunctionController extends RefCounted { } }, ); + registerActionListener( + element, + "zoom-via-wheel", + (actionEvent) => { + const wheelEvent = actionEvent.detail; + const zoomAmount = getWheelZoomAmount(wheelEvent); + const relativeX = this.getTargetFraction(wheelEvent); + const { dataType } = this; + const model = this.getModel(); + const newLower = computeLerp( + model.window, + dataType, + relativeX * (1 - zoomAmount), + ); + const newUpper = computeLerp( + model.window, + dataType, + (1 - relativeX) * zoomAmount + relativeX, + ); + if (newLower !== newUpper) { + this.setModel({ + ...model, + window: [newLower, newUpper] as DataTypeInterval, + }); + } + }, + ); + } + /** + * Get fraction of distance in x along bounding rect for a MouseEvent. + */ + getTargetFraction(event: MouseEvent) { + const clientRect = this.element.getBoundingClientRect(); + return (event.clientX - clientRect.left) / clientRect.width; } updateValue(value: TransferFunctionParameters | undefined) { if (value === undefined) return; @@ -1600,16 +1636,14 @@ class TransferFunctionWidget extends Tab { this.updateControlPointsAndDraw(); }), ); - updateInputBoundValue( - this.window.inputs[0], - this.trackable.value.window[0], - ); - updateInputBoundValue( - this.window.inputs[1], - this.trackable.value.window[1], - ); } updateView() { + for (let i = 0; i < 2; ++i) { + updateInputBoundValue( + this.window.inputs[i], + this.trackable.value.window[i], + ); + } this.transferFunctionPanel.scheduleRedraw(); } updateControlPointsAndDraw() { From 95ff6b95630e9f1484435877f19ab71d1aca77d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 08:26:54 -0700 Subject: [PATCH 30/45] chore(deps): bump golang.org/x/net in /ngauth_server (#581) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- ngauth_server/go.mod | 6 +++--- ngauth_server/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ngauth_server/go.mod b/ngauth_server/go.mod index 1cbf217b4..600017f98 100644 --- a/ngauth_server/go.mod +++ b/ngauth_server/go.mod @@ -22,9 +22,9 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/grpc v1.56.3 // indirect ) diff --git a/ngauth_server/go.sum b/ngauth_server/go.sum index ce51185fe..54f4b5e72 100644 --- a/ngauth_server/go.sum +++ b/ngauth_server/go.sum @@ -79,8 +79,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= @@ -91,13 +91,13 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= From 6b24f986e189734840ac062a7d02315d7975eff9 Mon Sep 17 00:00:00 2001 From: Chris Jordan Date: Wed, 24 Jul 2024 11:30:34 -0400 Subject: [PATCH 31/45] feat(status): add modal status message option that can be closed back to a normal status message (#618) --- .../middleauth/credentials_provider.ts | 2 +- src/status.css | 38 ++++++++++++++ src/status.ts | 49 +++++++++++++++++-- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/datasource/middleauth/credentials_provider.ts b/src/datasource/middleauth/credentials_provider.ts index cd70ed9d6..c5a6ab999 100644 --- a/src/datasource/middleauth/credentials_provider.ts +++ b/src/datasource/middleauth/credentials_provider.ts @@ -52,7 +52,7 @@ function openPopupCenter(url: string, width: number, height: number) { } async function waitForLogin(serverUrl: string): Promise { - const status = new StatusMessage(/*delay=*/ false); + const status = new StatusMessage(/*delay=*/ false, /*modal=*/ true); const res: Promise = new Promise((f) => { function writeLoginStatus(message: string, buttonMessage: string) { diff --git a/src/status.css b/src/status.css index ce5806887..b0d7b9c85 100644 --- a/src/status.css +++ b/src/status.css @@ -38,3 +38,41 @@ background-color: #333; padding: 2px; } + +#statusContainerModal { + pointer-events: none; + position: absolute; + z-index: 100; + color: white; + margin: 0px; + padding: 0px; + font: 10pt sans-serif; + + display: grid; + align-content: center; + justify-content: center; + height: 100vh; + width: 80vw; + left: 10vw; + grid-row-gap: 10px; +} + +#statusContainerModal > div { + pointer-events: initial; + position: relative; + background-color: #808080; + padding: 20px; + padding-top: 30px; +} + +#statusContainerModal > div > div:first-child { + position: absolute; + top: 4px; + right: 4px; + margin: 0; + padding: 0; +} + +#statusContainerModal li { + display: block; +} diff --git a/src/status.ts b/src/status.ts index 8aaf9058a..519df5744 100644 --- a/src/status.ts +++ b/src/status.ts @@ -16,7 +16,10 @@ import "#src/status.css"; +import { makeCloseButton } from "#src/widget/close_button.js"; + let statusContainer: HTMLElement | null = null; +let modalStatusContainer: HTMLElement | null = null; export const DEFAULT_STATUS_DELAY = 200; @@ -24,8 +27,9 @@ export type Delay = boolean | number; export class StatusMessage { element: HTMLElement; + modalElementWrapper: HTMLElement | undefined; private timer: number | null; - constructor(delay: Delay = false) { + constructor(delay: Delay = false, modal = false) { if (statusContainer === null) { statusContainer = document.createElement("ul"); statusContainer.id = "statusContainer"; @@ -38,6 +42,18 @@ export class StatusMessage { document.body.appendChild(statusContainer); } } + if (modal && modalStatusContainer === null) { + modalStatusContainer = document.createElement("ul"); + modalStatusContainer.id = "statusContainerModal"; + const el: HTMLElement | null = document.getElementById( + "neuroglancer-container", + ); + if (el) { + el.appendChild(modalStatusContainer); + } else { + document.body.appendChild(modalStatusContainer); + } + } const element = document.createElement("li"); this.element = element; if (delay === true) { @@ -49,15 +65,42 @@ export class StatusMessage { } else { this.timer = null; } - statusContainer.appendChild(element); + if (modal) { + const modalElementWrapper = document.createElement("div"); + const dismissModalElement = makeCloseButton({ + title: "Dismiss", + onClick: () => { + this.dismissModal(); + }, + }); + dismissModalElement.classList.add("dismiss-modal"); + dismissModalElement.addEventListener("click", () => this.dismissModal()); + modalElementWrapper.appendChild(dismissModalElement); + modalElementWrapper.appendChild(element); + this.modalElementWrapper = modalElementWrapper; + modalStatusContainer!.appendChild(modalElementWrapper); + } else { + statusContainer.appendChild(element); + } } dispose() { - statusContainer!.removeChild(this.element); + if (this.modalElementWrapper) { + modalStatusContainer!.removeChild(this.modalElementWrapper); + } else { + statusContainer!.removeChild(this.element); + } this.element = undefined; if (this.timer !== null) { clearTimeout(this.timer); } } + dismissModal() { + if (this.modalElementWrapper) { + modalStatusContainer!.removeChild(this.modalElementWrapper); + this.modalElementWrapper = undefined; + statusContainer!.appendChild(this.element); + } + } setText(text: string, makeVisible?: boolean) { this.element.textContent = text; if (makeVisible) { From fce2ac8efb0e7d1a819e9b237944760f50614e60 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Wed, 24 Jul 2024 08:38:59 -0700 Subject: [PATCH 32/45] chore(github): fix client preview deployment --- .github/workflows/deploy_docs_preview.yml | 2 +- .github/workflows/deploy_preview.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy_docs_preview.yml b/.github/workflows/deploy_docs_preview.yml index 68207e200..b1cc05051 100644 --- a/.github/workflows/deploy_docs_preview.yml +++ b/.github/workflows/deploy_docs_preview.yml @@ -46,7 +46,7 @@ jobs: repoToken: "${{ secrets.GITHUB_TOKEN }}" firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" expires: 30d - channelId: "pr${{ steps.pr-id.outputs.pr-id }}-docs" + channelId: "pr${{ steps.pr-id.outputs.pr-id }}" projectId: neuroglancer-demo target: docs - name: "Update commit status" diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index bdde334d0..4491f8f97 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -48,7 +48,7 @@ jobs: expires: 30d channelId: "pr${{ steps.pr-id.outputs.pr-id }}" projectId: neuroglancer-demo - target: docs + target: app - name: "Update commit status" uses: actions/github-script@v7 with: From ac9be08f569a19b83c6097a583318a2c0c30f7d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 08:41:28 -0700 Subject: [PATCH 33/45] chore(deps-dev): bump vite (#622) Bumps the npm_and_yarn group in /examples/webpack/webpack-project-source with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `vite` from 5.1.4 to 5.3.4 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.3.4/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../webpack-project-source/package-lock.json | 2589 ++++++++++++----- 1 file changed, 1927 insertions(+), 662 deletions(-) diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index c1a47c237..307be7727 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -23,6 +23,7 @@ } }, "../../..": { + "name": "neuroglancer", "version": "2.40.1", "license": "Apache-2.0", "dependencies": { @@ -185,672 +186,1208 @@ "node": ">=10.0.0" } }, - "../../../node_modules/@esbuild/linux-x64": { - "version": "0.20.1", + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=12" } }, - "../../../node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "../../../node_modules/@eslint-community/regexpp": { - "version": "4.10.0", + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "../../../node_modules/@eslint/eslintrc": { - "version": "2.1.4", + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=12" } }, - "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "../../../node_modules/@eslint/js": { - "version": "8.56.0", + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" } }, - "../../../node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "../../../node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "../../../node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "BSD-3-Clause" - }, - "../../../node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "../../../node_modules/@jest/schemas": { - "version": "29.6.3", + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "../../../node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "../../../node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "../../../node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "../../../node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "../../../node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "../../../node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "../../../node_modules/@eslint-community/regexpp": { + "version": "4.10.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "../../../node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "../../../node_modules/@eslint/eslintrc": { + "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/@one-ini/wasm": { - "version": "0.1.1", - "license": "MIT" - }, - "../../../node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "../../../node_modules/@polka/url": { - "version": "1.0.0-next.24", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@puppeteer/browsers": { - "version": "2.0.1", + "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.4.0", - "tar-fs": "3.0.5", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18" + "node": "*" } }, - "../../../node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "cpu": [ - "x64" - ], + "../../../node_modules/@eslint/js": { + "version": "8.56.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "../../../node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "../../../node_modules/@sinclair/typebox": { - "version": "0.27.8", + "../../../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } }, - "../../../node_modules/@sindresorhus/is": { - "version": "5.6.0", + "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "../../../node_modules/@szmarczak/http-timer": { - "version": "5.0.1", + "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "defer-to-connect": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=14.16" + "node": "*" } }, - "../../../node_modules/@tootallnate/once": { - "version": "1.1.2", + "../../../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "Apache-2.0", "engines": { - "node": ">= 6" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "../../../node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", + "../../../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", + "../../../node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, + "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "../../../node_modules/@types/codemirror": { - "version": "5.60.15", - "dev": true, + "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "license": "MIT", "dependencies": { - "@types/tern": "*" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", + "../../../node_modules/@jest/schemas": { + "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", + "../../../node_modules/@jest/types": { + "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@types/eslint": { - "version": "8.56.5", + "../../../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "../../../node_modules/@types/eslint-scope": { - "version": "3.7.7", + "../../../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "dev": true, "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "engines": { + "node": ">=6.0.0" } }, - "../../../node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/express": { - "version": "4.17.21", + "../../../node_modules/@jridgewell/set-array": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "engines": { + "node": ">=6.0.0" } }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", + "../../../node_modules/@jridgewell/source-map": { + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "../../../node_modules/@types/gl-matrix": { - "version": "2.4.5", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", + "../../../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-cache-semantics": { - "version": "4.0.4", + "../../../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "../../../node_modules/@types/http-errors": { + "../../../node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", + "../../../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", + "../../../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "engines": { + "node": ">= 8" } }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", + "../../../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "../../../node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, + "../../../node_modules/@one-ini/wasm": { + "version": "0.1.1", "license": "MIT" }, - "../../../node_modules/@types/json5": { - "version": "0.0.29", + "../../../node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/@polka/url": { + "version": "1.0.0-next.24", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/lodash": { - "version": "4.14.202", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/lodash-es": { - "version": "4.17.12", + "../../../node_modules/@puppeteer/browsers": { + "version": "2.0.1", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/lodash": "*" + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ] }, - "../../../node_modules/@types/node": { - "version": "20.11.20", + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } + "optional": true, + "os": [ + "android" + ] }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "os": [ + "darwin" + ] }, - "../../../node_modules/@types/pako": { - "version": "2.0.3", + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "darwin" + ] }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ] }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@sinclair/typebox": { + "version": "0.27.8", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/send": { - "version": "0.17.4", + "../../../node_modules/@sindresorhus/is": { + "version": "5.6.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", + "../../../node_modules/@szmarczak/http-timer": { + "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" } }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", + "../../../node_modules/@tootallnate/once": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" } }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", + "../../../node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/body-parser": { + "version": "1.19.5", "dev": true, "license": "MIT", "dependencies": { + "@types/connect": "*", "@types/node": "*" } }, - "../../../node_modules/@types/tern": { - "version": "0.23.9", + "../../../node_modules/@types/bonjour": { + "version": "3.5.13", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*" + "@types/node": "*" } }, - "../../../node_modules/@types/which": { - "version": "2.0.2", + "../../../node_modules/@types/codemirror": { + "version": "5.60.15", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } }, - "../../../node_modules/@types/ws": { - "version": "8.5.10", + "../../../node_modules/@types/connect": { + "version": "3.4.38", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "../../../node_modules/@types/yargs": { - "version": "17.0.32", + "../../../node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", "dev": true, "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/eslint": { + "version": "8.56.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../../../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../../../node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "../../../node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "../../../node_modules/@types/gl-matrix": { + "version": "2.4.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "../../../node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "../../../node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash-es": { + "version": "4.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "../../../node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../../../node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/pako": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/qs": { + "version": "6.9.12", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/semver": { + "version": "7.5.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "../../../node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "../../../node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "../../../node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/tern": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "../../../node_modules/@types/which": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" } }, "../../../node_modules/@types/yargs-parser": { @@ -4135,20 +4672,372 @@ "webpack": "^4.40.0 || ^5.0.0" } }, - "../../../node_modules/escalade": { - "version": "3.1.1", + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" - }, - "../../../node_modules/escape-string-regexp": { + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -5450,6 +6339,20 @@ "dev": true, "license": "ISC" }, + "../../../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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "../../../node_modules/fstream": { "version": "1.0.12", "dev": true, @@ -8703,9 +9606,10 @@ "license": "MIT" }, "../../../node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "../../../node_modules/picomatch": { "version": "2.3.1", @@ -8823,7 +9727,9 @@ "license": "MIT" }, "../../../node_modules/postcss": { - "version": "8.4.35", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -8839,11 +9745,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -9664,9 +10569,10 @@ } }, "../../../node_modules/rollup": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -9678,19 +10584,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", "fsevents": "~2.3.2" } }, @@ -10242,9 +11151,10 @@ } }, "../../../node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10815,304 +11725,656 @@ "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tar-fs": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../../../node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../../../node_modules/terminal-link": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^5.0.0", + "supports-hyperlinks": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/terser": { + "version": "5.29.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../../../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through2": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "../../../node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "../../../node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "../../../node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "../../../node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" }, "engines": { "node": ">=8" } }, - "../../../node_modules/tapable": { - "version": "2.2.1", + "../../../node_modules/traverse": { + "version": "0.3.9", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT/X11" }, - "../../../node_modules/tar-fs": { - "version": "3.0.5", + "../../../node_modules/ts-api-utils": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "engines": { + "node": ">=16" }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "../../../node_modules/tar-stream": { - "version": "3.1.7", + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" + "minimist": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "json5": "lib/cli.js" } }, - "../../../node_modules/terser": { - "version": "5.29.1", + "../../../node_modules/tslib": { + "version": "2.6.2", "dev": true, - "license": "BSD-2-Clause", + "license": "0BSD" + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" }, "bin": { - "terser": "bin/terser" + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "../../../node_modules/terser-webpack-plugin": { - "version": "5.3.10", + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "node": ">=12" } }, - "../../../node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/text-table": { - "version": "0.2.0", + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/through": { - "version": "2.3.8", + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/thunky": { - "version": "1.1.0", + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tinybench": { - "version": "2.6.0", + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tinypool": { - "version": "0.8.2", + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "../../../node_modules/tinyspy": { - "version": "2.2.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "../../../node_modules/to-regex-range": { - "version": "5.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.6" + "node": ">=12" } }, - "../../../node_modules/totalist": { - "version": "3.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "../../../node_modules/tough-cookie": { - "version": "4.1.3", + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "BSD-3-Clause", "optional": true, - "peer": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "../../../node_modules/tr46": { - "version": "2.1.0", + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.1" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "../../../node_modules/traverse": { - "version": "0.3.9", - "dev": true, - "license": "MIT/X11" - }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">=12" } }, - "../../../node_modules/tsconfig-paths": { - "version": "3.15.0", + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/tslib": { - "version": "2.6.2", + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "0BSD" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tsx": { - "version": "4.7.1", + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=12" } }, - "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" @@ -11482,13 +12744,14 @@ "license": "MIT" }, "../../../node_modules/vite": { - "version": "5.1.4", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -11557,12 +12820,13 @@ } }, "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -11572,10 +12836,11 @@ } }, "../../../node_modules/vite/node_modules/esbuild": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -11583,29 +12848,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "../../../node_modules/vitest": { From 3efc90465e702453916d2b03d472c16378848132 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 08:41:40 -0700 Subject: [PATCH 34/45] chore(deps-dev): bump vite (#623) Bumps the npm_and_yarn group in /examples/parcel/parcel-project-source with 1 update: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `vite` from 5.1.4 to 5.3.4 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.3.4/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../parcel-project-source/package-lock.json | 1893 ++++++++++++++--- 1 file changed, 1579 insertions(+), 314 deletions(-) diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index c5602104b..d48589d7e 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -18,6 +18,7 @@ } }, "../../..": { + "name": "neuroglancer", "version": "2.40.1", "license": "Apache-2.0", "dependencies": { @@ -180,6 +181,262 @@ "node": ">=10.0.0" } }, + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "../../../node_modules/@esbuild/linux-x64": { "version": "0.20.1", "cpu": [ @@ -195,6 +452,102 @@ "node": ">=12" } }, + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "../../../node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "dev": true, @@ -508,30 +861,214 @@ "node": ">=18" } }, - "../../../node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", "cpu": [ - "x64" + "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "android" + ] + }, + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" ] }, "../../../node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "../../../node_modules/@sinclair/typebox": { "version": "0.27.8", "dev": true, @@ -3940,194 +4477,546 @@ "tapable": "^2.2.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=10.13.0" + } + }, + "../../../node_modules/enquirer": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../../../node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "../../../node_modules/envinfo": { + "version": "7.11.1", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../../../node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../../../node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/esbuild": { + "version": "0.20.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "../../../node_modules/esbuild-loader": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.0", + "get-tsconfig": "^4.7.0", + "loader-utils": "^2.0.4", + "webpack-sources": "^1.4.3" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" + "node": ">=12" } }, - "../../../node_modules/entities": { - "version": "2.2.0", + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/envinfo": { - "version": "7.11.1", + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "../../../node_modules/error-ex": { - "version": "1.3.2", + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/es-abstract": { - "version": "1.22.3", + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "../../../node_modules/es-module-lexer": { - "version": "1.4.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/es-set-tostringtag": { - "version": "2.0.2", + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "../../../node_modules/es-shim-unscopables": { - "version": "1.0.2", + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/es-to-primitive": { - "version": "1.2.1", + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "../../../node_modules/esbuild": { + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "../../../node_modules/escalade": { @@ -5444,6 +6333,20 @@ "dev": true, "license": "ISC" }, + "../../../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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "../../../node_modules/fstream": { "version": "1.0.12", "dev": true, @@ -8696,11 +9599,12 @@ "version": "2.1.0", "license": "MIT" }, - "../../../node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, "../../../node_modules/picomatch": { "version": "2.3.1", "dev": true, @@ -8817,7 +9721,9 @@ "license": "MIT" }, "../../../node_modules/postcss": { - "version": "8.4.35", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -8833,11 +9739,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -9658,9 +10563,10 @@ } }, "../../../node_modules/rollup": { - "version": "4.9.6", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -9672,19 +10578,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", "fsevents": "~2.3.2" } }, @@ -10236,9 +11145,10 @@ } }, "../../../node_modules/source-map-js": { - "version": "1.0.2", + "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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10950,163 +11860,515 @@ "string_decoder": "~0.10.x" } }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "../../../node_modules/thunky": { - "version": "1.1.0", + "../../../node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "../../../node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/traverse": { + "version": "0.3.9", + "dev": true, + "license": "MIT/X11" + }, + "../../../node_modules/ts-api-utils": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../../../node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tinybench": { - "version": "2.6.0", + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tinypool": { - "version": "0.8.2", + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "../../../node_modules/tinyspy": { - "version": "2.2.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "../../../node_modules/to-regex-range": { - "version": "5.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.6" + "node": ">=12" } }, - "../../../node_modules/totalist": { - "version": "3.0.1", + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "../../../node_modules/tough-cookie": { - "version": "4.1.3", + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "BSD-3-Clause", "optional": true, - "peer": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "../../../node_modules/tr46": { - "version": "2.1.0", + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", "optional": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.1" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "../../../node_modules/traverse": { - "version": "0.3.9", - "dev": true, - "license": "MIT/X11" - }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">=12" } }, - "../../../node_modules/tsconfig-paths": { - "version": "3.15.0", + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "../../../node_modules/tslib": { - "version": "2.6.2", + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "0BSD" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "../../../node_modules/tsx": { - "version": "4.7.1", + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=12" } }, - "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" @@ -11476,13 +12738,14 @@ "license": "MIT" }, "../../../node_modules/vite": { - "version": "5.1.4", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -11551,12 +12814,13 @@ } }, "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -11566,10 +12830,11 @@ } }, "../../../node_modules/vite/node_modules/esbuild": { - "version": "0.19.12", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -11577,29 +12842,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "../../../node_modules/vitest": { From 7501e014abb37dbe7b3929c50ba497035e95f1c2 Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 09:20:35 -0400 Subject: [PATCH 35/45] Merge upstream, include GitHub Actions to deploy PRs to staging environment --- .github/workflows/deploy_preview.yml | 160 +++++++++++++++++++++------ .gitignore | 3 + 2 files changed, 129 insertions(+), 34 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 4491f8f97..56800cd9a 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -1,67 +1,159 @@ -name: Deploy preview +name: Deploy Preview +# Trigger the workflow manually on: - workflow_run: - workflows: ["Build preview"] - types: [completed] + workflow_dispatch: + inputs: + pr_id: + description: 'Pull Request ID' + required: false + default: 'manual' + type: string + commit_sha: + description: 'Commit SHA to Deploy' + required: true + type: string jobs: deploy: runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: - - name: "Create commit status" + # 1. Create a Pending Commit Status + - name: "Create commit status - Pending" uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const commitId = "${{ github.event.workflow_run.head_commit.id }}"; + const commitId = "${{ github.event.inputs.commit_sha }}"; + const prId = "${{ github.event.inputs.pr_id }}"; await github.rest.repos.createCommitStatus({ context: "client-preview", owner: context.repo.owner, repo: context.repo.repo, sha: commitId, state: "pending", - description: `Creating preview`, - target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, + description: prId === 'manual' + ? `Creating manual preview` + : `Creating preview for PR #${prId}`, + target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.run_id}`, }); - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + + # 2. Checkout the Specific Commit + - name: Checkout repository at specific commit + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha }} + + # 3. Download the Build Artifact + - name: Download build artifact + uses: actions/download-artifact@v4 with: name: client path: dist/client - github-token: "${{ secrets.GITHUB_TOKEN }}" - run-id: "${{ github.event.workflow_run.id }}" - - name: Get PR ID - # https://github.com/orgs/community/discussions/25220#discussioncomment-7532132 - id: pr-id - run: | - PR_ID=$(gh run view -R ${{ github.repository }} ${{ github.event.workflow_run.id }} | grep -oP '#[0-9]+ . ${{ github.event.workflow_run.id }}' | grep -oP '#[0-9]+' | cut -c 2-) - echo "pr-id=${PR_ID}" >> $GITHUB_OUTPUT - env: - GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - - uses: FirebaseExtended/action-hosting-deploy@v0 - id: deploy + run-id: ${{ github.event.inputs.commit_sha }} # Ensure this aligns with how artifacts are stored + + # 4. Configure AWS Credentials + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v1 with: - repoToken: "${{ secrets.GITHUB_TOKEN }}" - firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" - expires: 30d - channelId: "pr${{ steps.pr-id.outputs.pr-id }}" - projectId: neuroglancer-demo - target: app - - name: "Update commit status" + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-2 # Update if your region is different + + # 5. Upload to S3 Using the Secret + - name: Upload to S3 + run: | + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ github.event.inputs.pr_id }}/ + + # 6. Update Commit Status to Success + - name: "Update commit status - Success" uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const expires = new Date("${{ steps.deploy.outputs.expire_time }}"); - const commitId = "${{ github.event.workflow_run.head_commit.id }}"; + const commitId = "${{ github.event.inputs.commit_sha }}"; + const prId = "${{ github.event.inputs.pr_id }}"; + const targetUrl = prId === 'manual' + ? `https://your-cloudfront-domain.com/manual` // Replace with your actual CloudFront URL for manual deployments + : `https://your-cloudfront-domain.com/pr${prId}`; // Replace with your actual CloudFront URL for PR previews + const description = prId === 'manual' + ? `Preview deployed to S3: ${targetUrl}` + : `Preview deployed to S3: ${targetUrl}`; await github.rest.repos.createCommitStatus({ context: "client-preview", owner: context.repo.owner, repo: context.repo.repo, sha: commitId, state: "success", - target_url: "${{ steps.deploy.outputs.details_url }}", - description: `Preview created, expires at: ${expires.toISOString()}`, + target_url: targetUrl, + description: description, }); + +#name: Deploy preview +# +#on: +# workflow_run: +# workflows: ["Build preview"] +# types: [completed] +# +#jobs: +# deploy: +# runs-on: ubuntu-latest +# if: ${{ github.event.workflow_run.conclusion == 'success' }} +# steps: +# - name: "Create commit status" +# uses: actions/github-script@v7 +# with: +# github-token: ${{ secrets.GITHUB_TOKEN }} +# script: | +# const commitId = "${{ github.event.workflow_run.head_commit.id }}"; +# await github.rest.repos.createCommitStatus({ +# context: "client-preview", +# owner: context.repo.owner, +# repo: context.repo.repo, +# sha: commitId, +# state: "pending", +# description: `Creating preview`, +# target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, +# }); +# - uses: actions/checkout@v4 +# - uses: actions/download-artifact@v4 +# with: +# name: client +# path: dist/client +# github-token: "${{ secrets.GITHUB_TOKEN }}" +# run-id: "${{ github.event.workflow_run.id }}" +# - name: Get PR ID +# # https://github.com/orgs/community/discussions/25220#discussioncomment-7532132 +# id: pr-id +# run: | +# PR_ID=$(gh run view -R ${{ github.repository }} ${{ github.event.workflow_run.id }} | grep -oP '#[0-9]+ . ${{ github.event.workflow_run.id }}' | grep -oP '#[0-9]+' | cut -c 2-) +# echo "pr-id=${PR_ID}" >> $GITHUB_OUTPUT +# env: +# GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" +# - uses: FirebaseExtended/action-hosting-deploy@v0 +# id: deploy +# with: +# repoToken: "${{ secrets.GITHUB_TOKEN }}" +# firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" +# expires: 30d +# channelId: "pr${{ steps.pr-id.outputs.pr-id }}" +# projectId: neuroglancer-demo +# target: app +# - name: "Update commit status" +# uses: actions/github-script@v7 +# with: +# github-token: ${{ secrets.GITHUB_TOKEN }} +# script: | +# const expires = new Date("${{ steps.deploy.outputs.expire_time }}"); +# const commitId = "${{ github.event.workflow_run.head_commit.id }}"; +# await github.rest.repos.createCommitStatus({ +# context: "client-preview", +# owner: context.repo.owner, +# repo: context.repo.repo, +# sha: commitId, +# state: "success", +# target_url: "${{ steps.deploy.outputs.details_url }}", +# description: `Preview created, expires at: ${expires.toISOString()}`, +# }); diff --git a/.gitignore b/.gitignore index b07078cb6..5bcb7a3af 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ tsconfig.tsbuildinfo .eslintcache /lib /.firebase +.idea/ +yarn.lock +.DS_Store From 4b60c026de23325298d1a29aad3243031d86bd2f Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 09:23:09 -0400 Subject: [PATCH 36/45] Invoke push --- .github/workflows/deploy_preview.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 56800cd9a..00e28eb01 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -2,6 +2,9 @@ name: Deploy Preview # Trigger the workflow manually on: + push: + branches: + - ak-merge-upstream workflow_dispatch: inputs: pr_id: @@ -11,7 +14,8 @@ on: type: string commit_sha: description: 'Commit SHA to Deploy' - required: true + required: false + default: '' type: string jobs: From c6e657e8d8815d270fd6e8134ac11b430cd22ac9 Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 09:25:40 -0400 Subject: [PATCH 37/45] Revise http error --- .github/workflows/deploy_preview.yml | 120 ++++++++------------------- 1 file changed, 34 insertions(+), 86 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 00e28eb01..c3f94a4ca 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -1,6 +1,6 @@ name: Deploy Preview -# Trigger the workflow manually +# Trigger the workflow on push to ak-merge-upstream and via manual dispatch on: push: branches: @@ -23,14 +23,32 @@ jobs: runs-on: ubuntu-latest steps: - # 1. Create a Pending Commit Status + # 1. Set Deployment Variables + - name: "Set Deployment Variables" + id: vars + run: | + pr_id="${{ github.event.inputs.pr_id }}" + pr_id=${pr_id:-manual} + commit_sha="${{ github.event.inputs.commit_sha }}" + commit_sha=${commit_sha:-$GITHUB_SHA} + echo "pr_id=${pr_id}" >> $GITHUB_OUTPUT + echo "commit_sha=${commit_sha}" >> $GITHUB_OUTPUT + + # 2. (Optional) Debug Deployment Variables + - name: "Debug Deployment Variables" + run: | + echo "PR ID: ${{ steps.vars.outputs.pr_id }}" + echo "Commit SHA: ${{ steps.vars.outputs.commit_sha }}" + + # 3. Create a Pending Commit Status - name: "Create commit status - Pending" uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const commitId = "${{ github.event.inputs.commit_sha }}"; - const prId = "${{ github.event.inputs.pr_id }}"; + const commitId = "${{ steps.vars.outputs.commit_sha }}"; + const prId = "${{ steps.vars.outputs.pr_id }}"; + const runId = "${{ github.run_id }}"; await github.rest.repos.createCommitStatus({ context: "client-preview", owner: context.repo.owner, @@ -40,24 +58,24 @@ jobs: description: prId === 'manual' ? `Creating manual preview` : `Creating preview for PR #${prId}`, - target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.run_id}`, + target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`, }); - # 2. Checkout the Specific Commit + # 4. Checkout the Specific Commit - name: Checkout repository at specific commit uses: actions/checkout@v4 with: - ref: ${{ github.event.inputs.commit_sha }} + ref: ${{ steps.vars.outputs.commit_sha }} - # 3. Download the Build Artifact + # 5. Download the Build Artifact - name: Download build artifact uses: actions/download-artifact@v4 with: name: client path: dist/client - run-id: ${{ github.event.inputs.commit_sha }} # Ensure this aligns with how artifacts are stored + run-id: ${{ github.run_id }} # Adjust if artifacts are from a different run - # 4. Configure AWS Credentials + # 6. Configure AWS Credentials - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: @@ -65,25 +83,23 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-2 # Update if your region is different - # 5. Upload to S3 Using the Secret + # 7. Upload to S3 Using the Secret and pr_id - name: Upload to S3 run: | - aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ github.event.inputs.pr_id }}/ + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ steps.vars.outputs.pr_id }}/ - # 6. Update Commit Status to Success + # 8. Update Commit Status to Success - name: "Update commit status - Success" uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const commitId = "${{ github.event.inputs.commit_sha }}"; - const prId = "${{ github.event.inputs.pr_id }}"; + const commitId = "${{ steps.vars.outputs.commit_sha }}"; + const prId = "${{ steps.vars.outputs.pr_id }}"; const targetUrl = prId === 'manual' ? `https://your-cloudfront-domain.com/manual` // Replace with your actual CloudFront URL for manual deployments : `https://your-cloudfront-domain.com/pr${prId}`; // Replace with your actual CloudFront URL for PR previews - const description = prId === 'manual' - ? `Preview deployed to S3: ${targetUrl}` - : `Preview deployed to S3: ${targetUrl}`; + const description = `Preview deployed to S3: ${targetUrl}`; await github.rest.repos.createCommitStatus({ context: "client-preview", owner: context.repo.owner, @@ -93,71 +109,3 @@ jobs: target_url: targetUrl, description: description, }); - -#name: Deploy preview -# -#on: -# workflow_run: -# workflows: ["Build preview"] -# types: [completed] -# -#jobs: -# deploy: -# runs-on: ubuntu-latest -# if: ${{ github.event.workflow_run.conclusion == 'success' }} -# steps: -# - name: "Create commit status" -# uses: actions/github-script@v7 -# with: -# github-token: ${{ secrets.GITHUB_TOKEN }} -# script: | -# const commitId = "${{ github.event.workflow_run.head_commit.id }}"; -# await github.rest.repos.createCommitStatus({ -# context: "client-preview", -# owner: context.repo.owner, -# repo: context.repo.repo, -# sha: commitId, -# state: "pending", -# description: `Creating preview`, -# target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, -# }); -# - uses: actions/checkout@v4 -# - uses: actions/download-artifact@v4 -# with: -# name: client -# path: dist/client -# github-token: "${{ secrets.GITHUB_TOKEN }}" -# run-id: "${{ github.event.workflow_run.id }}" -# - name: Get PR ID -# # https://github.com/orgs/community/discussions/25220#discussioncomment-7532132 -# id: pr-id -# run: | -# PR_ID=$(gh run view -R ${{ github.repository }} ${{ github.event.workflow_run.id }} | grep -oP '#[0-9]+ . ${{ github.event.workflow_run.id }}' | grep -oP '#[0-9]+' | cut -c 2-) -# echo "pr-id=${PR_ID}" >> $GITHUB_OUTPUT -# env: -# GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" -# - uses: FirebaseExtended/action-hosting-deploy@v0 -# id: deploy -# with: -# repoToken: "${{ secrets.GITHUB_TOKEN }}" -# firebaseServiceAccount: "${{ secrets.FIREBASE_HOSTING_SERVICE_ACCOUNT_KEY }}" -# expires: 30d -# channelId: "pr${{ steps.pr-id.outputs.pr-id }}" -# projectId: neuroglancer-demo -# target: app -# - name: "Update commit status" -# uses: actions/github-script@v7 -# with: -# github-token: ${{ secrets.GITHUB_TOKEN }} -# script: | -# const expires = new Date("${{ steps.deploy.outputs.expire_time }}"); -# const commitId = "${{ github.event.workflow_run.head_commit.id }}"; -# await github.rest.repos.createCommitStatus({ -# context: "client-preview", -# owner: context.repo.owner, -# repo: context.repo.repo, -# sha: commitId, -# state: "success", -# target_url: "${{ steps.deploy.outputs.details_url }}", -# description: `Preview created, expires at: ${expires.toISOString()}`, -# }); From aba5cb5221fa16e93d0ce029aeb8a733ed1c125b Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 10:34:35 -0400 Subject: [PATCH 38/45] debug github actions pipeleine --- .github/workflows/deploy_preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index c3f94a4ca..bd2d3da36 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -86,7 +86,7 @@ jobs: # 7. Upload to S3 Using the Secret and pr_id - name: Upload to S3 run: | - aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ steps.vars.outputs.pr_id }}/ + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ steps.vars.outputs.pr_id }}/ --delete # 8. Update Commit Status to Success - name: "Update commit status - Success" From c0b28c352360b93bb0aaa4161442fe42a958fc84 Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 10:58:36 -0400 Subject: [PATCH 39/45] debug a bit more --- .github/workflows/deploy_preview.yml | 90 ++++++++++++++-------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index bd2d3da36..4769ca532 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -1,6 +1,5 @@ -name: Deploy Preview +name: Build and Deploy Preview -# Trigger the workflow on push to ak-merge-upstream and via manual dispatch on: push: branches: @@ -19,13 +18,19 @@ on: type: string jobs: - deploy: + build: runs-on: ubuntu-latest - + outputs: + pr_id: ${{ steps.set-vars.outputs.pr_id }} + commit_sha: ${{ steps.set-vars.outputs.commit_sha }} steps: - # 1. Set Deployment Variables - - name: "Set Deployment Variables" - id: vars + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.inputs.commit_sha || github.sha }} + + - name: Set Deployment Variables + id: set-vars run: | pr_id="${{ github.event.inputs.pr_id }}" pr_id=${pr_id:-manual} @@ -34,48 +39,44 @@ jobs: echo "pr_id=${pr_id}" >> $GITHUB_OUTPUT echo "commit_sha=${commit_sha}" >> $GITHUB_OUTPUT - # 2. (Optional) Debug Deployment Variables - - name: "Debug Deployment Variables" + - name: (Optional) Debug Deployment Variables + run: | + echo "PR ID: ${{ steps.set-vars.outputs.pr_id }}" + echo "Commit SHA: ${{ steps.set-vars.outputs.commit_sha }}" + + - name: Build Project run: | - echo "PR ID: ${{ steps.vars.outputs.pr_id }}" - echo "Commit SHA: ${{ steps.vars.outputs.commit_sha }}" + # Your build commands here + mkdir -p dist/client + echo "

Preview

" > dist/client/index.html - # 3. Create a Pending Commit Status - - name: "Create commit status - Pending" + - name: Upload Build Artifact + uses: actions/upload-artifact@v3 + with: + name: client + path: dist/client + + - name: List Uploaded Artifacts uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const commitId = "${{ steps.vars.outputs.commit_sha }}"; - const prId = "${{ steps.vars.outputs.pr_id }}"; - const runId = "${{ github.run_id }}"; - await github.rest.repos.createCommitStatus({ - context: "client-preview", - owner: context.repo.owner, - repo: context.repo.repo, - sha: commitId, - state: "pending", - description: prId === 'manual' - ? `Creating manual preview` - : `Creating preview for PR #${prId}`, - target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`, + const artifacts = await github.rest.actions.listArtifactsForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, }); + console.log("Available Artifacts:", artifacts.data.artifacts.map(a => a.name)); - # 4. Checkout the Specific Commit - - name: Checkout repository at specific commit - uses: actions/checkout@v4 - with: - ref: ${{ steps.vars.outputs.commit_sha }} - - # 5. Download the Build Artifact - - name: Download build artifact + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Download Build Artifact uses: actions/download-artifact@v4 with: name: client path: dist/client - run-id: ${{ github.run_id }} # Adjust if artifacts are from a different run - # 6. Configure AWS Credentials - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: @@ -83,22 +84,21 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-2 # Update if your region is different - # 7. Upload to S3 Using the Secret and pr_id - name: Upload to S3 run: | - aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ steps.vars.outputs.pr_id }}/ --delete + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ needs.build.outputs.pr_id }}/ --delete - # 8. Update Commit Status to Success - - name: "Update commit status - Success" + - name: Create Commit Status - Success uses: actions/github-script@v7 with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # Use PAT if GITHUB_TOKEN lacks permissions script: | - const commitId = "${{ steps.vars.outputs.commit_sha }}"; - const prId = "${{ steps.vars.outputs.pr_id }}"; + const commitId = "${{ needs.build.outputs.commit_sha }}"; + const prId = "${{ needs.build.outputs.pr_id }}"; + const runId = "${{ github.run_id }}"; const targetUrl = prId === 'manual' - ? `https://your-cloudfront-domain.com/manual` // Replace with your actual CloudFront URL for manual deployments - : `https://your-cloudfront-domain.com/pr${prId}`; // Replace with your actual CloudFront URL for PR previews + ? `https://your-cloudfront-domain.com/manual` // Replace with your actual CloudFront URL for manual deployments + : `https://your-cloudfront-domain.com/pr${prId}`; // Replace with your actual CloudFront URL for PR previews const description = `Preview deployed to S3: ${targetUrl}`; await github.rest.repos.createCommitStatus({ context: "client-preview", From 065e5e0e6031ed91674237bfc29a81e93b2d8a4a Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:13:40 -0400 Subject: [PATCH 40/45] simplify further --- .github/workflows/deploy_preview.yml | 81 +++------------------------- 1 file changed, 8 insertions(+), 73 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 4769ca532..cce36b881 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -1,4 +1,4 @@ -name: Build and Deploy Preview +name: Build and Deploy on: push: @@ -18,94 +18,29 @@ on: type: string jobs: - build: + deploy: runs-on: ubuntu-latest outputs: - pr_id: ${{ steps.set-vars.outputs.pr_id }} - commit_sha: ${{ steps.set-vars.outputs.commit_sha }} + artifact-name: ${{ steps.upload-artifact.outputs.artifact-name }} steps: - name: Checkout Repository uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.commit_sha || github.sha }} - - name: Set Deployment Variables - id: set-vars - run: | - pr_id="${{ github.event.inputs.pr_id }}" - pr_id=${pr_id:-manual} - commit_sha="${{ github.event.inputs.commit_sha }}" - commit_sha=${commit_sha:-$GITHUB_SHA} - echo "pr_id=${pr_id}" >> $GITHUB_OUTPUT - echo "commit_sha=${commit_sha}" >> $GITHUB_OUTPUT - - - name: (Optional) Debug Deployment Variables - run: | - echo "PR ID: ${{ steps.set-vars.outputs.pr_id }}" - echo "Commit SHA: ${{ steps.set-vars.outputs.commit_sha }}" - - name: Build Project run: | - # Your build commands here - mkdir -p dist/client - echo "

Preview

" > dist/client/index.html - - - name: Upload Build Artifact - uses: actions/upload-artifact@v3 - with: - name: client - path: dist/client - - - name: List Uploaded Artifacts - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const artifacts = await github.rest.actions.listArtifactsForRepo({ - owner: context.repo.owner, - repo: context.repo.repo, - }); - console.log("Available Artifacts:", artifacts.data.artifacts.map(a => a.name)); - - deploy: - needs: build - runs-on: ubuntu-latest - steps: - - name: Download Build Artifact - uses: actions/download-artifact@v4 - with: - name: client - path: dist/client + npm run build + pwd + ls - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-2 # Update if your region is different + aws-region: us-east-2 - name: Upload to S3 run: | - aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ needs.build.outputs.pr_id }}/ --delete - - - name: Create Commit Status - Success - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # Use PAT if GITHUB_TOKEN lacks permissions - script: | - const commitId = "${{ needs.build.outputs.commit_sha }}"; - const prId = "${{ needs.build.outputs.pr_id }}"; - const runId = "${{ github.run_id }}"; - const targetUrl = prId === 'manual' - ? `https://your-cloudfront-domain.com/manual` // Replace with your actual CloudFront URL for manual deployments - : `https://your-cloudfront-domain.com/pr${prId}`; // Replace with your actual CloudFront URL for PR previews - const description = `Preview deployed to S3: ${targetUrl}`; - await github.rest.repos.createCommitStatus({ - context: "client-preview", - owner: context.repo.owner, - repo: context.repo.repo, - sha: commitId, - state: "success", - target_url: targetUrl, - description: description, - }); + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ github.event.inputs.pr_id || 'manual' }}/ --delete From cc9dfe71200543da0d0494e9bb79a060131be82e Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:16:12 -0400 Subject: [PATCH 41/45] include buuidd --- .github/workflows/deploy_preview.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index cce36b881..158c96df7 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -28,11 +28,17 @@ jobs: with: ref: ${{ github.event.inputs.commit_sha || github.sha }} + - name: Install Dependencies + uses: actions/setup-node@v4 + with: + node-version: 20.x + run: npm install + - name: Build Project - run: | - npm run build - pwd - ls + uses: actions/setup-node@v4 + with: + node-version: 20.x + run: npm run build - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 From 9c99efb80f86213ef32a993191a05e29bfb0503a Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:19:35 -0400 Subject: [PATCH 42/45] Simplify --- .github/workflows/deploy_preview.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 158c96df7..410e370ec 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -28,16 +28,15 @@ jobs: with: ref: ${{ github.event.inputs.commit_sha || github.sha }} - - name: Install Dependencies + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20.x + + - name: Install Dependencies run: npm install - name: Build Project - uses: actions/setup-node@v4 - with: - node-version: 20.x run: npm run build - name: Configure AWS Credentials From 9320b270eaa97e76cb10facbe687ed4c1ab5edaf Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:35:42 -0400 Subject: [PATCH 43/45] use short sha instead --- .github/workflows/deploy_preview.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 410e370ec..f8f8b8db0 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -20,14 +20,18 @@ on: jobs: deploy: runs-on: ubuntu-latest - outputs: - artifact-name: ${{ steps.upload-artifact.outputs.artifact-name }} steps: - name: Checkout Repository uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.commit_sha || github.sha }} + - name: Set short sha name for sub-directory + id: vars + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + - name: Check outputs + run: echo ${{ steps.vars.outputs.sha_short }} + - name: Setup Node.js uses: actions/setup-node@v4 with: @@ -48,4 +52,4 @@ jobs: - name: Upload to S3 run: | - aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/pr${{ github.event.inputs.pr_id || 'manual' }}/ --delete + aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/${{ steps.vars.outputs.sha_short }}/ --delete From d49a6df15bc352e2f315f53c63493b85f9bd69af Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:41:38 -0400 Subject: [PATCH 44/45] add echo --- .github/workflows/deploy_preview.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index f8f8b8db0..1aaf7d880 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -1,21 +1,10 @@ -name: Build and Deploy +name: Build and Deploy Staging on: push: branches: - - ak-merge-upstream - workflow_dispatch: - inputs: - pr_id: - description: 'Pull Request ID' - required: false - default: 'manual' - type: string - commit_sha: - description: 'Commit SHA to Deploy' - required: false - default: '' - type: string + - staging + - '**' jobs: deploy: @@ -53,3 +42,6 @@ jobs: - name: Upload to S3 run: | aws s3 sync dist/client/ ${{ secrets.CLOUDFRONT_DEPLOYMENT_LOCATION }}/staging/${{ steps.vars.outputs.sha_short }}/ --delete + + - name: Display URL for Neuroglancer + run: echo "https://neuroglancer.lincbrain.org/cloudfront/frontend/staging/${{ steps.vars.outputs.sha_short }}/index.html" From c6a5ba3837507b00758961a398e8d2ca00ece055 Mon Sep 17 00:00:00 2001 From: Aaron Kanzer Date: Fri, 20 Sep 2024 11:57:15 -0400 Subject: [PATCH 45/45] resolve failing CI --- .github/workflows/deploy_preview.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy_preview.yml b/.github/workflows/deploy_preview.yml index 1aaf7d880..c94942e24 100644 --- a/.github/workflows/deploy_preview.yml +++ b/.github/workflows/deploy_preview.yml @@ -4,7 +4,7 @@ on: push: branches: - staging - - '**' + - "**" jobs: deploy: