From a035269f6ab894d8f064f2721e53f020a0490220 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 22 Sep 2023 13:33:27 -0400 Subject: [PATCH 01/46] big refactor --- PYTHON/nodes | 2 +- src/components/common/NodeWrapper.tsx | 5 +- src/components/nodes/ArithmeticNode.tsx | 2 +- src/components/nodes/ConditionalNode.tsx | 4 +- src/components/nodes/DataNode.tsx | 13 ++--- src/components/nodes/DefaultNode.tsx | 25 +++++---- src/components/nodes/IONode.tsx | 15 +++--- src/components/nodes/LogicNode.tsx | 17 +++--- src/components/nodes/NumpyNode.tsx | 13 ++--- src/components/nodes/ScipyNode.tsx | 14 +++-- src/components/nodes/VisorNode.tsx | 19 +++---- src/components/nodes/nodeTypesMap.ts | 2 + src/components/nodes/visual/BigNumberNode.tsx | 33 ++++++++++++ src/feature/common/types/ResultsType.ts | 5 ++ .../flow_chart_panel/FlowChartTabView.tsx | 48 +++++++++++------ .../flow_chart_panel/hooks/useNodeTypes.tsx | 54 ------------------- src/hooks/useNodeStatus.ts | 14 +++++ src/types/node.ts | 23 +------- 18 files changed, 146 insertions(+), 162 deletions(-) create mode 100644 src/components/nodes/visual/BigNumberNode.tsx delete mode 100644 src/feature/flow_chart_panel/hooks/useNodeTypes.tsx create mode 100644 src/hooks/useNodeStatus.ts diff --git a/PYTHON/nodes b/PYTHON/nodes index 05f2bf7ba..1b23f1542 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 05f2bf7bac53ab89128d12a1f961ee3218b81c3c +Subproject commit 1b23f1542c3f65ce897977ea7668e7f26d2002a0 diff --git a/src/components/common/NodeWrapper.tsx b/src/components/common/NodeWrapper.tsx index 0546056b2..7c3db6802 100644 --- a/src/components/common/NodeWrapper.tsx +++ b/src/components/common/NodeWrapper.tsx @@ -1,11 +1,10 @@ import React from "react"; -import { CustomNodeProps } from "../../types/node"; const NodeWrapper = ({ - wrapperProps: { nodeError }, + nodeError, children, }: { - wrapperProps: CustomNodeProps; + nodeError: string; children: React.ReactNode; }) => { return ( diff --git a/src/components/nodes/ArithmeticNode.tsx b/src/components/nodes/ArithmeticNode.tsx index 8c2119826..87d36b987 100644 --- a/src/components/nodes/ArithmeticNode.tsx +++ b/src/components/nodes/ArithmeticNode.tsx @@ -14,7 +14,7 @@ const ArithmeticNode = (props: CustomNodeProps) => { return (

- {operatorMap[props.nodeProps.data.func]} + {operatorMap[props.data.func]}

); diff --git a/src/components/nodes/ConditionalNode.tsx b/src/components/nodes/ConditionalNode.tsx index 59824822d..7a02d5eba 100644 --- a/src/components/nodes/ConditionalNode.tsx +++ b/src/components/nodes/ConditionalNode.tsx @@ -3,9 +3,7 @@ import { CustomNodeProps } from "@src/types/node"; import LogicNode from "./LogicNode"; export const ConditionalNode = (props: CustomNodeProps) => { - const { - nodeProps: { data }, - } = props; + const { data } = props; const operator = data.ctrls["operator_type"].value as string; return ( diff --git a/src/components/nodes/DataNode.tsx b/src/components/nodes/DataNode.tsx index a2850012e..e98289881 100644 --- a/src/components/nodes/DataNode.tsx +++ b/src/components/nodes/DataNode.tsx @@ -5,21 +5,18 @@ import NodeWrapper from "@/components/common/NodeWrapper"; import HandleComponent from "@/components/common/HandleComponent"; import { textWrap } from "@src/utils/TextWrap"; import NodeInput from "@/components/common/NodeInput"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; -const DataNode = (props: CustomNodeProps) => { - const { - nodeProps: { data }, - isRunning, - nodeError, - } = props; +const DataNode = ({ data }: CustomNodeProps) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); return ( - +
{ - const { - nodeProps: { data }, - height, - width, - isRunning = false, - nodeError = null, - children, - } = props; +const DefaultNode = ({ + data, + width, + height, + children, +}: CustomNodeProps & { + width?: number; + height?: number; + children?: React.ReactNode; +}) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); return ( - +
{ - const { - isRunning, - nodeProps: { data }, - nodeError, - } = props; - +const IONode = ({ data }: CustomNodeProps) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); + return ( - +
diff --git a/src/components/nodes/LogicNode.tsx b/src/components/nodes/LogicNode.tsx index e553ff318..df3a8ae9a 100644 --- a/src/components/nodes/LogicNode.tsx +++ b/src/components/nodes/LogicNode.tsx @@ -4,22 +4,21 @@ import { CustomNodeProps } from "@src/types/node"; import NodeWrapper from "@/components/common/NodeWrapper"; import { LogicHandleComponent } from "@/components/common/LogicHandleComponent"; import NodeInput from "@/components/common/NodeInput"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; -const LogicNode = (props: CustomNodeProps) => { - const { - isRunning, - nodeError, - nodeProps: { data }, - children, - } = props; +const LogicNode = ({ + data, + children, +}: CustomNodeProps & { children: React.ReactNode }) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); return ( - +
setIsRenamingTitle(true)} diff --git a/src/components/nodes/NumpyNode.tsx b/src/components/nodes/NumpyNode.tsx index 860ef8cac..c08060b9a 100644 --- a/src/components/nodes/NumpyNode.tsx +++ b/src/components/nodes/NumpyNode.tsx @@ -5,21 +5,18 @@ import NodeWrapper from "@/components/common/NodeWrapper"; import { NumpySvg } from "@/assets/ArithmeticSVG"; import HandleComponent from "@/components/common/HandleComponent"; import NodeInput from "@/components/common/NodeInput"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; -const NumpyNode = (props: CustomNodeProps) => { - const { - isRunning, - nodeError, - nodeProps: { data }, - } = props; +const NumpyNode = ({ data }: CustomNodeProps) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); return ( - +
setIsRenamingTitle(true)} diff --git a/src/components/nodes/ScipyNode.tsx b/src/components/nodes/ScipyNode.tsx index db82d13d3..c51a76992 100644 --- a/src/components/nodes/ScipyNode.tsx +++ b/src/components/nodes/ScipyNode.tsx @@ -5,20 +5,18 @@ import { CustomNodeProps } from "@src/types/node"; import { ScipySvg } from "@/assets/ArithmeticSVG"; import HandleComponent from "@/components/common/HandleComponent"; import NodeInput from "@/components/common/NodeInput"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; -const NumpyNode = (props: CustomNodeProps) => { - const { - nodeProps: { data }, - isRunning, - nodeError, - } = props; +const NumpyNode = ({ data }: CustomNodeProps) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); + const { nodeRunning, nodeError } = useNodeStatus(data.id); + return ( - +
setIsRenamingTitle(true)} diff --git a/src/components/nodes/VisorNode.tsx b/src/components/nodes/VisorNode.tsx index 89b47d45e..b3d8c62ac 100644 --- a/src/components/nodes/VisorNode.tsx +++ b/src/components/nodes/VisorNode.tsx @@ -26,6 +26,7 @@ import PeakFinder from "@/assets/nodes/PeakFinder"; import RegionInspector from "@/assets/nodes/RegionInspector"; import TextView from "@src/assets/nodes/TextView"; import Heatmap from "@src/assets/nodes/Heatmap"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; const chartElemMap: { [func: string]: React.JSX.Element } = { SCATTER: , @@ -49,16 +50,12 @@ const chartElemMap: { [func: string]: React.JSX.Element } = { HEATMAP: , }; -const VisorNode = (props: CustomNodeProps) => { - const { - nodeProps: { data }, - nodeError, - isRunning, - plotlyFig, - textBlob, - } = props; - +const VisorNode = ({ data }: CustomNodeProps) => { const { resolvedTheme } = useTheme(); + const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + + const plotlyFig = nodeResult?.result?.plotly_fig; + const textBlob = nodeResult?.result?.text_blob; const plotlyData = useMemo( () => @@ -67,11 +64,11 @@ const VisorNode = (props: CustomNodeProps) => { ); return ( - +
diff --git a/src/components/nodes/nodeTypesMap.ts b/src/components/nodes/nodeTypesMap.ts index 599541439..9d23323e5 100644 --- a/src/components/nodes/nodeTypesMap.ts +++ b/src/components/nodes/nodeTypesMap.ts @@ -7,6 +7,7 @@ import LogicNode from "./LogicNode"; import NumpyNode from "./NumpyNode"; import ScipyNode from "./ScipyNode"; import VisorNode from "./VisorNode"; +import BigNumberNode from "./visual/BigNumberNode"; export const nodeTypesMap = { default: DefaultNode, @@ -22,4 +23,5 @@ export const nodeTypesMap = { CONDITIONALS: ConditionalNode, SCIPY: ScipyNode, NUMPY: NumpyNode, + BIG_NUMBER: BigNumberNode, }; diff --git a/src/components/nodes/visual/BigNumberNode.tsx b/src/components/nodes/visual/BigNumberNode.tsx new file mode 100644 index 000000000..734c1eab0 --- /dev/null +++ b/src/components/nodes/visual/BigNumberNode.tsx @@ -0,0 +1,33 @@ +import BigNumber from "@src/assets/nodes/BigNumber"; +import HandleComponent from "@src/components/common/HandleComponent"; +import NodeWrapper from "@src/components/common/NodeWrapper"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; +import { CustomNodeProps } from "@src/types"; +import clsx from "clsx"; +import { memo } from "react"; + +const BigNumberNode = ({ data, selected }: CustomNodeProps) => { + const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + return ( + +
+ {nodeResult?.result?.data ? ( +

+ {nodeResult.result.data.c} +

+ ) : ( + + )} + +
+
+ ); +}; + +export default memo(BigNumberNode); diff --git a/src/feature/common/types/ResultsType.ts b/src/feature/common/types/ResultsType.ts index 1b236bbac..d4edc94eb 100644 --- a/src/feature/common/types/ResultsType.ts +++ b/src/feature/common/types/ResultsType.ts @@ -18,4 +18,9 @@ export type Result = { layout: Partial | undefined; }; text_blob?: string; + data?: ScalarData; +}; + +export type ScalarData = { + c: number; }; diff --git a/src/feature/flow_chart_panel/FlowChartTabView.tsx b/src/feature/flow_chart_panel/FlowChartTabView.tsx index 219115206..caf113d85 100644 --- a/src/feature/flow_chart_panel/FlowChartTabView.tsx +++ b/src/feature/flow_chart_panel/FlowChartTabView.tsx @@ -7,10 +7,9 @@ import { TreeNode, } from "@src/utils/ManifestLoader"; import { SmartBezierEdge } from "@tisoap/react-flow-smart-edge"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { ConnectionLineType, - EdgeTypes, MiniMap, NodeDragHandler, OnConnect, @@ -24,6 +23,7 @@ import { addEdge, applyEdgeChanges, applyNodeChanges, + NodeTypes, } from "reactflow"; import Sidebar, { LeafClickHandler } from "../common/Sidebar/Sidebar"; import FlowChartKeyboardShortcuts from "./FlowChartKeyboardShortcuts"; @@ -34,7 +34,6 @@ import { sendEventToMix } from "@src/services/MixpanelServices"; import { ACTIONS_HEIGHT, LAYOUT_TOP_HEIGHT, Layout } from "../common/Layout"; import { getEdgeTypes, isCompatibleType } from "@src/utils/TypeCheck"; import { CenterObserver } from "./components/CenterObserver"; -import useNodeTypes from "./hooks/useNodeTypes"; import { Separator } from "@src/components/ui/separator"; import { Pencil, Text, Workflow, X } from "lucide-react"; import { GalleryModal } from "@src/components/gallery/GalleryModal"; @@ -58,6 +57,37 @@ import { TooltipTrigger, } from "@/components/ui/tooltip"; import { ZodError } from "zod"; +import ArithmeticNode from "@src/components/nodes/ArithmeticNode"; +import ConditionalNode from "@src/components/nodes/ConditionalNode"; +import DataNode from "@src/components/nodes/DataNode"; +import DefaultNode from "@src/components/nodes/DefaultNode"; +import IONode from "@src/components/nodes/IONode"; +import LogicNode from "@src/components/nodes/LogicNode"; +import NumpyNode from "@src/components/nodes/NumpyNode"; +import ScipyNode from "@src/components/nodes/ScipyNode"; +import VisorNode from "@src/components/nodes/VisorNode"; +import BigNumberNode from "@src/components/nodes/visual/BigNumberNode"; + +const nodeTypes: NodeTypes = { + default: DefaultNode, + AI_ML: DataNode, + GENERATORS: DataNode, + VISUALIZERS: VisorNode, + EXTRACTORS: DefaultNode, + TRANSFORMERS: DefaultNode, + LOADERS: DefaultNode, + ARITHMETIC: ArithmeticNode, + IO: IONode, + LOGIC_GATES: LogicNode, + CONDITIONALS: ConditionalNode, + SCIPY: ScipyNode, + NUMPY: NumpyNode, + BIG_NUMBER: BigNumberNode, +}; + +const edgeTypes = { + default: SmartBezierEdge, +}; const FlowChartTab = () => { const [isGalleryOpen, setIsGalleryOpen] = useState(false); @@ -127,18 +157,6 @@ const FlowChartTab = () => { [setNodes, setEdges, setHasUnsavedChanges], ); - const edgeTypes: EdgeTypes = useMemo( - () => ({ default: SmartBezierEdge }), - [], - ); - - const nodeTypes = useNodeTypes({ - handleRemove: handleNodeRemove, - wrapperOnClick: () => { - setIsEditMode(true); - }, - }); - const onInit: OnInit = (rfIns) => { rfIns.fitView({ padding: 0.8, diff --git a/src/feature/flow_chart_panel/hooks/useNodeTypes.tsx b/src/feature/flow_chart_panel/hooks/useNodeTypes.tsx deleted file mode 100644 index 58e9f1194..000000000 --- a/src/feature/flow_chart_panel/hooks/useNodeTypes.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { useSocket } from "@src/hooks/useSocket"; -import { nodeTypesMap } from "@/components/nodes/nodeTypesMap"; -import { useMemo } from "react"; -import { NodeTypes } from "reactflow"; -import { MouseEvent } from "react"; -import TextNode from "@src/components/nodes/TextNode"; - -type UseNodeTypesProps = { - handleRemove: (nodeId: string, nodeLabel: string) => void; - wrapperOnClick: (event: MouseEvent) => void; -}; - -const useNodeTypes = ({ handleRemove }: UseNodeTypesProps) => { - const { - states: { programResults, failedNodes, runningNode }, - } = useSocket(); - - const nodeTypes: NodeTypes = useMemo( - () => ({ - ...Object.fromEntries( - Object.entries(nodeTypesMap).map(([key, CustomNode]) => { - return [ - key, - (props) => { - const nodeResult = programResults?.find( - (node) => node.id === props.data.id, - ); - return ( - - ); - }, - ]; - }), - ), - TextNode: TextNode, - }), - // Including incoming props like handleRemove and handleClickExpand in dependency list would cause - // infinite re-render, so exception for eslint eslint-disable-next-line react-hooks/exhaustive-deps is added - // to suppress eslint warning - // eslint-disable-next-line react-hooks/exhaustive-deps - [programResults, failedNodes, runningNode], - ); - - return nodeTypes; -}; - -export default useNodeTypes; diff --git a/src/hooks/useNodeStatus.ts b/src/hooks/useNodeStatus.ts new file mode 100644 index 000000000..ede3953bc --- /dev/null +++ b/src/hooks/useNodeStatus.ts @@ -0,0 +1,14 @@ +import { useSocket } from "./useSocket"; + +export const useNodeStatus = (nodeId: string) => { + // TODO: Make programResults a map instead for O(1) lookup + const { + states: { failedNodes, runningNode, programResults }, + } = useSocket(); + + return { + nodeError: failedNodes[nodeId], + nodeRunning: runningNode === nodeId, + nodeResult: programResults.find((result) => result.id === nodeId), + }; +}; diff --git a/src/types/node.ts b/src/types/node.ts index b1ac03b3f..c3fdcc750 100644 --- a/src/types/node.ts +++ b/src/types/node.ts @@ -1,7 +1,4 @@ -import { OverridePlotData } from "./plotly"; import { NodeProps } from "reactflow"; -import { Layout } from "plotly.js"; -import { MouseEvent } from "react"; type NodeElement = { name: string; @@ -66,7 +63,7 @@ export type ElementsData = { type: string; desc: string | null; }>; - selected?: boolean; + selected?: boolean; // TODO: Remove this pip_dependencies?: { name: string; v?: string; @@ -77,20 +74,4 @@ export type TextData = { text: string; }; -export interface CustomNodeProps { - nodeProps: NodeProps; - handleRemove?: (nodeId: string, nodeLabel: string) => void; - wrapperOnClick?: (event: MouseEvent) => void; - handleClickExpand?: () => void; - isRunning?: boolean; - height?: number | string; - width?: number | string; - children?: React.ReactNode; - nodeError?: string; - plotlyFig?: { - data: OverridePlotData; - layout: Partial | undefined; - }; - textBlob?: string; - theme?: "light" | "dark"; -} +export type CustomNodeProps = NodeProps; From 62502bcd1fc1bc7d48286db0731a689970fe27be Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 22 Sep 2023 14:05:03 -0400 Subject: [PATCH 02/46] basic scatter working --- package-lock.json | 20 ++++ package.json | 1 + src/components/nodes/LogicNode.tsx | 2 +- src/components/nodes/nodeTypesMap.ts | 27 ------ src/components/nodes/visual/BigNumberNode.tsx | 5 +- src/components/nodes/visual/ScatterNode.tsx | 93 +++++++++++++++++++ src/feature/common/types/ResultsType.ts | 7 +- .../flow_chart_panel/FlowChartTabView.tsx | 2 + 8 files changed, 126 insertions(+), 31 deletions(-) delete mode 100644 src/components/nodes/nodeTypesMap.ts create mode 100644 src/components/nodes/visual/ScatterNode.tsx diff --git a/package-lock.json b/package-lock.json index 632f4b497..7f51e99fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@radix-ui/react-tooltip": "^1.0.6", "@tisoap/react-flow-smart-edge": "file:bauhaus/tisoap-react-flow-smart-edge-v3.0.0.tgz", "axios": "^1.5.0", + "candygraph": "^0.10.0", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", @@ -8433,6 +8434,15 @@ "node": ">= 6" } }, + "node_modules/candygraph": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/candygraph/-/candygraph-0.10.0.tgz", + "integrity": "sha512-8jQl+fNpRzAgjg5J3jkV0CffHnCWC3atqGTkpUkGbZksNa5BFu7GpfJO4rfFRaVrjPQlbfI5ONCbI9kVIH2pQg==", + "dependencies": { + "gl-matrix": "^3.4.3", + "regl": "^2.1.0" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001538", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", @@ -12191,6 +12201,11 @@ "assert-plus": "^1.0.0" } }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -19409,6 +19424,11 @@ "jsesc": "bin/jsesc" } }, + "node_modules/regl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.0.tgz", + "integrity": "sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==" + }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", diff --git a/package.json b/package.json index afab1289d..91dc98af7 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@radix-ui/react-tooltip": "^1.0.6", "@tisoap/react-flow-smart-edge": "file:bauhaus/tisoap-react-flow-smart-edge-v3.0.0.tgz", "axios": "^1.5.0", + "candygraph": "^0.10.0", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", diff --git a/src/components/nodes/LogicNode.tsx b/src/components/nodes/LogicNode.tsx index df3a8ae9a..cd414291d 100644 --- a/src/components/nodes/LogicNode.tsx +++ b/src/components/nodes/LogicNode.tsx @@ -9,7 +9,7 @@ import { useNodeStatus } from "@src/hooks/useNodeStatus"; const LogicNode = ({ data, children, -}: CustomNodeProps & { children: React.ReactNode }) => { +}: CustomNodeProps & { children?: React.ReactNode }) => { const [isRenamingTitle, setIsRenamingTitle] = useState(false); const { nodeRunning, nodeError } = useNodeStatus(data.id); diff --git a/src/components/nodes/nodeTypesMap.ts b/src/components/nodes/nodeTypesMap.ts deleted file mode 100644 index 9d23323e5..000000000 --- a/src/components/nodes/nodeTypesMap.ts +++ /dev/null @@ -1,27 +0,0 @@ -import ArithmeticNode from "./ArithmeticNode"; -import ConditionalNode from "./ConditionalNode"; -import DataNode from "./DataNode"; -import DefaultNode from "./DefaultNode"; -import IONode from "./IONode"; -import LogicNode from "./LogicNode"; -import NumpyNode from "./NumpyNode"; -import ScipyNode from "./ScipyNode"; -import VisorNode from "./VisorNode"; -import BigNumberNode from "./visual/BigNumberNode"; - -export const nodeTypesMap = { - default: DefaultNode, - AI_ML: DataNode, - GENERATORS: DataNode, - VISUALIZERS: VisorNode, - EXTRACTORS: DefaultNode, - TRANSFORMERS: DefaultNode, - LOADERS: DefaultNode, - ARITHMETIC: ArithmeticNode, - IO: IONode, - LOGIC_GATES: LogicNode, - CONDITIONALS: ConditionalNode, - SCIPY: ScipyNode, - NUMPY: NumpyNode, - BIG_NUMBER: BigNumberNode, -}; diff --git a/src/components/nodes/visual/BigNumberNode.tsx b/src/components/nodes/visual/BigNumberNode.tsx index 734c1eab0..70c925f0e 100644 --- a/src/components/nodes/visual/BigNumberNode.tsx +++ b/src/components/nodes/visual/BigNumberNode.tsx @@ -1,6 +1,7 @@ import BigNumber from "@src/assets/nodes/BigNumber"; import HandleComponent from "@src/components/common/HandleComponent"; import NodeWrapper from "@src/components/common/NodeWrapper"; +import { ScalarData } from "@src/feature/common/types/ResultsType"; import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; @@ -9,7 +10,7 @@ import { memo } from "react"; const BigNumberNode = ({ data, selected }: CustomNodeProps) => { const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); return ( - +
{ > {nodeResult?.result?.data ? (

- {nodeResult.result.data.c} + {(nodeResult.result.data as ScalarData).c}

) : ( diff --git a/src/components/nodes/visual/ScatterNode.tsx b/src/components/nodes/visual/ScatterNode.tsx new file mode 100644 index 000000000..71551ae6a --- /dev/null +++ b/src/components/nodes/visual/ScatterNode.tsx @@ -0,0 +1,93 @@ +import HandleComponent from "@src/components/common/HandleComponent"; +import NodeWrapper from "@src/components/common/NodeWrapper"; +import { OrderedPairData } from "@src/feature/common/types/ResultsType"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; +import { CustomNodeProps } from "@src/types"; +import clsx from "clsx"; +import { memo } from "react"; +import CandyGraph, { + CartesianCoordinateSystem, + Circles, + LinearScale, +} from "candygraph"; +import Scatter from "@src/assets/nodes/Scatter"; + +const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { + const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + + if (!nodeResult?.result?.data) { + return ( + +
+ + +
+
+ ); + } + + const plotData = nodeResult.result.data as OrderedPairData; + const x = plotData.x as number[]; + const y = plotData.y as number[]; + + const cg = new CandyGraph(); + const dpr = window.devicePixelRatio; + cg.canvas.width = 360; + cg.canvas.height = 224; + const viewport = { x: 0, y: 0, width: 360, height: 224 }; + + const xscale = new LinearScale( + [Math.min(...x), Math.max(...x)], + [0, viewport.width], + ); + + const yscale = new LinearScale( + [Math.min(...y), Math.max(...y)], + [0, viewport.height], + ); + + const coords = new CartesianCoordinateSystem(cg, xscale, yscale); + + cg.clear([1, 1, 1, 1]); + + cg.render(coords, viewport, [ + new Circles(cg, x, y, { + colors: [0, 0, 1, 1], + radii: 3 * dpr, + borderWidths: 0, + }), + ]); + + cg.copyTo( + viewport, + document.getElementById(`canvas-${id}`) as HTMLCanvasElement, + ); + + return ( + +
+ + +
+
+ ); +}; + +export default memo(ScatterNode); diff --git a/src/feature/common/types/ResultsType.ts b/src/feature/common/types/ResultsType.ts index d4edc94eb..367b4fc3f 100644 --- a/src/feature/common/types/ResultsType.ts +++ b/src/feature/common/types/ResultsType.ts @@ -18,9 +18,14 @@ export type Result = { layout: Partial | undefined; }; text_blob?: string; - data?: ScalarData; + data?: ScalarData | OrderedPairData; }; export type ScalarData = { c: number; }; + +export type OrderedPairData = { + x: number[]; + y: number[]; +}; diff --git a/src/feature/flow_chart_panel/FlowChartTabView.tsx b/src/feature/flow_chart_panel/FlowChartTabView.tsx index caf113d85..f93c93325 100644 --- a/src/feature/flow_chart_panel/FlowChartTabView.tsx +++ b/src/feature/flow_chart_panel/FlowChartTabView.tsx @@ -67,6 +67,7 @@ import NumpyNode from "@src/components/nodes/NumpyNode"; import ScipyNode from "@src/components/nodes/ScipyNode"; import VisorNode from "@src/components/nodes/VisorNode"; import BigNumberNode from "@src/components/nodes/visual/BigNumberNode"; +import ScatterNode from "@src/components/nodes/visual/ScatterNode"; const nodeTypes: NodeTypes = { default: DefaultNode, @@ -83,6 +84,7 @@ const nodeTypes: NodeTypes = { SCIPY: ScipyNode, NUMPY: NumpyNode, BIG_NUMBER: BigNumberNode, + SCATTER: ScatterNode, }; const edgeTypes = { From a40cb1bad6b1d4c8717a5195c79ce240b3bee1f1 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Mon, 25 Sep 2023 15:26:20 -0400 Subject: [PATCH 03/46] basic plot working for scatter --- src/components/nodes/visual/BigNumberNode.tsx | 1 + src/components/nodes/visual/ScatterNode.tsx | 62 +++++++++++++------ src/hooks/useCandyGraph.ts | 24 +++++++ 3 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 src/hooks/useCandyGraph.ts diff --git a/src/components/nodes/visual/BigNumberNode.tsx b/src/components/nodes/visual/BigNumberNode.tsx index 70c925f0e..5f125a70e 100644 --- a/src/components/nodes/visual/BigNumberNode.tsx +++ b/src/components/nodes/visual/BigNumberNode.tsx @@ -9,6 +9,7 @@ import { memo } from "react"; const BigNumberNode = ({ data, selected }: CustomNodeProps) => { const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + return (
{ const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + const { cg, font } = useCandyGraph({ + width: viewport.width, + height: viewport.height, + }); if (!nodeResult?.result?.data) { return ( @@ -35,33 +51,43 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { const plotData = nodeResult.result.data as OrderedPairData; const x = plotData.x as number[]; const y = plotData.y as number[]; + const xMin = Math.min(...x); + const yMin = Math.min(...y); + const xMax = Math.max(...x); + const yMax = Math.max(...y); - const cg = new CandyGraph(); - const dpr = window.devicePixelRatio; - cg.canvas.width = 360; - cg.canvas.height = 224; - const viewport = { x: 0, y: 0, width: 360, height: 224 }; - - const xscale = new LinearScale( - [Math.min(...x), Math.max(...x)], - [0, viewport.width], - ); - - const yscale = new LinearScale( - [Math.min(...y), Math.max(...y)], - [0, viewport.height], - ); + const xscale = new LinearScale([xMin, xMax], [16, viewport.width - 16]); + const yscale = new LinearScale([yMin, yMax], [16, viewport.height - 16]); const coords = new CartesianCoordinateSystem(cg, xscale, yscale); - cg.clear([1, 1, 1, 1]); + cg.clear(bgColor); + + const axes = font + ? [ + new OrthoAxis(cg, coords, "x", font, { + labelSide: 1, + tickStep: Math.pow(10, Math.round(Math.log10(xMax - xMin)) - 1), + tickOffset: -2, + axisColor: [0.5, 0.5, 0.5, 1], + tickColor: [0.5, 0.5, 0.5, 1], + }), + new OrthoAxis(cg, coords, "y", font, { + tickStep: Math.pow(10, Math.round(Math.log10(yMax - yMin)) - 1), + tickOffset: 2, + axisColor: [0.5, 0.5, 0.5, 1], + tickColor: [0.5, 0.5, 0.5, 1], + }), + ] + : []; cg.render(coords, viewport, [ new Circles(cg, x, y, { - colors: [0, 0, 1, 1], + colors: accentColor, radii: 3 * dpr, borderWidths: 0, }), + ...axes, ]); cg.copyTo( diff --git a/src/hooks/useCandyGraph.ts b/src/hooks/useCandyGraph.ts new file mode 100644 index 000000000..bea756226 --- /dev/null +++ b/src/hooks/useCandyGraph.ts @@ -0,0 +1,24 @@ +import CandyGraph, { Font, createDefaultFont } from "candygraph"; +import { useEffect, useMemo, useState } from "react"; + +type UseCandyGraphArgs = { + width: number; + height: number; +}; + +export const useCandyGraph = ({ width, height }: UseCandyGraphArgs) => { + const cg = useMemo(() => { + const cg = new CandyGraph(); + cg.canvas.width = width; + cg.canvas.height = height; + return cg; + }, [width, height]); + + const [font, setFont] = useState(undefined); + useEffect(() => { + if (font) return; + createDefaultFont(cg).then((f) => setFont(f)); + }, [cg, font]); + + return { cg, font }; +}; From 9ee52dd5d4a2a96d477fb338cdb76c50ba220da5 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 26 Sep 2023 16:17:43 -0400 Subject: [PATCH 04/46] trying things --- PYTHON/nodes | 2 +- package-lock.json | 2 + package.json | 2 + src/App.tsx | 6 +++ src/feature/PlotTest.tsx | 28 ++++++++++ src/lib/plot/index.ts | 30 +++++++++++ src/lib/plot/sphere.ts | 113 +++++++++++++++++++++++++++++++++++++++ src/lib/plot/triangle.ts | 59 ++++++++++++++++++++ 8 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 src/feature/PlotTest.tsx create mode 100644 src/lib/plot/index.ts create mode 100644 src/lib/plot/sphere.ts create mode 100644 src/lib/plot/triangle.ts diff --git a/PYTHON/nodes b/PYTHON/nodes index 1b23f1542..8eb30d5bb 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 1b23f1542c3f65ce897977ea7668e7f26d2002a0 +Subproject commit 8eb30d5bb64a47105659f73de5381b259f4b023a diff --git a/package-lock.json b/package-lock.json index 7f51e99fb..666ba5e17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "express": "^4.18.2", "file-saver": "^2.0.5", + "gl-matrix": "^3.4.3", "html-to-image": "^1.11.11", "http-proxy-middleware": "^2.0.6", "immer": "^10.0.2", @@ -64,6 +65,7 @@ "react-tabs": "^6.0.2", "react-use": "^17.4.0", "reactflow": "^11.8.3", + "regl": "^2.1.0", "sonner": "^0.7.4", "tailwind-merge": "^1.14.0", "upath": "^2.0.1", diff --git a/package.json b/package.json index 91dc98af7..014c66a51 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "express": "^4.18.2", "file-saver": "^2.0.5", + "gl-matrix": "^3.4.3", "html-to-image": "^1.11.11", "http-proxy-middleware": "^2.0.6", "immer": "^10.0.2", @@ -63,6 +64,7 @@ "react-tabs": "^6.0.2", "react-use": "^17.4.0", "reactflow": "^11.8.3", + "regl": "^2.1.0", "sonner": "^0.7.4", "tailwind-merge": "^1.14.0", "upath": "^2.0.1", diff --git a/src/App.tsx b/src/App.tsx index ccb3e16bc..9971effb9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,6 +11,7 @@ import FlowChartTab from "./feature/flow_chart_panel/FlowChartTabView"; import DeviceTab from "./feature/device_panel/DeviceView"; import { ThemeProvider } from "@src/providers/themeProvider"; import ElectronLogsDialog from "./components/electron/ElectronLogsDialog"; +import { PlotTest } from "./feature/PlotTest"; function ErrorBoundary() { const error: Error = useRouteError() as Error; @@ -53,6 +54,11 @@ const App = () => { } + errorElement={} + /> + } errorElement={} /> diff --git a/src/feature/PlotTest.tsx b/src/feature/PlotTest.tsx new file mode 100644 index 000000000..0b9f9a2a1 --- /dev/null +++ b/src/feature/PlotTest.tsx @@ -0,0 +1,28 @@ +import { Plot } from "@src/lib/plot"; +import { Sphere } from "@src/lib/plot/sphere"; +import { useRef } from "react"; + +export const PlotTest = () => { + const canvas = useRef(null); + + if (canvas.current) { + const plot = new Plot({ + ref: canvas.current, + width: 800, + height: 800, + }); + + const sphere = new Sphere(plot, { + radius: 0.5, + center: [0, 0, 0], + }); + + sphere.draw(); + } + + return ( +
+ +
+ ); +}; diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts new file mode 100644 index 000000000..cfb63ae24 --- /dev/null +++ b/src/lib/plot/index.ts @@ -0,0 +1,30 @@ +import REGL from "regl"; +import { Triangle } from "./triangle"; + +export interface Drawable { + render(): void; +} + +type PlotOptions = { + width: number; + height: number; + ref: HTMLCanvasElement; +}; + +export class Plot { + private reglContext: REGL.Regl; + private width: number; + private height: number; + + constructor({ width, height, ref }: PlotOptions) { + this.reglContext = REGL(ref); + this.width = width; + this.height = height; + } + + public get regl() { + return this.reglContext; + } +} + +export { Triangle }; diff --git a/src/lib/plot/sphere.ts b/src/lib/plot/sphere.ts new file mode 100644 index 000000000..bf9630a60 --- /dev/null +++ b/src/lib/plot/sphere.ts @@ -0,0 +1,113 @@ +import REGL from "regl"; +import { Drawable, Plot } from "."; +import { mat4 } from "gl-matrix"; + +type Uniforms = { + translate: mat4; + scale: mat4; + view: mat4; + projection: mat4; +}; + +type Attributes = { + position: REGL.Vec3[]; +}; + +type SphereOptions = { + radius: number; + center: REGL.Vec3; + nSectors?: number; + nStacks?: number; +}; + +export class Sphere implements Drawable { + public readonly render: REGL.DrawCommand; + private readonly regl: REGL.Regl; + private readonly vertices: REGL.Vec3[]; + + constructor(plot: Plot, options: SphereOptions) { + const { radius, center, nSectors = 360, nStacks = 180 } = options; + + this.regl = plot.regl; + this.vertices = this.createVertices(nStacks, nSectors); + this.render = this.regl({ + frag: ` + precision mediump float; + + varying vec4 v_color; + + void main() { + gl_FragColor = v_color; + } + `, + vert: ` + precision mediump float; + + attribute vec3 position; + + uniform mat4 scale, translate, view, projection; + + varying vec4 v_color; + + void main() { + vec4 pos = vec4(position, 1); + gl_PointSize = 5.0; + gl_Position = pos; + v_color = pos; + } + `, + attributes: { + position: this.vertices, + }, + + uniforms: { + translate: mat4.translate(new Float32Array(16), mat4.create(), center), + scale: mat4.scale(new Float32Array(16), mat4.create(), [ + radius, + radius, + radius, + ]), + view: () => { + return mat4.identity(new Float32Array(16)); + }, + projection: ({ viewportWidth, viewportHeight }) => + mat4.perspective( + new Float32Array(16), + Math.PI / 4, + viewportWidth / viewportHeight, + 0.01, + 1000, + ), + }, + + count: this.vertices.length, + }); + } + + public draw() { + this.render(); + } + + private createVertices(nStacks: number, nSectors: number) { + const dPhi = Math.PI / nStacks; + const dTheta = (2 * Math.PI) / nSectors; + + const vertices: REGL.Vec3[] = []; + + for (let i = 0; i < nStacks; i++) { + const phi = i * dPhi; + + for (let j = 0; j < nSectors; j++) { + const theta = j * dTheta; + + const x = Math.sin(phi) * Math.cos(theta); + const y = Math.sin(phi) * Math.sin(theta); + const z = Math.cos(phi); + + vertices.push([x, y, z]); + } + } + + return vertices; + } +} diff --git a/src/lib/plot/triangle.ts b/src/lib/plot/triangle.ts new file mode 100644 index 000000000..c17c69e46 --- /dev/null +++ b/src/lib/plot/triangle.ts @@ -0,0 +1,59 @@ +import REGL from "regl"; +import { Drawable, Plot } from "."; + +type Uniforms = { + color: REGL.Vec4; +}; + +type Attributes = { + position: REGL.Vec2[]; +}; + +type TriangleOptions = { + vertices: REGL.Vec2[]; +}; + +export class Triangle implements Drawable { + public readonly draw: REGL.DrawCommand; + + constructor(plot: Plot, options: TriangleOptions) { + const regl = plot.regl; + this.draw = regl({ + frag: ` + precision mediump float; + uniform vec4 color; + varying vec4 v_color; + + void main() { + gl_FragColor = v_color; + } + `, + vert: ` + precision mediump float; + attribute vec2 position; + varying vec4 v_color; + + void main() { + vec4 pos = vec4(position, 0, 1); + gl_Position = pos; + v_color = pos; + } + `, + attributes: { + position: options.vertices, + }, + + uniforms: { + color: regl.prop("color"), + }, + + count: 3, + }); + } + + render() { + this.draw({ + color: [1, 0, 0, 1], + }); + } +} From 8935ad13b5dee2e15cb8d31481c49640d6bc355b Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 26 Sep 2023 17:55:05 -0400 Subject: [PATCH 05/46] trying points --- src/feature/PlotTest.tsx | 32 +++++++++++---- src/lib/plot/index.ts | 10 ++--- src/lib/plot/points.ts | 88 ++++++++++++++++++++++++++++++++++++++++ src/lib/plot/sphere.ts | 23 ++++++++--- 4 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 src/lib/plot/points.ts diff --git a/src/feature/PlotTest.tsx b/src/feature/PlotTest.tsx index 0b9f9a2a1..d528e9733 100644 --- a/src/feature/PlotTest.tsx +++ b/src/feature/PlotTest.tsx @@ -1,6 +1,14 @@ -import { Plot } from "@src/lib/plot"; -import { Sphere } from "@src/lib/plot/sphere"; +import { Plot, Points } from "@src/lib/plot"; import { useRef } from "react"; +import REGL from "regl"; + +const data: REGL.Vec3[] = Array(1000) + .fill(undefined) + .map(() => [ + Math.random() * 5 - 2.5, + Math.random() * 5 - 2.5, + Math.random() * 5 - 2.5, + ]); export const PlotTest = () => { const canvas = useRef(null); @@ -8,21 +16,27 @@ export const PlotTest = () => { if (canvas.current) { const plot = new Plot({ ref: canvas.current, - width: 800, - height: 800, + width: 300, + height: 300, }); - const sphere = new Sphere(plot, { - radius: 0.5, - center: [0, 0, 0], + const points = new Points(plot, data, { + pointSize: 3, }); - sphere.draw(); + points.draw(); + + // const sphere = new Sphere(plot, { + // radius: 0.5, + // center: [0, 0, -2], + // }); + // + // sphere.draw(); } return (
- +
); }; diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index cfb63ae24..9872421f8 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -1,5 +1,7 @@ import REGL from "regl"; import { Triangle } from "./triangle"; +import { Sphere } from "./sphere"; +import { Points } from "./points"; export interface Drawable { render(): void; @@ -13,13 +15,9 @@ type PlotOptions = { export class Plot { private reglContext: REGL.Regl; - private width: number; - private height: number; - constructor({ width, height, ref }: PlotOptions) { + constructor({ ref }: PlotOptions) { this.reglContext = REGL(ref); - this.width = width; - this.height = height; } public get regl() { @@ -27,4 +25,4 @@ export class Plot { } } -export { Triangle }; +export { Triangle, Sphere, Points }; diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts new file mode 100644 index 000000000..dd4aabffe --- /dev/null +++ b/src/lib/plot/points.ts @@ -0,0 +1,88 @@ +import REGL from "regl"; +import { Drawable, Plot } from "."; +import { mat4 } from "gl-matrix"; + +type Uniforms = { + size: number; + view: mat4; + projection: mat4; +}; + +type Attributes = { + position: REGL.Vec3[]; +}; + +type PointsOptions = { + pointSize: number; +}; + +export class Points implements Drawable { + public readonly render: REGL.DrawCommand; + private readonly regl: REGL.Regl; + private readonly points: REGL.Vec3[]; + + constructor(plot: Plot, points: REGL.Vec3[], options: PointsOptions) { + this.regl = plot.regl; + this.points = points; + + this.render = this.regl({ + frag: ` + precision mediump float; + + varying vec4 v_color; + + void main() { + gl_FragColor = v_color; + } + `, + vert: ` + precision mediump float; + + attribute vec3 position; + + uniform mat4 view, projection; + uniform float size; + + varying vec4 v_color; + + void main() { + vec4 pos = vec4(position, 1); + gl_PointSize = size; + gl_Position = projection * view * pos; + v_color = pos; + } + `, + attributes: { + position: this.points, + }, + + uniforms: { + size: options.pointSize, + view: ({ tick }) => { + const t = 0.01 * tick; + return mat4.lookAt( + new Float32Array(16), + [30 * Math.cos(t), 2.5, 30 * Math.sin(t)], + [0, 0, 0], + [0, 1, 0], + ); + }, + projection: ({ viewportWidth, viewportHeight }) => + mat4.perspective( + new Float32Array(16), + Math.PI / 4, + viewportWidth / viewportHeight, + 0.01, + 1000, + ), + }, + + count: this.points.length, + primitive: "points", + }); + } + + public draw() { + this.render(); + } +} diff --git a/src/lib/plot/sphere.ts b/src/lib/plot/sphere.ts index bf9630a60..77082a97f 100644 --- a/src/lib/plot/sphere.ts +++ b/src/lib/plot/sphere.ts @@ -5,6 +5,7 @@ import { mat4 } from "gl-matrix"; type Uniforms = { translate: mat4; scale: mat4; + rotate: mat4; view: mat4; projection: mat4; }; @@ -45,14 +46,14 @@ export class Sphere implements Drawable { attribute vec3 position; - uniform mat4 scale, translate, view, projection; + uniform mat4 rotate, scale, translate, view, projection; varying vec4 v_color; void main() { vec4 pos = vec4(position, 1); - gl_PointSize = 5.0; - gl_Position = pos; + gl_PointSize = 2.0; + gl_Position = projection * view * translate * scale * rotate * pos; v_color = pos; } `, @@ -67,9 +68,20 @@ export class Sphere implements Drawable { radius, radius, ]), - view: () => { - return mat4.identity(new Float32Array(16)); + rotate: ({ tick }) => { + const t = 0.01 * tick; + return mat4.rotate(new Float32Array(16), mat4.create(), t, [0, 1, 0]); }, + view: mat4.create(), + // view: ({ tick }) => { + // const t = 0.01 * tick; + // return mat4.lookAt( + // new Float32Array(16), + // [30 * Math.cos(t), 2.5, 30 * Math.sin(t)], + // [0, 0, 0], + // [0, 1, 0], + // ); + // }, projection: ({ viewportWidth, viewportHeight }) => mat4.perspective( new Float32Array(16), @@ -81,6 +93,7 @@ export class Sphere implements Drawable { }, count: this.vertices.length, + primitive: "points", }); } From 63be4bb5ecab5b097d13c01c450c8bf4f6ab2fcf Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 28 Sep 2023 13:55:56 -0400 Subject: [PATCH 06/46] wip --- PYTHON/nodes | 2 +- package-lock.json | 48 +++++++ package.json | 2 + src/App.tsx | 11 +- src/components/common/NodeWrapper.tsx | 5 +- src/components/nodes/visual/Scatter3DNode.tsx | 62 +++++++++ src/deps.d.ts | 2 + src/feature/PlotTest.tsx | 39 +++--- .../flow_chart_panel/FlowChartTabView.tsx | 2 + src/lib/plot/camera.ts | 126 ++++++++++++++++++ src/lib/plot/index.ts | 52 ++++++-- src/lib/plot/plane.ts | 91 +++++++++++++ src/lib/plot/points.ts | 24 +--- src/lib/plot/sphere.ts | 20 --- 14 files changed, 414 insertions(+), 72 deletions(-) create mode 100644 src/components/nodes/visual/Scatter3DNode.tsx create mode 100644 src/deps.d.ts create mode 100644 src/lib/plot/camera.ts create mode 100644 src/lib/plot/plane.ts diff --git a/PYTHON/nodes b/PYTHON/nodes index 8eb30d5bb..2e4cbb916 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 8eb30d5bb64a47105659f73de5381b259f4b023a +Subproject commit 2e4cbb916c0be3515d9d68255d9ab11d709b64d1 diff --git a/package-lock.json b/package-lock.json index 666ba5e17..742672e6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,8 @@ "localforage": "^1.10.0", "lucide-react": "^0.274.0", "mixpanel-browser": "^2.47.0", + "mouse-change": "^1.4.0", + "mouse-wheel": "^1.2.0", "plotly.js": "file:bauhaus/plotly.js-2.23.2.tgz", "rc-slider": "^10.3.0", "react": "^18.2.0", @@ -17280,6 +17282,29 @@ "node": ">=0.10.0" } }, + "node_modules/mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", + "dependencies": { + "mouse-event": "^1.0.0" + } + }, + "node_modules/mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==" + }, + "node_modules/mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", + "dependencies": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -18018,6 +18043,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -19624,6 +19654,11 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, + "node_modules/right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -20044,6 +20079,11 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==" + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -21078,6 +21118,14 @@ "node": ">=4" } }, + "node_modules/to-px": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", + "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", + "dependencies": { + "parse-unit": "^1.0.1" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 014c66a51..dfd02a3bd 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,8 @@ "localforage": "^1.10.0", "lucide-react": "^0.274.0", "mixpanel-browser": "^2.47.0", + "mouse-change": "^1.4.0", + "mouse-wheel": "^1.2.0", "plotly.js": "file:bauhaus/plotly.js-2.23.2.tgz", "rc-slider": "^10.3.0", "react": "^18.2.0", diff --git a/src/App.tsx b/src/App.tsx index 9971effb9..ac7ebdc39 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,7 +11,6 @@ import FlowChartTab from "./feature/flow_chart_panel/FlowChartTabView"; import DeviceTab from "./feature/device_panel/DeviceView"; import { ThemeProvider } from "@src/providers/themeProvider"; import ElectronLogsDialog from "./components/electron/ElectronLogsDialog"; -import { PlotTest } from "./feature/PlotTest"; function ErrorBoundary() { const error: Error = useRouteError() as Error; @@ -52,13 +51,13 @@ const App = () => { description={modalConfig.description} /> + {/* } */} + {/* errorElement={} */} + {/* /> */} } - errorElement={} - /> - } errorElement={} /> diff --git a/src/components/common/NodeWrapper.tsx b/src/components/common/NodeWrapper.tsx index 7c3db6802..5af71cd96 100644 --- a/src/components/common/NodeWrapper.tsx +++ b/src/components/common/NodeWrapper.tsx @@ -1,14 +1,17 @@ +import { cn } from "@src/lib/utils"; import React from "react"; const NodeWrapper = ({ nodeError, children, + className, }: { nodeError: string; children: React.ReactNode; + className?: string; }) => { return ( -
+
{nodeError && } {children}
diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx new file mode 100644 index 000000000..4f05a458b --- /dev/null +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -0,0 +1,62 @@ +import HandleComponent from "@src/components/common/HandleComponent"; +import NodeWrapper from "@src/components/common/NodeWrapper"; +import { useNodeStatus } from "@src/hooks/useNodeStatus"; +import { CustomNodeProps } from "@src/types"; +import clsx from "clsx"; +import { memo, useRef } from "react"; +import { OrthogonalPlane, Plot, Points } from "@src/lib/plot"; +import REGL from "regl"; + +const points: REGL.Vec3[] = Array(1000) + .fill(undefined) + .map(() => [Math.random() * 8, Math.random() * 8, Math.random() * 8]); + +const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { + const { nodeRunning, nodeError } = useNodeStatus(data.id); + + const canvas = useRef(null); + const plot = useRef(null); + + if (canvas.current && !plot.current) { + const plt = new Plot({ + ref: canvas.current, + cameraOptions: { + center: [0, 0, 0], + }, + }); + plot.current = plt; + + plt.addObject( + new Points(plt, points, { + pointSize: 5, + }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "xy", gridSize: 10 }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "xz", gridSize: 10 }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "yz", gridSize: 10 }), + ); + plt.frame(); + } + + return ( + +
+ + +
+
+ ); +}; + +export default memo(Scatter3DNode); diff --git a/src/deps.d.ts b/src/deps.d.ts new file mode 100644 index 000000000..7226f8ad8 --- /dev/null +++ b/src/deps.d.ts @@ -0,0 +1,2 @@ +declare module "mouse-change"; +declare module "mouse-wheel"; diff --git a/src/feature/PlotTest.tsx b/src/feature/PlotTest.tsx index d528e9733..17414e93a 100644 --- a/src/feature/PlotTest.tsx +++ b/src/feature/PlotTest.tsx @@ -1,4 +1,5 @@ import { Plot, Points } from "@src/lib/plot"; +import { OrthogonalPlane } from "@src/lib/plot/plane"; import { useRef } from "react"; import REGL from "regl"; @@ -12,26 +13,32 @@ const data: REGL.Vec3[] = Array(1000) export const PlotTest = () => { const canvas = useRef(null); + const plot = useRef(null); - if (canvas.current) { - const plot = new Plot({ + if (canvas.current && !plot.current) { + const plt = new Plot({ ref: canvas.current, - width: 300, - height: 300, + cameraOptions: { + center: [0, 0, 0], + }, }); + plot.current = plt; - const points = new Points(plot, data, { - pointSize: 3, - }); - - points.draw(); - - // const sphere = new Sphere(plot, { - // radius: 0.5, - // center: [0, 0, -2], - // }); - // - // sphere.draw(); + plt.addObject( + new Points(plt, data, { + pointSize: 3, + }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "xy", gridSize: 10 }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "xz", gridSize: 10 }), + ); + plt.addObject( + new OrthogonalPlane(plt, { orientation: "yz", gridSize: 10 }), + ); + plt.frame(); } return ( diff --git a/src/feature/flow_chart_panel/FlowChartTabView.tsx b/src/feature/flow_chart_panel/FlowChartTabView.tsx index f93c93325..c7e96c78b 100644 --- a/src/feature/flow_chart_panel/FlowChartTabView.tsx +++ b/src/feature/flow_chart_panel/FlowChartTabView.tsx @@ -68,6 +68,7 @@ import ScipyNode from "@src/components/nodes/ScipyNode"; import VisorNode from "@src/components/nodes/VisorNode"; import BigNumberNode from "@src/components/nodes/visual/BigNumberNode"; import ScatterNode from "@src/components/nodes/visual/ScatterNode"; +import Scatter3DNode from "@src/components/nodes/visual/Scatter3DNode"; const nodeTypes: NodeTypes = { default: DefaultNode, @@ -85,6 +86,7 @@ const nodeTypes: NodeTypes = { NUMPY: NumpyNode, BIG_NUMBER: BigNumberNode, SCATTER: ScatterNode, + SCATTER3D: Scatter3DNode, }; const edgeTypes = { diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts new file mode 100644 index 000000000..d4f3b2dbc --- /dev/null +++ b/src/lib/plot/camera.ts @@ -0,0 +1,126 @@ +import mouseChange from "mouse-change"; +import mouseWheel from "mouse-wheel"; +import { mat4 } from "gl-matrix"; +import REGL from "regl"; + +type Props = { + center: REGL.Vec3; + theta: number; + phi: number; + distance: number; + up: REGL.Vec3; + minDistance: number; + maxDistance: number; +}; + +export default function createCamera(regl: REGL.Regl, props: Partial) { + const cameraState = { + view: mat4.identity(new Float32Array(16)), + projection: mat4.identity(new Float32Array(16)), + center: new Float32Array(props.center ?? 3), + theta: props.theta ?? 0, + phi: props.phi ?? 0, + distance: Math.log(props.distance ?? 10.0), + eye: new Float32Array(3), + up: new Float32Array(props.up ?? [0, 1, 0]), + }; + + const right = new Float32Array([1, 0, 0]); + const front = new Float32Array([0, 0, 1]); + + const minDistance = Math.log(props.minDistance ?? 0.1); + const maxDistance = Math.log(props.maxDistance ?? 1000); + + let dtheta = 0; + let dphi = 0; + let ddistance = 0; + + let prevX = 0; + let prevY = 0; + + mouseChange(function (buttons: number, x: number, y: number) { + if (buttons & 1) { + const dx = (x - prevX) / window.innerWidth; + const dy = (y - prevY) / window.innerHeight; + const w = Math.max(cameraState.distance, 0.5); + + dtheta += w * dx; + dphi += w * dy; + } + prevX = x; + prevY = y; + }); + + mouseWheel((dx: number, dy: number) => { + ddistance += dy / window.innerHeight / 5; + }); + + function clamp(x: number, lo: number, hi: number) { + return Math.min(Math.max(x, lo), hi); + } + + function updateCamera() { + const center = cameraState.center; + const eye = cameraState.eye; + const up = cameraState.up; + + cameraState.theta += dtheta; + cameraState.phi = clamp( + cameraState.phi + dphi, + -Math.PI / 2.0, + Math.PI / 2.0, + ); + cameraState.distance = clamp( + cameraState.distance + ddistance, + minDistance, + maxDistance, + ); + + dtheta = 0; + dphi = 0; + ddistance = 0; + + const theta = cameraState.theta; + const phi = cameraState.phi; + const r = Math.exp(cameraState.distance); + + const vf = r * Math.sin(theta) * Math.cos(phi); + const vr = r * Math.cos(theta) * Math.cos(phi); + const vu = r * Math.sin(phi); + + for (let i = 0; i < 3; ++i) { + eye[i] = center[i] + vf * front[i] + vr * right[i] + vu * up[i]; + } + + mat4.lookAt(cameraState.view, eye, center, up); + } + + const injectContext = regl({ + context: Object.assign({}, cameraState, { + projection: function ({ viewportWidth, viewportHeight }) { + return mat4.perspective( + cameraState.projection, + Math.PI / 4.0, + viewportWidth / viewportHeight, + 0.01, + 1000.0, + ); + }, + }), + uniforms: Object.keys(cameraState).reduce((uniforms, name) => { + uniforms[name] = regl.context(name as keyof REGL.DefaultContext); + return uniforms; + }, {}), + }); + + function setupCamera(block) { + updateCamera(); + injectContext(block); + } + + Object.keys(cameraState).forEach((name) => { + setupCamera[name] = cameraState[name]; + }); + + return setupCamera; +} diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index 9872421f8..f9fecc2f8 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -2,27 +2,63 @@ import REGL from "regl"; import { Triangle } from "./triangle"; import { Sphere } from "./sphere"; import { Points } from "./points"; +import createCamera from "./camera"; +import { OrthogonalPlane } from "./plane"; export interface Drawable { render(): void; } type PlotOptions = { - width: number; - height: number; ref: HTMLCanvasElement; + cameraOptions?: { + center: REGL.Vec3; + }; }; export class Plot { - private reglContext: REGL.Regl; + public readonly regl: REGL.Regl; + private readonly camera?: (block) => void; - constructor({ ref }: PlotOptions) { - this.reglContext = REGL(ref); + private objects: Drawable[]; + + constructor({ ref, cameraOptions }: PlotOptions) { + this.regl = REGL(ref); + this.camera = cameraOptions + ? createCamera(this.regl, cameraOptions) + : undefined; + this.objects = []; + } + + public addObject(obj: Drawable) { + this.objects.push(obj); } - public get regl() { - return this.reglContext; + public draw() { + this.objects.forEach((o) => o.render()); + } + + public frame() { + if (this.camera) { + this.regl.frame(() => { + this.regl.clear({ + color: [0, 0, 0, 1], + }); + + this.camera!(() => { + this.draw(); + }); + }); + } else { + this.regl.frame(() => { + this.regl.clear({ + color: [0, 0, 0, 1], + }); + + this.draw(); + }); + } } } -export { Triangle, Sphere, Points }; +export { Triangle, Sphere, Points, OrthogonalPlane }; diff --git a/src/lib/plot/plane.ts b/src/lib/plot/plane.ts new file mode 100644 index 000000000..0ccdc6ef1 --- /dev/null +++ b/src/lib/plot/plane.ts @@ -0,0 +1,91 @@ +import REGL from "regl"; +import { Drawable, Plot } from "."; + +type Uniforms = { + color: REGL.Vec4; +}; + +type Attributes = { + position: REGL.Vec3[]; +}; + +type OrthogonalPlaneOptions = { + gridSize: number; + orientation: "xz" | "xy" | "yz"; +}; + +export class OrthogonalPlane implements Drawable { + public readonly render: REGL.DrawCommand; + private readonly regl: REGL.Regl; + private readonly vertices: REGL.Vec3[]; + + constructor(plot: Plot, options: OrthogonalPlaneOptions) { + this.regl = plot.regl; + this.vertices = this.createVertices(options); + + this.render = this.regl({ + frag: ` + precision mediump float; + + uniform vec4 color; + + void main() { + gl_FragColor = color; + } + `, + vert: ` + precision mediump float; + + attribute vec3 position; + + uniform mat4 view, projection; + + void main() { + vec4 pos = vec4(position, 1); + gl_Position = projection * view * pos; + } + `, + attributes: { + position: this.vertices, + }, + uniforms: { + color: [0.5, 0.5, 0.5, 1], + }, + count: this.vertices.length, + primitive: "lines", + }); + } + + public draw() { + this.render(); + } + + private createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices = this.createXZPlaneVertices(options); + switch (options.orientation) { + case "xz": + return vertices; + case "xy": + return vertices.map((v) => [v[0], v[2], v[1]]); + case "yz": + return vertices.map((v) => [v[1], v[0], v[2]]); + } + } + + private createXZPlaneVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices: REGL.Vec3[] = []; + const size = options.gridSize; + + for (let i = 0; i < size; i++) { + vertices.push([i, 0, 0]); + vertices.push([i, 0, size]); + } + + for (let i = 0; i < size; i++) { + vertices.push([0, 0, i]); + vertices.push([size, 0, i]); + } + + return vertices; + } +} diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts index dd4aabffe..0a28ae561 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/points.ts @@ -1,11 +1,8 @@ import REGL from "regl"; import { Drawable, Plot } from "."; -import { mat4 } from "gl-matrix"; type Uniforms = { size: number; - view: mat4; - projection: mat4; }; type Attributes = { @@ -32,6 +29,10 @@ export class Points implements Drawable { varying vec4 v_color; void main() { + vec2 coord = gl_PointCoord - vec2(0.5); + if (length(coord) > 0.5) { + discard; + } gl_FragColor = v_color; } `, @@ -58,23 +59,6 @@ export class Points implements Drawable { uniforms: { size: options.pointSize, - view: ({ tick }) => { - const t = 0.01 * tick; - return mat4.lookAt( - new Float32Array(16), - [30 * Math.cos(t), 2.5, 30 * Math.sin(t)], - [0, 0, 0], - [0, 1, 0], - ); - }, - projection: ({ viewportWidth, viewportHeight }) => - mat4.perspective( - new Float32Array(16), - Math.PI / 4, - viewportWidth / viewportHeight, - 0.01, - 1000, - ), }, count: this.points.length, diff --git a/src/lib/plot/sphere.ts b/src/lib/plot/sphere.ts index 77082a97f..f9a2723b6 100644 --- a/src/lib/plot/sphere.ts +++ b/src/lib/plot/sphere.ts @@ -6,8 +6,6 @@ type Uniforms = { translate: mat4; scale: mat4; rotate: mat4; - view: mat4; - projection: mat4; }; type Attributes = { @@ -72,24 +70,6 @@ export class Sphere implements Drawable { const t = 0.01 * tick; return mat4.rotate(new Float32Array(16), mat4.create(), t, [0, 1, 0]); }, - view: mat4.create(), - // view: ({ tick }) => { - // const t = 0.01 * tick; - // return mat4.lookAt( - // new Float32Array(16), - // [30 * Math.cos(t), 2.5, 30 * Math.sin(t)], - // [0, 0, 0], - // [0, 1, 0], - // ); - // }, - projection: ({ viewportWidth, viewportHeight }) => - mat4.perspective( - new Float32Array(16), - Math.PI / 4, - viewportWidth / viewportHeight, - 0.01, - 1000, - ), }, count: this.vertices.length, From 0b5ce5b9d6ff0ba9a1b7a12105326251a2f28ba0 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 28 Sep 2023 15:18:00 -0400 Subject: [PATCH 07/46] big refactor --- src/components/nodes/visual/Scatter3DNode.tsx | 32 +++------ .../flow_chart_panel/FlowChartTabView.tsx | 2 + src/lib/plot/camera.ts | 13 +++- src/lib/plot/index.ts | 43 ++++++------ src/lib/plot/plane.ts | 70 ++++++++----------- src/lib/plot/points.ts | 23 ++---- src/lib/plot/sphere.ts | 57 ++++++--------- src/lib/plot/triangle.ts | 27 ++----- 8 files changed, 108 insertions(+), 159 deletions(-) diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 4f05a458b..95ab98ed6 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -4,10 +4,10 @@ import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; import { memo, useRef } from "react"; -import { OrthogonalPlane, Plot, Points } from "@src/lib/plot"; +import { Plot, OrthogonalPlane, Points } from "@src/lib/plot"; import REGL from "regl"; -const points: REGL.Vec3[] = Array(1000) +const pointData: REGL.Vec3[] = Array(1000) .fill(undefined) .map(() => [Math.random() * 8, Math.random() * 8, Math.random() * 8]); @@ -18,33 +18,19 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const plot = useRef(null); if (canvas.current && !plot.current) { - const plt = new Plot({ - ref: canvas.current, - cameraOptions: { - center: [0, 0, 0], - }, - }); + const plt = new Plot(canvas.current) + .with(Points(pointData, { pointSize: 5 })) + .with(OrthogonalPlane({ orientation: "xy", gridSize: 10 })) + .with(OrthogonalPlane({ orientation: "xz", gridSize: 10 })) + .with(OrthogonalPlane({ orientation: "yz", gridSize: 10 })) + .withCamera({ center: [2.5, 2.5, 2.5] }); plot.current = plt; - plt.addObject( - new Points(plt, points, { - pointSize: 5, - }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "xy", gridSize: 10 }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "xz", gridSize: 10 }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "yz", gridSize: 10 }), - ); plt.frame(); } return ( - +
) { const cameraState = { view: mat4.identity(new Float32Array(16)), @@ -38,8 +45,8 @@ export default function createCamera(regl: REGL.Regl, props: Partial) { let prevX = 0; let prevY = 0; - mouseChange(function (buttons: number, x: number, y: number) { - if (buttons & 1) { + mouseChange((buttons: number, x: number, y: number, mods: Mods) => { + if (buttons & 1 && mods.control) { const dx = (x - prevX) / window.innerWidth; const dy = (y - prevY) / window.innerHeight; const w = Math.max(cameraState.distance, 0.5); @@ -51,7 +58,7 @@ export default function createCamera(regl: REGL.Regl, props: Partial) { prevY = y; }); - mouseWheel((dx: number, dy: number) => { + mouseWheel((dx: number, dy: number, _, ev) => { ddistance += dy / window.innerHeight / 5; }); diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index f9fecc2f8..5e7c0889e 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -1,41 +1,44 @@ import REGL from "regl"; +import createCamera from "./camera"; import { Triangle } from "./triangle"; import { Sphere } from "./sphere"; import { Points } from "./points"; -import createCamera from "./camera"; import { OrthogonalPlane } from "./plane"; -export interface Drawable { - render(): void; -} +type PlotObject = (regl: REGL.Regl) => REGL.DrawCommand; -type PlotOptions = { - ref: HTMLCanvasElement; - cameraOptions?: { - center: REGL.Vec3; - }; +type CameraOptions = { + center: REGL.Vec3; }; export class Plot { public readonly regl: REGL.Regl; - private readonly camera?: (block) => void; + private camera?: (block) => void; - private objects: Drawable[]; + private drawCommands: REGL.DrawCommand[] = []; - constructor({ ref, cameraOptions }: PlotOptions) { - this.regl = REGL(ref); - this.camera = cameraOptions - ? createCamera(this.regl, cameraOptions) - : undefined; - this.objects = []; + constructor(canvas: HTMLCanvasElement) { + this.regl = REGL(canvas); + this.camera = undefined; + this.drawCommands = []; } - public addObject(obj: Drawable) { - this.objects.push(obj); + public with(obj: PlotObject) { + this.drawCommands.push(obj(this.regl)); + + return this; + } + + public withCamera({ center }: CameraOptions) { + this.camera = createCamera(this.regl, { + center, + }); + + return this; } public draw() { - this.objects.forEach((o) => o.render()); + this.drawCommands.forEach((c) => c()); } public frame() { diff --git a/src/lib/plot/plane.ts b/src/lib/plot/plane.ts index 0ccdc6ef1..297aafc1c 100644 --- a/src/lib/plot/plane.ts +++ b/src/lib/plot/plane.ts @@ -1,5 +1,4 @@ import REGL from "regl"; -import { Drawable, Plot } from "."; type Uniforms = { color: REGL.Vec4; @@ -14,16 +13,11 @@ type OrthogonalPlaneOptions = { orientation: "xz" | "xy" | "yz"; }; -export class OrthogonalPlane implements Drawable { - public readonly render: REGL.DrawCommand; - private readonly regl: REGL.Regl; - private readonly vertices: REGL.Vec3[]; +export function OrthogonalPlane(options: OrthogonalPlaneOptions) { + const vertices = createVertices(options); - constructor(plot: Plot, options: OrthogonalPlaneOptions) { - this.regl = plot.regl; - this.vertices = this.createVertices(options); - - this.render = this.regl({ + return (regl: REGL.Regl) => + regl({ frag: ` precision mediump float; @@ -46,46 +40,42 @@ export class OrthogonalPlane implements Drawable { } `, attributes: { - position: this.vertices, + position: vertices, }, uniforms: { color: [0.5, 0.5, 0.5, 1], }, - count: this.vertices.length, + count: vertices.length, primitive: "lines", }); - } - - public draw() { - this.render(); - } +} - private createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { - const vertices = this.createXZPlaneVertices(options); - switch (options.orientation) { - case "xz": - return vertices; - case "xy": - return vertices.map((v) => [v[0], v[2], v[1]]); - case "yz": - return vertices.map((v) => [v[1], v[0], v[2]]); - } +function createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices = createXZPlaneVertices(options); + switch (options.orientation) { + case "xz": + return vertices; + case "xy": + return vertices.map((v) => [v[0], v[2], v[1]]); + case "yz": + return vertices.map((v) => [v[1], v[0], v[2]]); } +} - private createXZPlaneVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { - const vertices: REGL.Vec3[] = []; - const size = options.gridSize; - - for (let i = 0; i < size; i++) { - vertices.push([i, 0, 0]); - vertices.push([i, 0, size]); - } +function createXZPlaneVertices({ + gridSize: size, +}: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices: REGL.Vec3[] = []; - for (let i = 0; i < size; i++) { - vertices.push([0, 0, i]); - vertices.push([size, 0, i]); - } + for (let i = 0; i < size; i++) { + vertices.push([i, 0, 0]); + vertices.push([i, 0, size]); + } - return vertices; + for (let i = 0; i < size; i++) { + vertices.push([0, 0, i]); + vertices.push([size, 0, i]); } + + return vertices; } diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts index 0a28ae561..0f14ee317 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/points.ts @@ -1,5 +1,4 @@ import REGL from "regl"; -import { Drawable, Plot } from "."; type Uniforms = { size: number; @@ -13,16 +12,9 @@ type PointsOptions = { pointSize: number; }; -export class Points implements Drawable { - public readonly render: REGL.DrawCommand; - private readonly regl: REGL.Regl; - private readonly points: REGL.Vec3[]; - - constructor(plot: Plot, points: REGL.Vec3[], options: PointsOptions) { - this.regl = plot.regl; - this.points = points; - - this.render = this.regl({ +export function Points(pts: REGL.Vec3[], options: PointsOptions) { + return (regl: REGL.Regl) => + regl({ frag: ` precision mediump float; @@ -54,19 +46,14 @@ export class Points implements Drawable { } `, attributes: { - position: this.points, + position: pts, }, uniforms: { size: options.pointSize, }, - count: this.points.length, + count: pts.length, primitive: "points", }); - } - - public draw() { - this.render(); - } } diff --git a/src/lib/plot/sphere.ts b/src/lib/plot/sphere.ts index f9a2723b6..77bdb2f1e 100644 --- a/src/lib/plot/sphere.ts +++ b/src/lib/plot/sphere.ts @@ -1,5 +1,4 @@ import REGL from "regl"; -import { Drawable, Plot } from "."; import { mat4 } from "gl-matrix"; type Uniforms = { @@ -15,21 +14,16 @@ type Attributes = { type SphereOptions = { radius: number; center: REGL.Vec3; - nSectors?: number; nStacks?: number; + nSectors?: number; }; -export class Sphere implements Drawable { - public readonly render: REGL.DrawCommand; - private readonly regl: REGL.Regl; - private readonly vertices: REGL.Vec3[]; - - constructor(plot: Plot, options: SphereOptions) { - const { radius, center, nSectors = 360, nStacks = 180 } = options; +export function Sphere(options: SphereOptions) { + const { radius, center, nStacks = 180, nSectors = 360 } = options; + const vertices = createVertices(nStacks, nSectors); - this.regl = plot.regl; - this.vertices = this.createVertices(nStacks, nSectors); - this.render = this.regl({ + return (regl: REGL.Regl) => + regl({ frag: ` precision mediump float; @@ -56,7 +50,7 @@ export class Sphere implements Drawable { } `, attributes: { - position: this.vertices, + position: vertices, }, uniforms: { @@ -72,35 +66,30 @@ export class Sphere implements Drawable { }, }, - count: this.vertices.length, + count: vertices.length, primitive: "points", }); - } - - public draw() { - this.render(); - } +} - private createVertices(nStacks: number, nSectors: number) { - const dPhi = Math.PI / nStacks; - const dTheta = (2 * Math.PI) / nSectors; +function createVertices(nStacks: number, nSectors: number) { + const dPhi = Math.PI / nStacks; + const dTheta = (2 * Math.PI) / nSectors; - const vertices: REGL.Vec3[] = []; + const vertices: REGL.Vec3[] = []; - for (let i = 0; i < nStacks; i++) { - const phi = i * dPhi; + for (let i = 0; i < nStacks; i++) { + const phi = i * dPhi; - for (let j = 0; j < nSectors; j++) { - const theta = j * dTheta; + for (let j = 0; j < nSectors; j++) { + const theta = j * dTheta; - const x = Math.sin(phi) * Math.cos(theta); - const y = Math.sin(phi) * Math.sin(theta); - const z = Math.cos(phi); + const x = Math.sin(phi) * Math.cos(theta); + const y = Math.sin(phi) * Math.sin(theta); + const z = Math.cos(phi); - vertices.push([x, y, z]); - } + vertices.push([x, y, z]); } - - return vertices; } + + return vertices; } diff --git a/src/lib/plot/triangle.ts b/src/lib/plot/triangle.ts index c17c69e46..bddf7fbf9 100644 --- a/src/lib/plot/triangle.ts +++ b/src/lib/plot/triangle.ts @@ -1,24 +1,16 @@ import REGL from "regl"; -import { Drawable, Plot } from "."; type Uniforms = { color: REGL.Vec4; }; type Attributes = { - position: REGL.Vec2[]; + position: REGL.Vec3[]; }; -type TriangleOptions = { - vertices: REGL.Vec2[]; -}; - -export class Triangle implements Drawable { - public readonly draw: REGL.DrawCommand; - - constructor(plot: Plot, options: TriangleOptions) { - const regl = plot.regl; - this.draw = regl({ +export function Triangle(points: [REGL.Vec3, REGL.Vec3, REGL.Vec3]) { + return (regl: REGL.Regl) => + regl({ frag: ` precision mediump float; uniform vec4 color; @@ -40,20 +32,13 @@ export class Triangle implements Drawable { } `, attributes: { - position: options.vertices, + position: points, }, uniforms: { - color: regl.prop("color"), + color: [1, 0, 0, 1], }, count: 3, }); - } - - render() { - this.draw({ - color: [1, 0, 0, 1], - }); - } } From bf8cf9c566d988e98946c2d5b41805af6418f8bb Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 28 Sep 2023 19:42:29 -0400 Subject: [PATCH 08/46] a mess --- src/components/nodes/visual/Scatter3DNode.tsx | 82 +++++++++++++++++-- src/feature/common/types/ResultsType.ts | 6 ++ src/lib/plot/camera.ts | 2 +- src/lib/plot/index.ts | 31 ++++--- src/lib/plot/plane.ts | 72 +++++++++------- src/lib/plot/points.ts | 26 ++++-- 6 files changed, 160 insertions(+), 59 deletions(-) diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 95ab98ed6..fa6b742bd 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -3,27 +3,91 @@ import NodeWrapper from "@src/components/common/NodeWrapper"; import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; -import { memo, useRef } from "react"; +import { memo, useEffect, useRef } from "react"; import { Plot, OrthogonalPlane, Points } from "@src/lib/plot"; +// import Scatter3D from "@src/assets/nodes/3DScatter"; +// import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import REGL from "regl"; -const pointData: REGL.Vec3[] = Array(1000) - .fill(undefined) - .map(() => [Math.random() * 8, Math.random() * 8, Math.random() * 8]); +// const pointData: REGL.Vec3[] = Array(1000) +// .fill(undefined) +// .map(() => [Math.random() * 8, Math.random() * 8, Math.random() * 8]); + +// const zip = (data: { x: number[]; y: number[]; z: number[] }) => { +// const orderedTriple: REGL.Vec3[] = []; +// for (let i = 0; i < data.x.length; i++) { +// orderedTriple.push([data.x[i], data.y[i], data.z[i]]); +// } +// return orderedTriple; +// }; const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const { nodeRunning, nodeError } = useNodeStatus(data.id); const canvas = useRef(null); const plot = useRef(null); + const points = useRef(null); + const pointsLength = useRef(0); + const pointsData = useRef(null); + + useEffect(() => { + const interval = setInterval(() => { + console.log(pointsLength.current); + if (pointsData.current) { + pointsData.current.subdata( + [Math.random() * 10, Math.random() * 10, Math.random() * 10], + pointsLength.current * 3, + ); + } + pointsLength.current += 1; + }, 2000); + + return () => clearInterval(interval); + }, []); + + // useEffect(() => { + // if (points.current && nodeResult?.result?.data) { + // points.current.points = zip(nodeResult.result.data as OrderedTripleData); + // } + // }, [nodeResult?.result.data]); + // + // if (!nodeResult?.result?.data) { + // return ( + // + //
+ // + // + //
+ //
+ // ); + // } if (canvas.current && !plot.current) { - const plt = new Plot(canvas.current) - .with(Points(pointData, { pointSize: 5 })) - .with(OrthogonalPlane({ orientation: "xy", gridSize: 10 })) - .with(OrthogonalPlane({ orientation: "xz", gridSize: 10 })) - .with(OrthogonalPlane({ orientation: "yz", gridSize: 10 })) + const plt = new Plot(canvas.current); + const buf = plt.regl.buffer({ + usage: "dynamic", + type: "float", + length: 300, + }); + pointsData.current = buf; + points.current = new Points(plt.regl, { + pointSize: 5, + points: pointsData.current, + }); + + plt + .with(points.current) + .with(new OrthogonalPlane(plt.regl, { orientation: "xy", gridSize: 10 })) + .with(new OrthogonalPlane(plt.regl, { orientation: "xz", gridSize: 10 })) + .with(new OrthogonalPlane(plt.regl, { orientation: "yz", gridSize: 10 })) .withCamera({ center: [2.5, 2.5, 2.5] }); + plot.current = plt; plt.frame(); diff --git a/src/feature/common/types/ResultsType.ts b/src/feature/common/types/ResultsType.ts index 367b4fc3f..ad57e7655 100644 --- a/src/feature/common/types/ResultsType.ts +++ b/src/feature/common/types/ResultsType.ts @@ -29,3 +29,9 @@ export type OrderedPairData = { x: number[]; y: number[]; }; + +export type OrderedTripleData = { + x: number[]; + y: number[]; + z: number[]; +}; diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 75dfe285c..ff04f6e39 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -58,7 +58,7 @@ export default function createCamera(regl: REGL.Regl, props: Partial) { prevY = y; }); - mouseWheel((dx: number, dy: number, _, ev) => { + mouseWheel((dx: number, dy: number) => { ddistance += dy / window.innerHeight / 5; }); diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index 5e7c0889e..64f9d963b 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -5,7 +5,9 @@ import { Sphere } from "./sphere"; import { Points } from "./points"; import { OrthogonalPlane } from "./plane"; -type PlotObject = (regl: REGL.Regl) => REGL.DrawCommand; +export interface Drawable { + draw: REGL.DrawCommand; +} type CameraOptions = { center: REGL.Vec3; @@ -15,16 +17,16 @@ export class Plot { public readonly regl: REGL.Regl; private camera?: (block) => void; - private drawCommands: REGL.DrawCommand[] = []; + private objects: Drawable[] = []; constructor(canvas: HTMLCanvasElement) { this.regl = REGL(canvas); this.camera = undefined; - this.drawCommands = []; + this.objects = []; } - public with(obj: PlotObject) { - this.drawCommands.push(obj(this.regl)); + public with(obj: Drawable) { + this.objects.push(obj); return this; } @@ -38,7 +40,9 @@ export class Plot { } public draw() { - this.drawCommands.forEach((c) => c()); + this.objects.forEach((c) => { + c.draw(); + }); } public frame() { @@ -52,15 +56,16 @@ export class Plot { this.draw(); }); }); - } else { - this.regl.frame(() => { - this.regl.clear({ - color: [0, 0, 0, 1], - }); + return; + } - this.draw(); + this.regl.frame(() => { + this.regl.clear({ + color: [0, 0, 0, 1], }); - } + + this.draw(); + }); } } diff --git a/src/lib/plot/plane.ts b/src/lib/plot/plane.ts index 297aafc1c..a1aa89d1d 100644 --- a/src/lib/plot/plane.ts +++ b/src/lib/plot/plane.ts @@ -1,4 +1,5 @@ import REGL from "regl"; +import { Drawable } from "."; type Uniforms = { color: REGL.Vec4; @@ -13,11 +14,21 @@ type OrthogonalPlaneOptions = { orientation: "xz" | "xy" | "yz"; }; -export function OrthogonalPlane(options: OrthogonalPlaneOptions) { - const vertices = createVertices(options); +export class OrthogonalPlane implements Drawable { + private vertices: REGL.Vec3[]; + private vertexCount: number; + public draw: REGL.DrawCommand; - return (regl: REGL.Regl) => - regl({ + set points(value: REGL.Vec3[]) { + this.vertices = value; + this.vertexCount = value.length; + } + + constructor(regl: REGL.Regl, options: OrthogonalPlaneOptions) { + this.vertices = this.createVertices(options); + this.vertexCount = this.vertices.length; + + this.draw = regl({ frag: ` precision mediump float; @@ -40,42 +51,43 @@ export function OrthogonalPlane(options: OrthogonalPlaneOptions) { } `, attributes: { - position: vertices, + position: regl.this("vertices"), }, uniforms: { color: [0.5, 0.5, 0.5, 1], }, - count: vertices.length, + count: regl.this("vertexCount"), primitive: "lines", }); -} + } -function createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { - const vertices = createXZPlaneVertices(options); - switch (options.orientation) { - case "xz": - return vertices; - case "xy": - return vertices.map((v) => [v[0], v[2], v[1]]); - case "yz": - return vertices.map((v) => [v[1], v[0], v[2]]); + private createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices = this.createXZPlaneVertices(options); + switch (options.orientation) { + case "xz": + return vertices; + case "xy": + return vertices.map((v) => [v[0], v[2], v[1]]); + case "yz": + return vertices.map((v) => [v[1], v[0], v[2]]); + } } -} -function createXZPlaneVertices({ - gridSize: size, -}: OrthogonalPlaneOptions): REGL.Vec3[] { - const vertices: REGL.Vec3[] = []; + private createXZPlaneVertices({ + gridSize: size, + }: OrthogonalPlaneOptions): REGL.Vec3[] { + const vertices: REGL.Vec3[] = []; - for (let i = 0; i < size; i++) { - vertices.push([i, 0, 0]); - vertices.push([i, 0, size]); - } + for (let i = 0; i < size; i++) { + vertices.push([i, 0, 0]); + vertices.push([i, 0, size]); + } - for (let i = 0; i < size; i++) { - vertices.push([0, 0, i]); - vertices.push([size, 0, i]); - } + for (let i = 0; i < size; i++) { + vertices.push([0, 0, i]); + vertices.push([size, 0, i]); + } - return vertices; + return vertices; + } } diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts index 0f14ee317..d93ce0d92 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/points.ts @@ -1,20 +1,33 @@ import REGL from "regl"; +import { Drawable } from "."; type Uniforms = { size: number; }; type Attributes = { - position: REGL.Vec3[]; + position: REGL.Buffer; }; type PointsOptions = { + points: REGL.Buffer; pointSize: number; }; -export function Points(pts: REGL.Vec3[], options: PointsOptions) { - return (regl: REGL.Regl) => - regl({ +export class Points implements Drawable { + public vertices: REGL.Buffer; + private vertexCount: number; + public draw: REGL.DrawCommand; + + set points(value: REGL.Buffer) { + this.vertices = value; + this.vertexCount = value.length; + } + + constructor(regl: REGL.Regl, options: PointsOptions) { + this.vertices = options.points; + this.vertexCount = options.points.length; + this.draw = regl({ frag: ` precision mediump float; @@ -46,14 +59,15 @@ export function Points(pts: REGL.Vec3[], options: PointsOptions) { } `, attributes: { - position: pts, + position: regl.this("vertices"), }, uniforms: { size: options.pointSize, }, - count: pts.length, + count: regl.this("vertexCount"), primitive: "points", }); + } } From bb5af4b8cd42a86e86f05e081d088e7e1cc73f1a Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 29 Sep 2023 14:38:27 -0400 Subject: [PATCH 09/46] incremental updates --- PYTHON/nodes | 2 +- src/components/nodes/visual/Scatter3DNode.tsx | 17 +++++++++-------- src/lib/plot/index.ts | 4 ++-- src/lib/plot/plane.ts | 4 ++++ src/lib/plot/points.ts | 16 +++++++++++++--- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 2e4cbb916..a0bc9dba1 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 2e4cbb916c0be3515d9d68255d9ab11d709b64d1 +Subproject commit a0bc9dba16ee093acc0c10248dc31bb0a1be6545 diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index fa6b742bd..92fd44022 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -27,20 +27,20 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const canvas = useRef(null); const plot = useRef(null); const points = useRef(null); - const pointsLength = useRef(0); const pointsData = useRef(null); + const pointsLength = useRef(0); useEffect(() => { const interval = setInterval(() => { - console.log(pointsLength.current); - if (pointsData.current) { + if (pointsData.current && points.current) { pointsData.current.subdata( [Math.random() * 10, Math.random() * 10, Math.random() * 10], - pointsLength.current * 3, + pointsLength.current * 3 * 4, ); + pointsLength.current++; + points.current.pointCount = pointsLength.current; } - pointsLength.current += 1; - }, 2000); + }, 5); return () => clearInterval(interval); }, []); @@ -72,13 +72,14 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const plt = new Plot(canvas.current); const buf = plt.regl.buffer({ usage: "dynamic", - type: "float", - length: 300, + type: "float32", + length: 10000 * 3 * 4, }); pointsData.current = buf; points.current = new Points(plt.regl, { pointSize: 5, points: pointsData.current, + pointCount: pointsLength.current, }); plt diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index 64f9d963b..cb4c36d41 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -6,7 +6,7 @@ import { Points } from "./points"; import { OrthogonalPlane } from "./plane"; export interface Drawable { - draw: REGL.DrawCommand; + render: () => void; } type CameraOptions = { @@ -41,7 +41,7 @@ export class Plot { public draw() { this.objects.forEach((c) => { - c.draw(); + c.render(); }); } diff --git a/src/lib/plot/plane.ts b/src/lib/plot/plane.ts index a1aa89d1d..660ca166c 100644 --- a/src/lib/plot/plane.ts +++ b/src/lib/plot/plane.ts @@ -61,6 +61,10 @@ export class OrthogonalPlane implements Drawable { }); } + public render() { + this.draw(); + } + private createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { const vertices = this.createXZPlaneVertices(options); switch (options.orientation) { diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts index d93ce0d92..9041526a1 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/points.ts @@ -11,22 +11,26 @@ type Attributes = { type PointsOptions = { points: REGL.Buffer; + pointCount: number; pointSize: number; }; export class Points implements Drawable { - public vertices: REGL.Buffer; + private vertices: REGL.Buffer; private vertexCount: number; public draw: REGL.DrawCommand; set points(value: REGL.Buffer) { this.vertices = value; - this.vertexCount = value.length; + } + + set pointCount(value: number) { + this.vertexCount = value; } constructor(regl: REGL.Regl, options: PointsOptions) { this.vertices = options.points; - this.vertexCount = options.points.length; + this.vertexCount = options.pointCount; this.draw = regl({ frag: ` precision mediump float; @@ -70,4 +74,10 @@ export class Points implements Drawable { primitive: "points", }); } + + public se; + + public render() { + this.draw(); + } } From c2beb960436b87f81e089e7194ca789400994581 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Mon, 2 Oct 2023 10:22:42 -0400 Subject: [PATCH 10/46] back to stateless --- src/components/nodes/visual/Scatter3DNode.tsx | 117 +++++++++--------- src/lib/plot/plane.ts | 6 +- src/lib/plot/points.ts | 36 +++--- 3 files changed, 73 insertions(+), 86 deletions(-) diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 92fd44022..705271e7a 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -5,82 +5,77 @@ import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; import { memo, useEffect, useRef } from "react"; import { Plot, OrthogonalPlane, Points } from "@src/lib/plot"; -// import Scatter3D from "@src/assets/nodes/3DScatter"; -// import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import REGL from "regl"; +import Scatter3D from "@src/assets/nodes/3DScatter"; +import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; -// const pointData: REGL.Vec3[] = Array(1000) -// .fill(undefined) -// .map(() => [Math.random() * 8, Math.random() * 8, Math.random() * 8]); - -// const zip = (data: { x: number[]; y: number[]; z: number[] }) => { -// const orderedTriple: REGL.Vec3[] = []; -// for (let i = 0; i < data.x.length; i++) { -// orderedTriple.push([data.x[i], data.y[i], data.z[i]]); -// } -// return orderedTriple; -// }; +const zip = (data: { x: number[]; y: number[]; z: number[] }) => { + const orderedTriple: REGL.Vec3[] = []; + for (let i = 0; i < data.x.length; i++) { + orderedTriple.push([data.x[i], data.y[i], data.z[i]]); + } + return orderedTriple; +}; const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { - const { nodeRunning, nodeError } = useNodeStatus(data.id); + const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); const canvas = useRef(null); const plot = useRef(null); const points = useRef(null); - const pointsData = useRef(null); - const pointsLength = useRef(0); + const pointsData = useRef([]); + + // useEffect(() => { + // const interval = setInterval(() => { + // if (points.current !== null) { + // pointsData.current.push(randomPoint()); + // points.current.setProps({ + // points: pointsData.current, + // pointCount: pointsData.current.length, + // }); + // } + // }, 50); + // + // return () => clearInterval(interval); + // }, []); useEffect(() => { - const interval = setInterval(() => { - if (pointsData.current && points.current) { - pointsData.current.subdata( - [Math.random() * 10, Math.random() * 10, Math.random() * 10], - pointsLength.current * 3 * 4, - ); - pointsLength.current++; - points.current.pointCount = pointsLength.current; - } - }, 5); + if (points.current && nodeResult?.result?.data) { + const pts = zip(nodeResult.result.data as OrderedTripleData); - return () => clearInterval(interval); - }, []); + points.current.setProps({ points: pts, pointCount: pts.length }); + } + }, [nodeResult?.result.data]); - // useEffect(() => { - // if (points.current && nodeResult?.result?.data) { - // points.current.points = zip(nodeResult.result.data as OrderedTripleData); - // } - // }, [nodeResult?.result.data]); - // - // if (!nodeResult?.result?.data) { - // return ( - // - //
- // - // - //
- //
- // ); - // } + if (!nodeResult?.result?.data) { + return ( + +
+ + +
+
+ ); + } if (canvas.current && !plot.current) { const plt = new Plot(canvas.current); - const buf = plt.regl.buffer({ - usage: "dynamic", - type: "float32", - length: 10000 * 3 * 4, - }); - pointsData.current = buf; - points.current = new Points(plt.regl, { - pointSize: 5, - points: pointsData.current, - pointCount: pointsLength.current, - }); + points.current = new Points( + plt.regl, + { + pointSize: 5, + }, + { + points: pointsData.current, + pointCount: pointsData.current.length, + }, + ); plt .with(points.current) diff --git a/src/lib/plot/plane.ts b/src/lib/plot/plane.ts index 660ca166c..01e312b11 100644 --- a/src/lib/plot/plane.ts +++ b/src/lib/plot/plane.ts @@ -19,11 +19,6 @@ export class OrthogonalPlane implements Drawable { private vertexCount: number; public draw: REGL.DrawCommand; - set points(value: REGL.Vec3[]) { - this.vertices = value; - this.vertexCount = value.length; - } - constructor(regl: REGL.Regl, options: OrthogonalPlaneOptions) { this.vertices = this.createVertices(options); this.vertexCount = this.vertices.length; @@ -95,3 +90,4 @@ export class OrthogonalPlane implements Drawable { return vertices; } } + diff --git a/src/lib/plot/points.ts b/src/lib/plot/points.ts index 9041526a1..fd1c455cb 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/points.ts @@ -1,36 +1,29 @@ import REGL from "regl"; import { Drawable } from "."; +type Props = { + points: REGL.Vec3[]; + pointCount: number; +}; + type Uniforms = { size: number; }; type Attributes = { - position: REGL.Buffer; + position: REGL.Vec3[]; }; type PointsOptions = { - points: REGL.Buffer; - pointCount: number; pointSize: number; }; export class Points implements Drawable { - private vertices: REGL.Buffer; - private vertexCount: number; + private props: Props; public draw: REGL.DrawCommand; - set points(value: REGL.Buffer) { - this.vertices = value; - } - - set pointCount(value: number) { - this.vertexCount = value; - } - - constructor(regl: REGL.Regl, options: PointsOptions) { - this.vertices = options.points; - this.vertexCount = options.pointCount; + constructor(regl: REGL.Regl, options: PointsOptions, initialProps: Props) { + this.props = initialProps; this.draw = regl({ frag: ` precision mediump float; @@ -63,21 +56,24 @@ export class Points implements Drawable { } `, attributes: { - position: regl.this("vertices"), + position: regl.prop("points"), }, uniforms: { size: options.pointSize, }, - count: regl.this("vertexCount"), + count: regl.prop("pointCount"), primitive: "points", }); } - public se; + public setProps(props: Props) { + this.props = props; + } public render() { - this.draw(); + console.log(this.props); + this.draw(this.props); } } From 3509fa1942232e98299fb46dc4a0cfd7223c6254 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Mon, 2 Oct 2023 18:20:47 -0400 Subject: [PATCH 11/46] refactor --- src/lib/plot/camera.ts | 14 ++-- src/lib/plot/index.ts | 12 +--- src/lib/plot/primitives/index.ts | 4 ++ src/lib/plot/{ => primitives}/plane.ts | 51 +++++++------ src/lib/plot/{ => primitives}/points.ts | 23 +++--- src/lib/plot/primitives/sphere.ts | 90 +++++++++++++++++++++++ src/lib/plot/primitives/triangles.ts | 65 +++++++++++++++++ src/lib/plot/sphere.ts | 95 ------------------------- src/lib/plot/triangle.ts | 44 ------------ src/lib/plot/types.ts | 3 + src/lib/plot/utils.ts | 3 + 11 files changed, 215 insertions(+), 189 deletions(-) create mode 100644 src/lib/plot/primitives/index.ts rename src/lib/plot/{ => primitives}/plane.ts (59%) rename src/lib/plot/{ => primitives}/points.ts (73%) create mode 100644 src/lib/plot/primitives/sphere.ts create mode 100644 src/lib/plot/primitives/triangles.ts delete mode 100644 src/lib/plot/sphere.ts delete mode 100644 src/lib/plot/triangle.ts create mode 100644 src/lib/plot/types.ts create mode 100644 src/lib/plot/utils.ts diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index ff04f6e39..6fa045872 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -1,14 +1,14 @@ import mouseChange from "mouse-change"; import mouseWheel from "mouse-wheel"; import { mat4 } from "gl-matrix"; -import REGL from "regl"; +import { Vec3, Regl, DefaultContext } from "regl"; type Props = { - center: REGL.Vec3; + center: Vec3; theta: number; phi: number; distance: number; - up: REGL.Vec3; + up: Vec3; minDistance: number; maxDistance: number; }; @@ -20,7 +20,7 @@ type Mods = { meta: boolean; }; -export default function createCamera(regl: REGL.Regl, props: Partial) { +export default function createCamera(regl: Regl, props: Partial) { const cameraState = { view: mat4.identity(new Float32Array(16)), projection: mat4.identity(new Float32Array(16)), @@ -62,10 +62,6 @@ export default function createCamera(regl: REGL.Regl, props: Partial) { ddistance += dy / window.innerHeight / 5; }); - function clamp(x: number, lo: number, hi: number) { - return Math.min(Math.max(x, lo), hi); - } - function updateCamera() { const center = cameraState.center; const eye = cameraState.eye; @@ -115,7 +111,7 @@ export default function createCamera(regl: REGL.Regl, props: Partial) { }, }), uniforms: Object.keys(cameraState).reduce((uniforms, name) => { - uniforms[name] = regl.context(name as keyof REGL.DefaultContext); + uniforms[name] = regl.context(name as keyof DefaultContext); return uniforms; }, {}), }); diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index cb4c36d41..dd0e45bc8 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -1,13 +1,7 @@ import REGL from "regl"; import createCamera from "./camera"; -import { Triangle } from "./triangle"; -import { Sphere } from "./sphere"; -import { Points } from "./points"; -import { OrthogonalPlane } from "./plane"; - -export interface Drawable { - render: () => void; -} +import { Sphere, Points, OrthogonalPlane } from "./primitives"; +import { Drawable } from "./types"; type CameraOptions = { center: REGL.Vec3; @@ -41,7 +35,7 @@ export class Plot { public draw() { this.objects.forEach((c) => { - c.render(); + c.draw(); }); } diff --git a/src/lib/plot/primitives/index.ts b/src/lib/plot/primitives/index.ts new file mode 100644 index 000000000..7fa5837c5 --- /dev/null +++ b/src/lib/plot/primitives/index.ts @@ -0,0 +1,4 @@ +export { OrthogonalPlane } from "./plane"; +export { Triangles } from "./triangles"; +export { Points } from "./points"; +export { Sphere } from "./sphere"; diff --git a/src/lib/plot/plane.ts b/src/lib/plot/primitives/plane.ts similarity index 59% rename from src/lib/plot/plane.ts rename to src/lib/plot/primitives/plane.ts index 01e312b11..1d004a967 100644 --- a/src/lib/plot/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -1,12 +1,17 @@ -import REGL from "regl"; -import { Drawable } from "."; +import { DrawCommand, Regl, Vec3, Vec4 } from "regl"; +import { Drawable } from "../types"; + +type Props = { + vertices: Vec3[]; + color: Vec4; +}; type Uniforms = { - color: REGL.Vec4; + color: Vec4; }; type Attributes = { - position: REGL.Vec3[]; + position: Vec3[]; }; type OrthogonalPlaneOptions = { @@ -15,15 +20,19 @@ type OrthogonalPlaneOptions = { }; export class OrthogonalPlane implements Drawable { - private vertices: REGL.Vec3[]; - private vertexCount: number; - public draw: REGL.DrawCommand; - - constructor(regl: REGL.Regl, options: OrthogonalPlaneOptions) { + private readonly drawCommand: DrawCommand; + private readonly vertices: Vec3[]; + public color: Vec4; + + constructor( + regl: Regl, + options: OrthogonalPlaneOptions, + props: Partial>, + ) { this.vertices = this.createVertices(options); - this.vertexCount = this.vertices.length; + this.color = props.color ?? [0.5, 0.5, 0.5, 1]; - this.draw = regl({ + this.drawCommand = regl({ frag: ` precision mediump float; @@ -46,21 +55,24 @@ export class OrthogonalPlane implements Drawable { } `, attributes: { - position: regl.this("vertices"), + position: regl.prop("vertices"), }, uniforms: { - color: [0.5, 0.5, 0.5, 1], + color: regl.prop("color"), }, - count: regl.this("vertexCount"), + count: this.vertices.length, primitive: "lines", }); } - public render() { - this.draw(); + public draw() { + this.drawCommand({ + vertices: this.vertices, + color: this.color, + }); } - private createVertices(options: OrthogonalPlaneOptions): REGL.Vec3[] { + private createVertices(options: OrthogonalPlaneOptions): Vec3[] { const vertices = this.createXZPlaneVertices(options); switch (options.orientation) { case "xz": @@ -74,8 +86,8 @@ export class OrthogonalPlane implements Drawable { private createXZPlaneVertices({ gridSize: size, - }: OrthogonalPlaneOptions): REGL.Vec3[] { - const vertices: REGL.Vec3[] = []; + }: OrthogonalPlaneOptions): Vec3[] { + const vertices: Vec3[] = []; for (let i = 0; i < size; i++) { vertices.push([i, 0, 0]); @@ -90,4 +102,3 @@ export class OrthogonalPlane implements Drawable { return vertices; } } - diff --git a/src/lib/plot/points.ts b/src/lib/plot/primitives/points.ts similarity index 73% rename from src/lib/plot/points.ts rename to src/lib/plot/primitives/points.ts index fd1c455cb..9a74f5a16 100644 --- a/src/lib/plot/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -1,9 +1,9 @@ -import REGL from "regl"; -import { Drawable } from "."; +import { Vec3, Regl, DrawCommand } from "regl"; +import { Drawable } from "../types"; type Props = { - points: REGL.Vec3[]; - pointCount: number; + points: Vec3[]; + count: number; }; type Uniforms = { @@ -11,7 +11,7 @@ type Uniforms = { }; type Attributes = { - position: REGL.Vec3[]; + position: Vec3[]; }; type PointsOptions = { @@ -19,12 +19,12 @@ type PointsOptions = { }; export class Points implements Drawable { + private readonly drawCommand: DrawCommand; private props: Props; - public draw: REGL.DrawCommand; - constructor(regl: REGL.Regl, options: PointsOptions, initialProps: Props) { + constructor(regl: Regl, options: PointsOptions, initialProps: Props) { this.props = initialProps; - this.draw = regl({ + this.drawCommand = regl({ frag: ` precision mediump float; @@ -63,7 +63,7 @@ export class Points implements Drawable { size: options.pointSize, }, - count: regl.prop("pointCount"), + count: regl.prop("count"), primitive: "points", }); } @@ -72,8 +72,7 @@ export class Points implements Drawable { this.props = props; } - public render() { - console.log(this.props); - this.draw(this.props); + public draw() { + this.drawCommand(this.props); } } diff --git a/src/lib/plot/primitives/sphere.ts b/src/lib/plot/primitives/sphere.ts new file mode 100644 index 000000000..e7630f8c3 --- /dev/null +++ b/src/lib/plot/primitives/sphere.ts @@ -0,0 +1,90 @@ +import { Vec3, DrawCommand } from "regl"; +import { Drawable } from "../types"; +import { Plot } from ".."; + +type Props = { + vertices: Vec3[]; +}; + +type Attributes = { + position: Vec3[]; +}; + +type SphereOptions = { + radius: number; + center: Vec3; + nStacks?: number; + nSectors?: number; +}; + +export class Sphere implements Drawable { + private readonly drawCommand: DrawCommand; + private props: Props; + + constructor(plot: Plot, options: SphereOptions) { + this.props = { + vertices: this.createVertices(options), + }; + + this.drawCommand = plot.regl, Attributes>({ + frag: ` + precision mediump float; + + varying vec4 v_color; + + void main() { + gl_FragColor = v_color; + } + `, + vert: ` + precision mediump float; + + attribute vec3 position; + + uniform mat4 view, projection; + varying vec4 v_color; + + void main() { + vec4 pos = vec4(position, 1); + gl_PointSize = 2.0; + gl_Position = projection * view * pos; + v_color = pos; + } + `, + attributes: { + position: plot.regl.prop("vertices"), + }, + + count: this.props.vertices.length, + primitive: "points", + }); + } + + public draw() { + this.drawCommand(this.props); + } + + private createVertices(options: SphereOptions) { + const { radius, center, nStacks = 180, nSectors = 360 } = options; + const dPhi = Math.PI / nStacks; + const dTheta = (2 * Math.PI) / nSectors; + + const vertices: Vec3[] = []; + + for (let i = 0; i < nStacks; i++) { + const phi = i * dPhi; + + for (let j = 0; j < nSectors; j++) { + const theta = j * dTheta; + + const x = Math.sin(phi) * Math.cos(theta) * radius + center[0]; + const y = Math.sin(phi) * Math.sin(theta) * radius + center[1]; + const z = Math.cos(phi) * radius + center[2]; + + vertices.push([x, y, z]); + } + } + + return vertices; + } +} diff --git a/src/lib/plot/primitives/triangles.ts b/src/lib/plot/primitives/triangles.ts new file mode 100644 index 000000000..20c56410c --- /dev/null +++ b/src/lib/plot/primitives/triangles.ts @@ -0,0 +1,65 @@ +import { DrawCommand, Vec3, Vec4 } from "regl"; +import { Drawable } from "../types"; +import { Plot } from ".."; + +type Props = { + vertices: Vec3[]; + color: Vec4; + count?: number; +}; + +type Attributes = { + position: Vec3[]; +}; + +type Uniforms = { + color: Vec4; +}; + +export class Triangles implements Drawable { + private readonly drawCommand: DrawCommand; + private props: Props; + + constructor(plot: Plot, props: Props) { + this.props = props; + if (!props.count) { + this.props.count = props.vertices.length; + } + + this.drawCommand = plot.regl({ + frag: ` + precision mediump float; + uniform vec4 color; + varying vec4 v_color; + + void main() { + gl_FragColor = v_color; + } + `, + vert: ` + precision mediump float; + attribute vec2 position; + varying vec4 v_color; + + void main() { + vec4 pos = vec4(position, 0, 1); + gl_Position = pos; + v_color = pos; + } + `, + attributes: { + position: plot.regl.prop("vertices"), + }, + + uniforms: { + color: plot.regl.prop("color"), + }, + + count: plot.regl.prop("color"), + }); + } + + public draw() { + this.drawCommand(this.props); + } +} diff --git a/src/lib/plot/sphere.ts b/src/lib/plot/sphere.ts deleted file mode 100644 index 77bdb2f1e..000000000 --- a/src/lib/plot/sphere.ts +++ /dev/null @@ -1,95 +0,0 @@ -import REGL from "regl"; -import { mat4 } from "gl-matrix"; - -type Uniforms = { - translate: mat4; - scale: mat4; - rotate: mat4; -}; - -type Attributes = { - position: REGL.Vec3[]; -}; - -type SphereOptions = { - radius: number; - center: REGL.Vec3; - nStacks?: number; - nSectors?: number; -}; - -export function Sphere(options: SphereOptions) { - const { radius, center, nStacks = 180, nSectors = 360 } = options; - const vertices = createVertices(nStacks, nSectors); - - return (regl: REGL.Regl) => - regl({ - frag: ` - precision mediump float; - - varying vec4 v_color; - - void main() { - gl_FragColor = v_color; - } - `, - vert: ` - precision mediump float; - - attribute vec3 position; - - uniform mat4 rotate, scale, translate, view, projection; - - varying vec4 v_color; - - void main() { - vec4 pos = vec4(position, 1); - gl_PointSize = 2.0; - gl_Position = projection * view * translate * scale * rotate * pos; - v_color = pos; - } - `, - attributes: { - position: vertices, - }, - - uniforms: { - translate: mat4.translate(new Float32Array(16), mat4.create(), center), - scale: mat4.scale(new Float32Array(16), mat4.create(), [ - radius, - radius, - radius, - ]), - rotate: ({ tick }) => { - const t = 0.01 * tick; - return mat4.rotate(new Float32Array(16), mat4.create(), t, [0, 1, 0]); - }, - }, - - count: vertices.length, - primitive: "points", - }); -} - -function createVertices(nStacks: number, nSectors: number) { - const dPhi = Math.PI / nStacks; - const dTheta = (2 * Math.PI) / nSectors; - - const vertices: REGL.Vec3[] = []; - - for (let i = 0; i < nStacks; i++) { - const phi = i * dPhi; - - for (let j = 0; j < nSectors; j++) { - const theta = j * dTheta; - - const x = Math.sin(phi) * Math.cos(theta); - const y = Math.sin(phi) * Math.sin(theta); - const z = Math.cos(phi); - - vertices.push([x, y, z]); - } - } - - return vertices; -} diff --git a/src/lib/plot/triangle.ts b/src/lib/plot/triangle.ts deleted file mode 100644 index bddf7fbf9..000000000 --- a/src/lib/plot/triangle.ts +++ /dev/null @@ -1,44 +0,0 @@ -import REGL from "regl"; - -type Uniforms = { - color: REGL.Vec4; -}; - -type Attributes = { - position: REGL.Vec3[]; -}; - -export function Triangle(points: [REGL.Vec3, REGL.Vec3, REGL.Vec3]) { - return (regl: REGL.Regl) => - regl({ - frag: ` - precision mediump float; - uniform vec4 color; - varying vec4 v_color; - - void main() { - gl_FragColor = v_color; - } - `, - vert: ` - precision mediump float; - attribute vec2 position; - varying vec4 v_color; - - void main() { - vec4 pos = vec4(position, 0, 1); - gl_Position = pos; - v_color = pos; - } - `, - attributes: { - position: points, - }, - - uniforms: { - color: [1, 0, 0, 1], - }, - - count: 3, - }); -} diff --git a/src/lib/plot/types.ts b/src/lib/plot/types.ts new file mode 100644 index 000000000..1bd62df63 --- /dev/null +++ b/src/lib/plot/types.ts @@ -0,0 +1,3 @@ +export interface Drawable { + draw: () => void; +} diff --git a/src/lib/plot/utils.ts b/src/lib/plot/utils.ts new file mode 100644 index 000000000..0d1a10ad6 --- /dev/null +++ b/src/lib/plot/utils.ts @@ -0,0 +1,3 @@ +export function clamp(x: number, lo: number, hi: number) { + return Math.min(Math.max(x, lo), hi); +} From 54681d2e60ce30f3fe4039ba244f13308c5ec912 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Mon, 2 Oct 2023 19:57:35 -0400 Subject: [PATCH 12/46] camera partial refactor --- PYTHON/nodes | 2 +- src/lib/plot/camera.ts | 126 +++++++++++++++++++++++++++++++++++++++++ src/lib/plot/index.ts | 2 + 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index e0e35b13b..296455183 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit e0e35b13bad3069ff27d1954f6ea26223391e803 +Subproject commit 296455183e225444134f19b3f3f722e825ec6717 diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 6fa045872..ce22da8cc 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -2,6 +2,8 @@ import mouseChange from "mouse-change"; import mouseWheel from "mouse-wheel"; import { mat4 } from "gl-matrix"; import { Vec3, Regl, DefaultContext } from "regl"; +import { clamp } from "./utils"; +import { Plot } from "."; type Props = { center: Vec3; @@ -20,6 +22,130 @@ type Mods = { meta: boolean; }; +type CameraState = { + view: mat4; + projection: mat4; + center: Float32Array; + theta: number; + phi: number; + distance: number; + eye: Float32Array; + up: Float32Array; +}; + +export class Camera { + private readonly plot: Plot; + private state: CameraState; + private readonly right = new Float32Array([1, 0, 0]); + private readonly front = new Float32Array([0, 0, 1]); + private readonly minDistance: number; + private readonly maxDistance: number; + + private dtheta = 0; + private dphi = 0; + private ddistance = 0; + + private prevX = 0; + private prevY = 0; + + constructor(plot: Plot, props: Partial) { + this.state = { + view: mat4.identity(new Float32Array(16)), + projection: mat4.identity(new Float32Array(16)), + center: props.center + ? new Float32Array(props.center) + : new Float32Array(3), + theta: props.theta ?? 0, + phi: props.phi ?? 0, + distance: Math.log(props.distance ?? 10.0), + eye: new Float32Array(3), + up: new Float32Array(props.up ?? [0, 1, 0]), + }; + + this.minDistance = Math.log(props.minDistance ?? 0.1); + this.maxDistance = Math.log(props.maxDistance ?? 1000); + + this.plot = plot; + + plot.canvas.addEventListener("mousemove", this.onMouseMove); + plot.canvas.addEventListener("wheel", this.onMouseWheel); + } + + public update() {} + + private onMouseMove(ev: MouseEvent) { + const leftButtonPressed = ev.buttons & 1; + if (leftButtonPressed && ev.ctrlKey) { + const dx = ev.movementX / window.innerWidth; + const dy = ev.movementY / window.innerHeight; + const w = Math.max(this.state.distance, 0.5); + + this.dtheta += w * dx; + this.dphi += w * dy; + } + } + + private onMouseWheel(ev: WheelEvent) { + this.ddistance += ev.deltaY / window.innerHeight / 5; + } + + private updateCamera() { + const center = this.state.center; + const eye = this.state.eye; + const up = this.state.up; + + this.state.theta += this.dtheta; + this.state.phi = clamp( + this.state.phi + this.dphi, + -Math.PI / 2.0, + Math.PI / 2.0, + ); + this.state.distance = clamp( + this.state.distance + this.ddistance, + this.minDistance, + this.maxDistance, + ); + + this.dtheta = 0; + this.dphi = 0; + this.ddistance = 0; + + const theta = this.state.theta; + const phi = this.state.phi; + const r = Math.exp(this.state.distance); + + const vf = r * Math.sin(theta) * Math.cos(phi); + const vr = r * Math.cos(theta) * Math.cos(phi); + const vu = r * Math.sin(phi); + + for (let i = 0; i < 3; ++i) { + eye[i] = center[i] + vf * this.front[i] + vr * this.right[i] + vu * up[i]; + } + + mat4.lookAt(this.state.view, eye, center, up); + } + + private injectContext() { + this.plot.regl({ + context: Object.assign({}, this.state, { + projection: ({ viewportWidth, viewportHeight }) => { + return mat4.perspective( + this.state.projection, + Math.PI / 4.0, + viewportWidth / viewportHeight, + 0.01, + 1000.0, + ); + }, + }), + uniforms: Object.keys(this.state).reduce((uniforms, name) => { + uniforms[name] = this.plot.regl.context(name as keyof DefaultContext); + return uniforms; + }, {}), + }); + } +} + export default function createCamera(regl: Regl, props: Partial) { const cameraState = { view: mat4.identity(new Float32Array(16)), diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index dd0e45bc8..452532eab 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -9,12 +9,14 @@ type CameraOptions = { export class Plot { public readonly regl: REGL.Regl; + public readonly canvas: HTMLCanvasElement; private camera?: (block) => void; private objects: Drawable[] = []; constructor(canvas: HTMLCanvasElement) { this.regl = REGL(canvas); + this.canvas = canvas; this.camera = undefined; this.objects = []; } From 4e00a41eda289896bcce5fc766125615a0489fc4 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 3 Oct 2023 15:21:03 -0400 Subject: [PATCH 13/46] more refactor --- package-lock.json | 48 ---- package.json | 2 - src/App.tsx | 6 + src/components/nodes/visual/Scatter3DNode.tsx | 4 +- src/deps.d.ts | 2 - src/feature/PlotTest.tsx | 48 +--- src/lib/plot/camera.ts | 215 +++++------------- src/lib/plot/index.ts | 70 +----- src/lib/plot/plot.ts | 70 ++++++ src/lib/plot/plots/3d/scatter.ts | 51 +++++ src/lib/plot/primitives/plane.ts | 19 +- src/lib/plot/primitives/points.ts | 11 +- 12 files changed, 210 insertions(+), 336 deletions(-) delete mode 100644 src/deps.d.ts create mode 100644 src/lib/plot/plot.ts create mode 100644 src/lib/plot/plots/3d/scatter.ts diff --git a/package-lock.json b/package-lock.json index 8a45e9c0b..57194a413 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,8 +48,6 @@ "localforage": "^1.10.0", "lucide-react": "^0.279.0", "mixpanel-browser": "^2.47.0", - "mouse-change": "^1.4.0", - "mouse-wheel": "^1.2.0", "plotly.js": "file:bauhaus/plotly.js-2.23.2.tgz", "rc-slider": "^10.3.0", "react": "^18.2.0", @@ -17055,29 +17053,6 @@ "node": ">=0.10.0" } }, - "node_modules/mouse-change": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", - "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", - "dependencies": { - "mouse-event": "^1.0.0" - } - }, - "node_modules/mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==" - }, - "node_modules/mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", - "dependencies": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - } - }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -17809,11 +17784,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" - }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -19420,11 +19390,6 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, - "node_modules/right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==" - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -19845,11 +19810,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==" - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -20873,14 +20833,6 @@ "node": ">=4" } }, - "node_modules/to-px": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", - "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", - "dependencies": { - "parse-unit": "^1.0.1" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 434012338..dd3afbf6a 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,6 @@ "localforage": "^1.10.0", "lucide-react": "^0.279.0", "mixpanel-browser": "^2.47.0", - "mouse-change": "^1.4.0", - "mouse-wheel": "^1.2.0", "plotly.js": "file:bauhaus/plotly.js-2.23.2.tgz", "rc-slider": "^10.3.0", "react": "^18.2.0", diff --git a/src/App.tsx b/src/App.tsx index 718998d65..8375cf8f7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,6 +14,7 @@ import ElectronLogsDialog from "./components/electron/ElectronLogsDialog"; import PythonManagerTabView from "./feature/python_manager_panel/PythonManagerTabView"; import { Layout } from "./feature/common/Layout"; import LoadingPage from "./feature/loading/LoadingPage"; +import { PlotTest } from "./feature/PlotTest"; function ErrorBoundary() { const error: Error = useRouteError() as Error; @@ -57,6 +58,11 @@ const App = () => { }> } + errorElement={} + /> + } errorElement={} /> diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 705271e7a..749344fe8 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -43,7 +43,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { if (points.current && nodeResult?.result?.data) { const pts = zip(nodeResult.result.data as OrderedTripleData); - points.current.setProps({ points: pts, pointCount: pts.length }); + points.current.setProps({ points: pts, count: pts.length }); } }, [nodeResult?.result.data]); @@ -73,7 +73,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { }, { points: pointsData.current, - pointCount: pointsData.current.length, + count: pointsData.current.length, }, ); diff --git a/src/deps.d.ts b/src/deps.d.ts deleted file mode 100644 index 7226f8ad8..000000000 --- a/src/deps.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module "mouse-change"; -declare module "mouse-wheel"; diff --git a/src/feature/PlotTest.tsx b/src/feature/PlotTest.tsx index 17414e93a..e460ce366 100644 --- a/src/feature/PlotTest.tsx +++ b/src/feature/PlotTest.tsx @@ -1,45 +1,21 @@ -import { Plot, Points } from "@src/lib/plot"; -import { OrthogonalPlane } from "@src/lib/plot/plane"; -import { useRef } from "react"; -import REGL from "regl"; +import { useEffect, useRef } from "react"; +import { Vec3 } from "regl"; +import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; -const data: REGL.Vec3[] = Array(1000) +const data: Vec3[] = Array(1000) .fill(undefined) - .map(() => [ - Math.random() * 5 - 2.5, - Math.random() * 5 - 2.5, - Math.random() * 5 - 2.5, - ]); + .map(() => [Math.random() * 5, Math.random() * 5, Math.random() * 5]); export const PlotTest = () => { const canvas = useRef(null); - const plot = useRef(null); + const scatter = useRef(null); - if (canvas.current && !plot.current) { - const plt = new Plot({ - ref: canvas.current, - cameraOptions: { - center: [0, 0, 0], - }, - }); - plot.current = plt; - - plt.addObject( - new Points(plt, data, { - pointSize: 3, - }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "xy", gridSize: 10 }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "xz", gridSize: 10 }), - ); - plt.addObject( - new OrthogonalPlane(plt, { orientation: "yz", gridSize: 10 }), - ); - plt.frame(); - } + useEffect(() => { + if (canvas.current) { + scatter.current = new ScatterPlot3D(canvas.current, data); + scatter.current.frame(); + } + }, [canvas.current]); return (
diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index ce22da8cc..905d4ca2d 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -1,11 +1,9 @@ -import mouseChange from "mouse-change"; -import mouseWheel from "mouse-wheel"; import { mat4 } from "gl-matrix"; -import { Vec3, Regl, DefaultContext } from "regl"; +import { Vec3, DefaultContext, DrawCommand } from "regl"; import { clamp } from "./utils"; import { Plot } from "."; -type Props = { +export type CameraOptions = Partial<{ center: Vec3; theta: number; phi: number; @@ -13,14 +11,7 @@ type Props = { up: Vec3; minDistance: number; maxDistance: number; -}; - -type Mods = { - shift: boolean; - alt: boolean; - control: boolean; - meta: boolean; -}; +}>; type CameraState = { view: mat4; @@ -48,45 +39,69 @@ export class Camera { private prevX = 0; private prevY = 0; - constructor(plot: Plot, props: Partial) { + private injectContext: DrawCommand; + + constructor(plot: Plot, options: Partial) { this.state = { view: mat4.identity(new Float32Array(16)), projection: mat4.identity(new Float32Array(16)), - center: props.center - ? new Float32Array(props.center) + center: options.center + ? new Float32Array(options.center) : new Float32Array(3), - theta: props.theta ?? 0, - phi: props.phi ?? 0, - distance: Math.log(props.distance ?? 10.0), + theta: options.theta ?? 0, + phi: options.phi ?? 0, + distance: Math.log(options.distance ?? 10.0), eye: new Float32Array(3), - up: new Float32Array(props.up ?? [0, 1, 0]), + up: new Float32Array(options.up ?? [0, 1, 0]), }; - this.minDistance = Math.log(props.minDistance ?? 0.1); - this.maxDistance = Math.log(props.maxDistance ?? 1000); + this.minDistance = Math.log(options.minDistance ?? 0.1); + this.maxDistance = Math.log(options.maxDistance ?? 1000); this.plot = plot; - plot.canvas.addEventListener("mousemove", this.onMouseMove); - plot.canvas.addEventListener("wheel", this.onMouseWheel); - } + this.injectContext = this.plot.regl({ + context: Object.assign({}, this.state, { + projection: ({ viewportWidth, viewportHeight }) => { + return mat4.perspective( + this.state.projection, + Math.PI / 4.0, + viewportWidth / viewportHeight, + 0.01, + 1000.0, + ); + }, + }), + uniforms: Object.keys(this.state).reduce((uniforms, name) => { + uniforms[name] = this.plot.regl.context(name as keyof DefaultContext); + return uniforms; + }, {}), + }); - public update() {} + const onMouseMove = (ev: MouseEvent) => { + const leftButtonPressed = ev.buttons & 1; + if (leftButtonPressed && ev.ctrlKey) { + const dx = ev.movementX / window.innerWidth; + const dy = ev.movementY / window.innerHeight; + const w = Math.max(this.state.distance, 0.5); - private onMouseMove(ev: MouseEvent) { - const leftButtonPressed = ev.buttons & 1; - if (leftButtonPressed && ev.ctrlKey) { - const dx = ev.movementX / window.innerWidth; - const dy = ev.movementY / window.innerHeight; - const w = Math.max(this.state.distance, 0.5); + this.dtheta += w * dx; + this.dphi += w * dy; + } + }; - this.dtheta += w * dx; - this.dphi += w * dy; - } + const onMouseWheel = (ev: WheelEvent) => { + ev.preventDefault(); + this.ddistance += ev.deltaY / window.innerHeight / 5; + }; + + plot.canvas.addEventListener("mousemove", onMouseMove); + plot.canvas.addEventListener("wheel", onMouseWheel); } - private onMouseWheel(ev: WheelEvent) { - this.ddistance += ev.deltaY / window.innerHeight / 5; + public drawInContext(block: (context: DefaultContext) => void) { + this.updateCamera(); + this.injectContext(block); } private updateCamera() { @@ -124,132 +139,4 @@ export class Camera { mat4.lookAt(this.state.view, eye, center, up); } - - private injectContext() { - this.plot.regl({ - context: Object.assign({}, this.state, { - projection: ({ viewportWidth, viewportHeight }) => { - return mat4.perspective( - this.state.projection, - Math.PI / 4.0, - viewportWidth / viewportHeight, - 0.01, - 1000.0, - ); - }, - }), - uniforms: Object.keys(this.state).reduce((uniforms, name) => { - uniforms[name] = this.plot.regl.context(name as keyof DefaultContext); - return uniforms; - }, {}), - }); - } -} - -export default function createCamera(regl: Regl, props: Partial) { - const cameraState = { - view: mat4.identity(new Float32Array(16)), - projection: mat4.identity(new Float32Array(16)), - center: new Float32Array(props.center ?? 3), - theta: props.theta ?? 0, - phi: props.phi ?? 0, - distance: Math.log(props.distance ?? 10.0), - eye: new Float32Array(3), - up: new Float32Array(props.up ?? [0, 1, 0]), - }; - - const right = new Float32Array([1, 0, 0]); - const front = new Float32Array([0, 0, 1]); - - const minDistance = Math.log(props.minDistance ?? 0.1); - const maxDistance = Math.log(props.maxDistance ?? 1000); - - let dtheta = 0; - let dphi = 0; - let ddistance = 0; - - let prevX = 0; - let prevY = 0; - - mouseChange((buttons: number, x: number, y: number, mods: Mods) => { - if (buttons & 1 && mods.control) { - const dx = (x - prevX) / window.innerWidth; - const dy = (y - prevY) / window.innerHeight; - const w = Math.max(cameraState.distance, 0.5); - - dtheta += w * dx; - dphi += w * dy; - } - prevX = x; - prevY = y; - }); - - mouseWheel((dx: number, dy: number) => { - ddistance += dy / window.innerHeight / 5; - }); - - function updateCamera() { - const center = cameraState.center; - const eye = cameraState.eye; - const up = cameraState.up; - - cameraState.theta += dtheta; - cameraState.phi = clamp( - cameraState.phi + dphi, - -Math.PI / 2.0, - Math.PI / 2.0, - ); - cameraState.distance = clamp( - cameraState.distance + ddistance, - minDistance, - maxDistance, - ); - - dtheta = 0; - dphi = 0; - ddistance = 0; - - const theta = cameraState.theta; - const phi = cameraState.phi; - const r = Math.exp(cameraState.distance); - - const vf = r * Math.sin(theta) * Math.cos(phi); - const vr = r * Math.cos(theta) * Math.cos(phi); - const vu = r * Math.sin(phi); - - for (let i = 0; i < 3; ++i) { - eye[i] = center[i] + vf * front[i] + vr * right[i] + vu * up[i]; - } - - mat4.lookAt(cameraState.view, eye, center, up); - } - - const injectContext = regl({ - context: Object.assign({}, cameraState, { - projection: function ({ viewportWidth, viewportHeight }) { - return mat4.perspective( - cameraState.projection, - Math.PI / 4.0, - viewportWidth / viewportHeight, - 0.01, - 1000.0, - ); - }, - }), - uniforms: Object.keys(cameraState).reduce((uniforms, name) => { - uniforms[name] = regl.context(name as keyof DefaultContext); - return uniforms; - }, {}), - }); - - function setupCamera(block) { - updateCamera(); - injectContext(block); - } - - Object.keys(cameraState).forEach((name) => { - setupCamera[name] = cameraState[name]; - }); - - return setupCamera; } diff --git a/src/lib/plot/index.ts b/src/lib/plot/index.ts index 452532eab..55241dfc8 100644 --- a/src/lib/plot/index.ts +++ b/src/lib/plot/index.ts @@ -1,68 +1,2 @@ -import REGL from "regl"; -import createCamera from "./camera"; -import { Sphere, Points, OrthogonalPlane } from "./primitives"; -import { Drawable } from "./types"; - -type CameraOptions = { - center: REGL.Vec3; -}; - -export class Plot { - public readonly regl: REGL.Regl; - public readonly canvas: HTMLCanvasElement; - private camera?: (block) => void; - - private objects: Drawable[] = []; - - constructor(canvas: HTMLCanvasElement) { - this.regl = REGL(canvas); - this.canvas = canvas; - this.camera = undefined; - this.objects = []; - } - - public with(obj: Drawable) { - this.objects.push(obj); - - return this; - } - - public withCamera({ center }: CameraOptions) { - this.camera = createCamera(this.regl, { - center, - }); - - return this; - } - - public draw() { - this.objects.forEach((c) => { - c.draw(); - }); - } - - public frame() { - if (this.camera) { - this.regl.frame(() => { - this.regl.clear({ - color: [0, 0, 0, 1], - }); - - this.camera!(() => { - this.draw(); - }); - }); - return; - } - - this.regl.frame(() => { - this.regl.clear({ - color: [0, 0, 0, 1], - }); - - this.draw(); - }); - } -} - -export { Triangle, Sphere, Points, OrthogonalPlane }; +export { Triangles, Sphere, Points, OrthogonalPlane } from "./primitives"; +export { Plot } from "./plot"; diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts new file mode 100644 index 000000000..400dbeb5c --- /dev/null +++ b/src/lib/plot/plot.ts @@ -0,0 +1,70 @@ +import REGL, { Regl, Vec3, Vec4 } from "regl"; +import { Camera } from "./camera"; +import { Drawable } from "./types"; + +type CameraOptions = { + center: Vec3; +}; + +export class Plot { + public readonly regl: Regl; + public readonly canvas: HTMLCanvasElement; + private readonly backgroundColor: Vec4; + private camera?: Camera; + + private objects: Drawable[] = []; + + constructor(canvas: HTMLCanvasElement, backgroundColor?: Vec4) { + this.regl = REGL(canvas); + this.canvas = canvas; + this.backgroundColor = backgroundColor ?? [0.2, 0.2, 0.2, 1]; + this.camera = undefined; + this.objects = []; + } + + public with(obj: Drawable | Drawable[]) { + if (Array.isArray(obj)) { + this.objects.push(...obj); + return this; + } + + this.objects.push(obj); + + return this; + } + + public withCamera(options: CameraOptions) { + this.camera = new Camera(this, options); + + return this; + } + + public draw() { + this.objects.forEach((c) => { + c.draw(); + }); + } + + public frame() { + if (this.camera) { + this.regl.frame(() => { + this.regl.clear({ + color: this.backgroundColor, + }); + + this.camera!.drawInContext(() => { + this.draw(); + }); + }); + return; + } + + this.regl.frame(() => { + this.regl.clear({ + color: this.backgroundColor, + }); + + this.draw(); + }); + } +} diff --git a/src/lib/plot/plots/3d/scatter.ts b/src/lib/plot/plots/3d/scatter.ts new file mode 100644 index 000000000..73f3d5be1 --- /dev/null +++ b/src/lib/plot/plots/3d/scatter.ts @@ -0,0 +1,51 @@ +import { Vec3, Vec4 } from "regl"; +import { Plot } from "../../plot"; +import { OrthogonalPlane, Points } from "../../primitives"; + +export class ScatterPlot3D { + private plot: Plot; + private points: Points; + + constructor(canvas: HTMLCanvasElement, data: Vec3[], backgroundColor?: Vec4) { + this.plot = new Plot(canvas, backgroundColor); + this.points = new Points( + this.plot, + { pointSize: 5 }, + { + points: data, + count: data.length, + }, + ); + this.plot + .with([ + this.points, + new OrthogonalPlane(this.plot, { + orientation: "xy", + }), + new OrthogonalPlane(this.plot, { + orientation: "xz", + }), + new OrthogonalPlane(this.plot, { + orientation: "yz", + }), + ]) + .withCamera({ + center: [2.5, 2.5, 2.5], + }); + } + + public draw() { + this.plot.draw(); + } + + public frame() { + this.plot.frame(); + } + + public updateData(data: Vec3[]) { + this.points.setProps({ + points: data, + count: data.length, + }); + } +} diff --git a/src/lib/plot/primitives/plane.ts b/src/lib/plot/primitives/plane.ts index 1d004a967..3490c7277 100644 --- a/src/lib/plot/primitives/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -1,5 +1,6 @@ -import { DrawCommand, Regl, Vec3, Vec4 } from "regl"; +import { DrawCommand, Vec3, Vec4 } from "regl"; import { Drawable } from "../types"; +import { Plot } from "../plot"; type Props = { vertices: Vec3[]; @@ -15,8 +16,8 @@ type Attributes = { }; type OrthogonalPlaneOptions = { - gridSize: number; orientation: "xz" | "xy" | "yz"; + gridSize?: number; }; export class OrthogonalPlane implements Drawable { @@ -25,14 +26,14 @@ export class OrthogonalPlane implements Drawable { public color: Vec4; constructor( - regl: Regl, + plot: Plot, options: OrthogonalPlaneOptions, - props: Partial>, + props?: Partial>, ) { this.vertices = this.createVertices(options); - this.color = props.color ?? [0.5, 0.5, 0.5, 1]; + this.color = props?.color ?? [0.5, 0.5, 0.5, 1]; - this.drawCommand = regl({ + this.drawCommand = plot.regl({ frag: ` precision mediump float; @@ -55,10 +56,10 @@ export class OrthogonalPlane implements Drawable { } `, attributes: { - position: regl.prop("vertices"), + position: plot.regl.prop("vertices"), }, uniforms: { - color: regl.prop("color"), + color: plot.regl.prop("color"), }, count: this.vertices.length, primitive: "lines", @@ -85,7 +86,7 @@ export class OrthogonalPlane implements Drawable { } private createXZPlaneVertices({ - gridSize: size, + gridSize: size = 10, }: OrthogonalPlaneOptions): Vec3[] { const vertices: Vec3[] = []; diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 9a74f5a16..f57067907 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -1,5 +1,6 @@ -import { Vec3, Regl, DrawCommand } from "regl"; +import { Vec3, DrawCommand } from "regl"; import { Drawable } from "../types"; +import { Plot } from "../plot"; type Props = { points: Vec3[]; @@ -22,9 +23,9 @@ export class Points implements Drawable { private readonly drawCommand: DrawCommand; private props: Props; - constructor(regl: Regl, options: PointsOptions, initialProps: Props) { + constructor(plot: Plot, options: PointsOptions, initialProps: Props) { this.props = initialProps; - this.drawCommand = regl({ + this.drawCommand = plot.regl({ frag: ` precision mediump float; @@ -56,14 +57,14 @@ export class Points implements Drawable { } `, attributes: { - position: regl.prop("points"), + position: plot.regl.prop("points"), }, uniforms: { size: options.pointSize, }, - count: regl.prop("count"), + count: plot.regl.prop("count"), primitive: "points", }); } From a80aea75c0a803d252147df15a0e4ce0e4c99d41 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 3 Oct 2023 15:21:14 -0400 Subject: [PATCH 14/46] remove unused fields --- src/lib/plot/camera.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 905d4ca2d..b7ab0cf36 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -36,9 +36,6 @@ export class Camera { private dphi = 0; private ddistance = 0; - private prevX = 0; - private prevY = 0; - private injectContext: DrawCommand; constructor(plot: Plot, options: Partial) { From a2c8184830c6f12ed430092e9288e9fc25ff16f8 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 3 Oct 2023 18:54:55 -0400 Subject: [PATCH 15/46] more refactoring --- src/feature/PlotTest.tsx | 25 +++++++++++++++---- src/lib/plot/camera.ts | 39 +++++++++++++++++++++++++----- src/lib/plot/plot.ts | 8 +++++-- src/lib/plot/plots/3d/scatter.ts | 41 ++++++++++++++++++++++++++++---- src/lib/plot/primitives/plane.ts | 26 +++++++++++--------- src/lib/plot/types.ts | 7 ++++++ 6 files changed, 119 insertions(+), 27 deletions(-) diff --git a/src/feature/PlotTest.tsx b/src/feature/PlotTest.tsx index e460ce366..4f1d461c4 100644 --- a/src/feature/PlotTest.tsx +++ b/src/feature/PlotTest.tsx @@ -4,7 +4,7 @@ import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; const data: Vec3[] = Array(1000) .fill(undefined) - .map(() => [Math.random() * 5, Math.random() * 5, Math.random() * 5]); + .map(() => [Math.random() * 10, Math.random() * 10, Math.random() * 10]); export const PlotTest = () => { const canvas = useRef(null); @@ -12,14 +12,31 @@ export const PlotTest = () => { useEffect(() => { if (canvas.current) { - scatter.current = new ScatterPlot3D(canvas.current, data); + scatter.current = new ScatterPlot3D(canvas.current, data, { + axes: { + x: { + domain: [-10, 10], + step: 0.5, + }, + y: { + domain: [-10, 10], + step: 0.5, + }, + z: { + domain: [-10, 10], + step: 0.5, + }, + }, + }); scatter.current.frame(); } - }, [canvas.current]); + }, []); return (
- +
+ +
); }; diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index b7ab0cf36..813400c9e 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -1,4 +1,4 @@ -import { mat4 } from "gl-matrix"; +import { mat4, vec3 } from "gl-matrix"; import { Vec3, DefaultContext, DrawCommand } from "regl"; import { clamp } from "./utils"; import { Plot } from "."; @@ -26,12 +26,13 @@ type CameraState = { export class Camera { private readonly plot: Plot; - private state: CameraState; private readonly right = new Float32Array([1, 0, 0]); private readonly front = new Float32Array([0, 0, 1]); private readonly minDistance: number; private readonly maxDistance: number; + private state: CameraState; + private dtheta = 0; private dphi = 0; private ddistance = 0; @@ -77,13 +78,39 @@ export class Camera { const onMouseMove = (ev: MouseEvent) => { const leftButtonPressed = ev.buttons & 1; - if (leftButtonPressed && ev.ctrlKey) { + if (leftButtonPressed) { const dx = ev.movementX / window.innerWidth; const dy = ev.movementY / window.innerHeight; - const w = Math.max(this.state.distance, 0.5); + if (ev.ctrlKey) { + const w = Math.max(this.state.distance, 0.5); + + this.dtheta += w * dx; + this.dphi += w * dy; + } else { + // orthogonalize the vectors + // TODO: fix this it doesn't work + const [a, b, c] = this.state.eye; + const v1 = vec3.normalize( + vec3.create(), + new Float32Array([-b, a, 0]), + ); + const v2 = vec3.normalize( + vec3.create(), + new Float32Array([-c, 0, a]), + ); + + const projv2v1 = vec3.scale(vec3.create(), v2, vec3.dot(v2, v1)); + vec3.sub(v2, v2, projv2v1); - this.dtheta += w * dx; - this.dphi += w * dy; + vec3.scale(v1, v1, dy * 10); + vec3.scale(v2, v2, dx * 10); + + vec3.add( + this.state.center, + this.state.center, + vec3.add(vec3.create(), v1, v2), + ); + } } }; diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts index 400dbeb5c..01593c5ed 100644 --- a/src/lib/plot/plot.ts +++ b/src/lib/plot/plot.ts @@ -6,6 +6,10 @@ type CameraOptions = { center: Vec3; }; +type PlotOptions = { + backgroundColor?: Vec4; +}; + export class Plot { public readonly regl: Regl; public readonly canvas: HTMLCanvasElement; @@ -14,10 +18,10 @@ export class Plot { private objects: Drawable[] = []; - constructor(canvas: HTMLCanvasElement, backgroundColor?: Vec4) { + constructor(canvas: HTMLCanvasElement, options: PlotOptions) { this.regl = REGL(canvas); this.canvas = canvas; - this.backgroundColor = backgroundColor ?? [0.2, 0.2, 0.2, 1]; + this.backgroundColor = options.backgroundColor ?? [0.2, 0.2, 0.2, 1]; this.camera = undefined; this.objects = []; } diff --git a/src/lib/plot/plots/3d/scatter.ts b/src/lib/plot/plots/3d/scatter.ts index 73f3d5be1..fadabc706 100644 --- a/src/lib/plot/plots/3d/scatter.ts +++ b/src/lib/plot/plots/3d/scatter.ts @@ -1,13 +1,27 @@ import { Vec3, Vec4 } from "regl"; import { Plot } from "../../plot"; import { OrthogonalPlane, Points } from "../../primitives"; +import { Axis } from "../../types"; + +type ScatterPlot3DOptions = { + backgroundColor?: Vec4; + axes?: { + x: Axis; + y: Axis; + z: Axis; + }; +}; export class ScatterPlot3D { private plot: Plot; private points: Points; - constructor(canvas: HTMLCanvasElement, data: Vec3[], backgroundColor?: Vec4) { - this.plot = new Plot(canvas, backgroundColor); + constructor( + canvas: HTMLCanvasElement, + data: Vec3[], + options: ScatterPlot3DOptions, + ) { + this.plot = new Plot(canvas, options); this.points = new Points( this.plot, { pointSize: 5 }, @@ -16,17 +30,36 @@ export class ScatterPlot3D { count: data.length, }, ); + + const { x, y, z } = options.axes ?? { + x: { + domain: [0, 10], + step: 1, + }, + y: { + domain: [0, 10], + step: 1, + }, + z: { + domain: [0, 10], + step: 1, + }, + }; + this.plot .with([ this.points, new OrthogonalPlane(this.plot, { - orientation: "xy", + orientation: "xz", + axes: [x, z], }), new OrthogonalPlane(this.plot, { - orientation: "xz", + orientation: "xy", + axes: [x, y], }), new OrthogonalPlane(this.plot, { orientation: "yz", + axes: [y, z], }), ]) .withCamera({ diff --git a/src/lib/plot/primitives/plane.ts b/src/lib/plot/primitives/plane.ts index 3490c7277..4a422e9fd 100644 --- a/src/lib/plot/primitives/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -1,5 +1,5 @@ import { DrawCommand, Vec3, Vec4 } from "regl"; -import { Drawable } from "../types"; +import { Axis, Drawable } from "../types"; import { Plot } from "../plot"; type Props = { @@ -17,7 +17,7 @@ type Attributes = { type OrthogonalPlaneOptions = { orientation: "xz" | "xy" | "yz"; - gridSize?: number; + axes: [Axis, Axis]; }; export class OrthogonalPlane implements Drawable { @@ -85,19 +85,23 @@ export class OrthogonalPlane implements Drawable { } } - private createXZPlaneVertices({ - gridSize: size = 10, - }: OrthogonalPlaneOptions): Vec3[] { + private createXZPlaneVertices(options: OrthogonalPlaneOptions): Vec3[] { + const [a, b] = options.axes; + const { domain: aDomain, step: aStep } = a; + const { domain: bDomain, step: bStep } = b; + const [a1, a2] = aDomain; + const [b1, b2] = bDomain; + const vertices: Vec3[] = []; - for (let i = 0; i < size; i++) { - vertices.push([i, 0, 0]); - vertices.push([i, 0, size]); + for (let i = a1; i <= a2; i += aStep) { + vertices.push([i, 0, b1]); + vertices.push([i, 0, b2]); } - for (let i = 0; i < size; i++) { - vertices.push([0, 0, i]); - vertices.push([size, 0, i]); + for (let i = b1; i <= b2; i += bStep) { + vertices.push([a1, 0, i]); + vertices.push([a2, 0, i]); } return vertices; diff --git a/src/lib/plot/types.ts b/src/lib/plot/types.ts index 1bd62df63..d395a3135 100644 --- a/src/lib/plot/types.ts +++ b/src/lib/plot/types.ts @@ -1,3 +1,10 @@ +import { Vec2 } from "regl"; + export interface Drawable { draw: () => void; } + +export type Axis = { + domain: Vec2; + step: number; +}; From 8ae975dab50a5708e6249738ff118509f40616cd Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 4 Oct 2023 15:38:16 -0400 Subject: [PATCH 16/46] panning kinda works --- src/lib/plot/camera.ts | 66 +++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 813400c9e..8730797d7 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -82,34 +82,9 @@ export class Camera { const dx = ev.movementX / window.innerWidth; const dy = ev.movementY / window.innerHeight; if (ev.ctrlKey) { - const w = Math.max(this.state.distance, 0.5); - - this.dtheta += w * dx; - this.dphi += w * dy; + this.rotate(dx, dy); } else { - // orthogonalize the vectors - // TODO: fix this it doesn't work - const [a, b, c] = this.state.eye; - const v1 = vec3.normalize( - vec3.create(), - new Float32Array([-b, a, 0]), - ); - const v2 = vec3.normalize( - vec3.create(), - new Float32Array([-c, 0, a]), - ); - - const projv2v1 = vec3.scale(vec3.create(), v2, vec3.dot(v2, v1)); - vec3.sub(v2, v2, projv2v1); - - vec3.scale(v1, v1, dy * 10); - vec3.scale(v2, v2, dx * 10); - - vec3.add( - this.state.center, - this.state.center, - vec3.add(vec3.create(), v1, v2), - ); + this.pan(dx, dy); } } }; @@ -163,4 +138,41 @@ export class Camera { mat4.lookAt(this.state.view, eye, center, up); } + + private pan(dx: number, dy: number) { + const u = vec3.create(); + const v = vec3.create(); + vec3.normalize(u, this.state.eye); + vec3.scale(v, this.state.up, vec3.dot(u, this.state.up)); + const forward = vec3.normalize( + vec3.create(), + vec3.sub(vec3.create(), v, u), + ); + const left = vec3.normalize( + vec3.create(), + vec3.cross(vec3.create(), forward, u), + ); + + const flip = this.state.eye[1] > 0.0 ? -1 : 1; + + vec3.scaleAndAdd( + this.state.center, + this.state.center, + forward, + -dy * 10 * flip, + ); + vec3.scaleAndAdd( + this.state.center, + this.state.center, + left, + dx * 10 * flip, + ); + } + + private rotate(dx: number, dy: number) { + const w = Math.max(this.state.distance, 0.5); + + this.dtheta += w * dx; + this.dphi += w * dy; + } } From 899c03e20adb77046cf07f76d24319b6732f455c Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 4 Oct 2023 18:54:05 -0400 Subject: [PATCH 17/46] more refactor --- PYTHON/nodes | 2 +- src/App.tsx | 6 -- src/components/nodes/visual/Scatter3DNode.tsx | 99 +++++++++---------- src/lib/plot/camera.ts | 21 ++-- src/lib/plot/plot.ts | 10 +- src/lib/plot/plots/3d/scatter.ts | 14 ++- src/lib/plot/primitives/points.ts | 40 +++++--- 7 files changed, 95 insertions(+), 97 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 296455183..e0e35b13b 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 296455183e225444134f19b3f3f722e825ec6717 +Subproject commit e0e35b13bad3069ff27d1954f6ea26223391e803 diff --git a/src/App.tsx b/src/App.tsx index 8375cf8f7..718998d65 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,7 +14,6 @@ import ElectronLogsDialog from "./components/electron/ElectronLogsDialog"; import PythonManagerTabView from "./feature/python_manager_panel/PythonManagerTabView"; import { Layout } from "./feature/common/Layout"; import LoadingPage from "./feature/loading/LoadingPage"; -import { PlotTest } from "./feature/PlotTest"; function ErrorBoundary() { const error: Error = useRouteError() as Error; @@ -58,11 +57,6 @@ const App = () => { }> } - errorElement={} - /> - } errorElement={} /> diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 749344fe8..56ba166b0 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -4,13 +4,15 @@ import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; import { memo, useEffect, useRef } from "react"; -import { Plot, OrthogonalPlane, Points } from "@src/lib/plot"; -import REGL from "regl"; +import { Vec3 } from "regl"; import Scatter3D from "@src/assets/nodes/3DScatter"; import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; +import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; +// It's very slow having to convert this from the ordered triple format to vertex format... +// For best performance we may need to rework how ordered triple data is stored. const zip = (data: { x: number[]; y: number[]; z: number[] }) => { - const orderedTriple: REGL.Vec3[] = []; + const orderedTriple: Vec3[] = []; for (let i = 0; i < data.x.length; i++) { orderedTriple.push([data.x[i], data.y[i], data.z[i]]); } @@ -18,32 +20,44 @@ const zip = (data: { x: number[]; y: number[]; z: number[] }) => { }; const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { - const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + const { nodeError, nodeResult } = useNodeStatus(data.id); const canvas = useRef(null); - const plot = useRef(null); - const points = useRef(null); - const pointsData = useRef([]); - - // useEffect(() => { - // const interval = setInterval(() => { - // if (points.current !== null) { - // pointsData.current.push(randomPoint()); - // points.current.setProps({ - // points: pointsData.current, - // pointCount: pointsData.current.length, - // }); - // } - // }, 50); - // - // return () => clearInterval(interval); - // }, []); + const scatter = useRef(null); useEffect(() => { - if (points.current && nodeResult?.result?.data) { + if (scatter.current && nodeResult?.result?.data) { const pts = zip(nodeResult.result.data as OrderedTripleData); - points.current.setProps({ points: pts, count: pts.length }); + scatter.current.updateData(pts); + } + }, [nodeResult?.result.data]); + + useEffect(() => { + if (!scatter.current && canvas.current && nodeResult?.result?.data) { + const pts = zip(nodeResult.result.data as OrderedTripleData); + scatter.current = new ScatterPlot3D(canvas.current, pts, { + axes: { + x: { + domain: [0, 10], + step: 1, + }, + y: { + domain: [0, 10], + step: 1, + }, + z: { + domain: [0, 10], + step: 1, + }, + }, + cameraOptions: { + center: [2.5, 2.5, 2.5], + }, + color: [0.6, 0.96, 1, 1], + backgroundColor: [0.1, 0.1, 0.1, 1], + }); + scatter.current.frame(); } }, [nodeResult?.result.data]); @@ -53,7 +67,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => {
@@ -64,41 +78,22 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { ); } - if (canvas.current && !plot.current) { - const plt = new Plot(canvas.current); - points.current = new Points( - plt.regl, - { - pointSize: 5, - }, - { - points: pointsData.current, - count: pointsData.current.length, - }, - ); - - plt - .with(points.current) - .with(new OrthogonalPlane(plt.regl, { orientation: "xy", gridSize: 10 })) - .with(new OrthogonalPlane(plt.regl, { orientation: "xz", gridSize: 10 })) - .with(new OrthogonalPlane(plt.regl, { orientation: "yz", gridSize: 10 })) - .withCamera({ center: [2.5, 2.5, 2.5] }); - - plot.current = plt; - - plt.frame(); - } - return (
- +
diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 8730797d7..3d0d8cd6a 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -39,22 +39,22 @@ export class Camera { private injectContext: DrawCommand; - constructor(plot: Plot, options: Partial) { + constructor(plot: Plot, options?: CameraOptions) { this.state = { view: mat4.identity(new Float32Array(16)), projection: mat4.identity(new Float32Array(16)), - center: options.center - ? new Float32Array(options.center) + center: options?.center + ? new Float32Array(options?.center) : new Float32Array(3), - theta: options.theta ?? 0, - phi: options.phi ?? 0, - distance: Math.log(options.distance ?? 10.0), + theta: options?.theta ?? 0, + phi: options?.phi ?? 0, + distance: Math.log(options?.distance ?? 10.0), eye: new Float32Array(3), - up: new Float32Array(options.up ?? [0, 1, 0]), + up: new Float32Array(options?.up ?? [0, 1, 0]), }; - this.minDistance = Math.log(options.minDistance ?? 0.1); - this.maxDistance = Math.log(options.maxDistance ?? 1000); + this.minDistance = Math.log(options?.minDistance ?? 0.1); + this.maxDistance = Math.log(options?.maxDistance ?? 1000); this.plot = plot; @@ -79,6 +79,8 @@ export class Camera { const onMouseMove = (ev: MouseEvent) => { const leftButtonPressed = ev.buttons & 1; if (leftButtonPressed) { + ev.preventDefault(); + ev.stopPropagation(); const dx = ev.movementX / window.innerWidth; const dy = ev.movementY / window.innerHeight; if (ev.ctrlKey) { @@ -91,6 +93,7 @@ export class Camera { const onMouseWheel = (ev: WheelEvent) => { ev.preventDefault(); + ev.stopPropagation(); this.ddistance += ev.deltaY / window.innerHeight / 5; }; diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts index 01593c5ed..b83316d9c 100644 --- a/src/lib/plot/plot.ts +++ b/src/lib/plot/plot.ts @@ -1,11 +1,7 @@ -import REGL, { Regl, Vec3, Vec4 } from "regl"; -import { Camera } from "./camera"; +import REGL, { Regl, Vec4 } from "regl"; +import { Camera, CameraOptions } from "./camera"; import { Drawable } from "./types"; -type CameraOptions = { - center: Vec3; -}; - type PlotOptions = { backgroundColor?: Vec4; }; @@ -37,7 +33,7 @@ export class Plot { return this; } - public withCamera(options: CameraOptions) { + public withCamera(options?: CameraOptions) { this.camera = new Camera(this, options); return this; diff --git a/src/lib/plot/plots/3d/scatter.ts b/src/lib/plot/plots/3d/scatter.ts index fadabc706..0197f7214 100644 --- a/src/lib/plot/plots/3d/scatter.ts +++ b/src/lib/plot/plots/3d/scatter.ts @@ -2,14 +2,17 @@ import { Vec3, Vec4 } from "regl"; import { Plot } from "../../plot"; import { OrthogonalPlane, Points } from "../../primitives"; import { Axis } from "../../types"; +import { CameraOptions } from "../../camera"; type ScatterPlot3DOptions = { + color?: Vec4; backgroundColor?: Vec4; axes?: { x: Axis; y: Axis; z: Axis; }; + cameraOptions?: Partial; }; export class ScatterPlot3D { @@ -27,7 +30,7 @@ export class ScatterPlot3D { { pointSize: 5 }, { points: data, - count: data.length, + color: options.color, }, ); @@ -62,9 +65,7 @@ export class ScatterPlot3D { axes: [y, z], }), ]) - .withCamera({ - center: [2.5, 2.5, 2.5], - }); + .withCamera(options.cameraOptions); } public draw() { @@ -76,9 +77,6 @@ export class ScatterPlot3D { } public updateData(data: Vec3[]) { - this.points.setProps({ - points: data, - count: data.length, - }); + this.points.updateData(data); } } diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index f57067907..08ed19410 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -1,14 +1,16 @@ -import { Vec3, DrawCommand } from "regl"; +import { Vec3, DrawCommand, Vec4 } from "regl"; import { Drawable } from "../types"; import { Plot } from "../plot"; type Props = { points: Vec3[]; count: number; + color?: Vec4; }; type Uniforms = { size: number; + color: Vec4; }; type Attributes = { @@ -21,22 +23,29 @@ type PointsOptions = { export class Points implements Drawable { private readonly drawCommand: DrawCommand; - private props: Props; - - constructor(plot: Plot, options: PointsOptions, initialProps: Props) { - this.props = initialProps; + private points: Vec3[]; + private count: number; + private color?: Vec4; + + constructor( + plot: Plot, + options: PointsOptions, + initialProps: Omit, + ) { + this.points = initialProps.points; + this.count = initialProps.points.length; + this.color = initialProps.color; this.drawCommand = plot.regl({ frag: ` precision mediump float; - - varying vec4 v_color; + uniform vec4 color; void main() { vec2 coord = gl_PointCoord - vec2(0.5); if (length(coord) > 0.5) { discard; } - gl_FragColor = v_color; + gl_FragColor = color; } `, vert: ` @@ -47,13 +56,10 @@ export class Points implements Drawable { uniform mat4 view, projection; uniform float size; - varying vec4 v_color; - void main() { vec4 pos = vec4(position, 1); gl_PointSize = size; gl_Position = projection * view * pos; - v_color = pos; } `, attributes: { @@ -62,6 +68,7 @@ export class Points implements Drawable { uniforms: { size: options.pointSize, + color: plot.regl.prop("color"), }, count: plot.regl.prop("count"), @@ -69,11 +76,16 @@ export class Points implements Drawable { }); } - public setProps(props: Props) { - this.props = props; + public updateData(data: Vec3[]) { + this.points = data; + this.count = data.length; } public draw() { - this.drawCommand(this.props); + this.drawCommand({ + points: this.points, + count: this.count, + color: this.color ?? [1, 0, 0, 1], + }); } } From a0554d4c180311e6e902e6ddfc5b077303eb52e6 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 6 Oct 2023 10:32:49 -0400 Subject: [PATCH 18/46] tweaks --- PYTHON/nodes | 2 +- requirements.txt | 1 + src/components/nodes/visual/Scatter3DNode.tsx | 15 ++----------- src/feature/common/types/ResultsType.ts | 7 +++--- src/lib/plot/camera.ts | 22 +++++++++---------- src/lib/plot/primitives/points.ts | 9 +++++--- 6 files changed, 23 insertions(+), 33 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index e0e35b13b..4f7be307c 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit e0e35b13bad3069ff27d1954f6ea26223391e803 +Subproject commit 4f7be307c6a67b4cc992b48b3d7fbfc6cfb82110 diff --git a/requirements.txt b/requirements.txt index 9df24486c..c6c1dfbf5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,5 +15,6 @@ pyvisa==1.13.0 pyusb==1.2.1 zeroconf==0.102.0 pyserial==3.5 +sympy==1.12 debugpy opencv-python-headless diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 56ba166b0..04aa2aaae 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -4,21 +4,10 @@ import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; import { memo, useEffect, useRef } from "react"; -import { Vec3 } from "regl"; import Scatter3D from "@src/assets/nodes/3DScatter"; import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; -// It's very slow having to convert this from the ordered triple format to vertex format... -// For best performance we may need to rework how ordered triple data is stored. -const zip = (data: { x: number[]; y: number[]; z: number[] }) => { - const orderedTriple: Vec3[] = []; - for (let i = 0; i < data.x.length; i++) { - orderedTriple.push([data.x[i], data.y[i], data.z[i]]); - } - return orderedTriple; -}; - const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const { nodeError, nodeResult } = useNodeStatus(data.id); @@ -27,7 +16,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { useEffect(() => { if (scatter.current && nodeResult?.result?.data) { - const pts = zip(nodeResult.result.data as OrderedTripleData); + const pts = (nodeResult.result.data as OrderedTripleData).extra; scatter.current.updateData(pts); } @@ -35,7 +24,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { useEffect(() => { if (!scatter.current && canvas.current && nodeResult?.result?.data) { - const pts = zip(nodeResult.result.data as OrderedTripleData); + const pts = (nodeResult.result.data as OrderedTripleData).extra; scatter.current = new ScatterPlot3D(canvas.current, pts, { axes: { x: { diff --git a/src/feature/common/types/ResultsType.ts b/src/feature/common/types/ResultsType.ts index ad57e7655..b1a7ab2d8 100644 --- a/src/feature/common/types/ResultsType.ts +++ b/src/feature/common/types/ResultsType.ts @@ -1,5 +1,6 @@ import { OverridePlotData } from "@/types"; import { Layout } from "plotly.js"; +import { Vec3 } from "regl"; export type ResultIO = { cmd: string; @@ -18,7 +19,7 @@ export type Result = { layout: Partial | undefined; }; text_blob?: string; - data?: ScalarData | OrderedPairData; + data?: ScalarData | OrderedPairData | OrderedTripleData; }; export type ScalarData = { @@ -31,7 +32,5 @@ export type OrderedPairData = { }; export type OrderedTripleData = { - x: number[]; - y: number[]; - z: number[]; + extra: Vec3[]; }; diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 3d0d8cd6a..c0492a5a2 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -78,16 +78,14 @@ export class Camera { const onMouseMove = (ev: MouseEvent) => { const leftButtonPressed = ev.buttons & 1; - if (leftButtonPressed) { - ev.preventDefault(); - ev.stopPropagation(); - const dx = ev.movementX / window.innerWidth; - const dy = ev.movementY / window.innerHeight; - if (ev.ctrlKey) { - this.rotate(dx, dy); - } else { - this.pan(dx, dy); - } + ev.preventDefault(); + ev.stopPropagation(); + const dx = ev.movementX / window.innerWidth; + const dy = ev.movementY / window.innerHeight; + if (leftButtonPressed && ev.ctrlKey) { + this.rotate(dx, dy); + } else if (leftButtonPressed) { + this.pan(dx, dy); } }; @@ -114,8 +112,8 @@ export class Camera { this.state.theta += this.dtheta; this.state.phi = clamp( this.state.phi + this.dphi, - -Math.PI / 2.0, - Math.PI / 2.0, + -Math.PI / 2.1, + Math.PI / 2.1, ); this.state.distance = clamp( this.state.distance + this.ddistance, diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 08ed19410..9b482bbe4 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -38,14 +38,14 @@ export class Points implements Drawable { this.drawCommand = plot.regl({ frag: ` precision mediump float; - uniform vec4 color; + varying vec4 v_color; void main() { vec2 coord = gl_PointCoord - vec2(0.5); if (length(coord) > 0.5) { discard; } - gl_FragColor = color; + gl_FragColor = v_color; } `, vert: ` @@ -55,11 +55,14 @@ export class Points implements Drawable { uniform mat4 view, projection; uniform float size; + varying vec4 v_color; void main() { - vec4 pos = vec4(position, 1); + vec4 pos = vec4(position.x, position.z, position.y, 1); gl_PointSize = size; gl_Position = projection * view * pos; + float v = abs(mod(position.z, 2.0) - 1.0); + v_color = vec4(v, v, 0.6, 1); } `, attributes: { From f412ae7484ead7df6dd31a1c64a6f7f4206e46a8 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 6 Oct 2023 16:50:41 -0400 Subject: [PATCH 19/46] panning works properly now --- PYTHON/nodes | 2 +- src/lib/plot/camera.ts | 66 ++++++++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 4f7be307c..0b7963ab2 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 4f7be307c6a67b4cc992b48b3d7fbfc6cfb82110 +Subproject commit 0b7963ab246e36a60d95d41ec1e162cbaf3b0cdc diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index c0492a5a2..924b80bcd 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -16,12 +16,14 @@ export type CameraOptions = Partial<{ type CameraState = { view: mat4; projection: mat4; - center: Float32Array; + center: vec3; theta: number; phi: number; distance: number; - eye: Float32Array; - up: Float32Array; + eye: vec3; + up: vec3; + panLeft: vec3; + panUp: vec3; }; export class Camera { @@ -51,6 +53,8 @@ export class Camera { distance: Math.log(options?.distance ?? 10.0), eye: new Float32Array(3), up: new Float32Array(options?.up ?? [0, 1, 0]), + panLeft: new Float32Array(3), + panUp: new Float32Array(3), }; this.minDistance = Math.log(options?.minDistance ?? 0.1); @@ -76,6 +80,18 @@ export class Camera { }, {}), }); + const onMouseDown = (ev: MouseEvent) => { + console.log("bruh"); + ev.preventDefault(); + ev.stopPropagation(); + const vecs = this.getPanVectors(); + console.log("pan vectors"); + console.log(vecs.left); + console.log(vecs.forward); + this.state.panLeft = vecs.left; + this.state.panUp = vecs.forward; + }; + const onMouseMove = (ev: MouseEvent) => { const leftButtonPressed = ev.buttons & 1; ev.preventDefault(); @@ -95,6 +111,7 @@ export class Camera { this.ddistance += ev.deltaY / window.innerHeight / 5; }; + plot.canvas.addEventListener("mousedown", onMouseDown); plot.canvas.addEventListener("mousemove", onMouseMove); plot.canvas.addEventListener("wheel", onMouseWheel); } @@ -141,32 +158,17 @@ export class Camera { } private pan(dx: number, dy: number) { - const u = vec3.create(); - const v = vec3.create(); - vec3.normalize(u, this.state.eye); - vec3.scale(v, this.state.up, vec3.dot(u, this.state.up)); - const forward = vec3.normalize( - vec3.create(), - vec3.sub(vec3.create(), v, u), - ); - const left = vec3.normalize( - vec3.create(), - vec3.cross(vec3.create(), forward, u), - ); - - const flip = this.state.eye[1] > 0.0 ? -1 : 1; - vec3.scaleAndAdd( this.state.center, this.state.center, - forward, - -dy * 10 * flip, + this.state.panUp, + dy * 10, ); vec3.scaleAndAdd( this.state.center, this.state.center, - left, - dx * 10 * flip, + this.state.panLeft, + -dx * 10, ); } @@ -176,4 +178,24 @@ export class Camera { this.dtheta += w * dx; this.dphi += w * dy; } + + private getPanVectors() { + const u = vec3.create(); + const v = vec3.create(); + vec3.normalize(u, vec3.sub(u, this.state.eye, this.state.center)); + vec3.scale(v, this.state.up, vec3.dot(u, this.state.up)); + const forward = vec3.normalize( + vec3.create(), + vec3.sub(vec3.create(), v, u), + ); + const left = vec3.normalize( + vec3.create(), + vec3.cross(vec3.create(), forward, u), + ); + + return { + forward, + left, + }; + } } From 759e986e6187b50aa36824aaa334f1d0e48bb62c Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 6 Oct 2023 17:29:51 -0400 Subject: [PATCH 20/46] better panning --- src/lib/plot/camera.ts | 73 +++++++++++++++++------------------------- src/lib/plot/utils.ts | 8 +++++ 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 924b80bcd..9c5efcb4c 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -22,10 +22,11 @@ type CameraState = { distance: number; eye: vec3; up: vec3; - panLeft: vec3; - panUp: vec3; }; +const PHI_MAX = Math.PI / 2.1; +const PHI_MIN = -Math.PI / 2.1; + export class Camera { private readonly plot: Plot; private readonly right = new Float32Array([1, 0, 0]); @@ -53,8 +54,6 @@ export class Camera { distance: Math.log(options?.distance ?? 10.0), eye: new Float32Array(3), up: new Float32Array(options?.up ?? [0, 1, 0]), - panLeft: new Float32Array(3), - panUp: new Float32Array(3), }; this.minDistance = Math.log(options?.minDistance ?? 0.1); @@ -80,18 +79,6 @@ export class Camera { }, {}), }); - const onMouseDown = (ev: MouseEvent) => { - console.log("bruh"); - ev.preventDefault(); - ev.stopPropagation(); - const vecs = this.getPanVectors(); - console.log("pan vectors"); - console.log(vecs.left); - console.log(vecs.forward); - this.state.panLeft = vecs.left; - this.state.panUp = vecs.forward; - }; - const onMouseMove = (ev: MouseEvent) => { const leftButtonPressed = ev.buttons & 1; ev.preventDefault(); @@ -111,7 +98,6 @@ export class Camera { this.ddistance += ev.deltaY / window.innerHeight / 5; }; - plot.canvas.addEventListener("mousedown", onMouseDown); plot.canvas.addEventListener("mousemove", onMouseMove); plot.canvas.addEventListener("wheel", onMouseWheel); } @@ -127,11 +113,7 @@ export class Camera { const up = this.state.up; this.state.theta += this.dtheta; - this.state.phi = clamp( - this.state.phi + this.dphi, - -Math.PI / 2.1, - Math.PI / 2.1, - ); + this.state.phi = clamp(this.state.phi + this.dphi, PHI_MIN, PHI_MAX); this.state.distance = clamp( this.state.distance + this.ddistance, this.minDistance, @@ -158,18 +140,12 @@ export class Camera { } private pan(dx: number, dy: number) { - vec3.scaleAndAdd( - this.state.center, - this.state.center, - this.state.panUp, - dy * 10, - ); - vec3.scaleAndAdd( - this.state.center, - this.state.center, - this.state.panLeft, - -dx * 10, - ); + const { forward, left } = this.getPanVectors(); + console.log(this.state.eye); + console.log(this.state.center); + + vec3.scaleAndAdd(this.state.center, this.state.center, forward, dy * 10); + vec3.scaleAndAdd(this.state.center, this.state.center, left, -dx * 10); } private rotate(dx: number, dy: number) { @@ -182,16 +158,27 @@ export class Camera { private getPanVectors() { const u = vec3.create(); const v = vec3.create(); + vec3.normalize(u, vec3.sub(u, this.state.eye, this.state.center)); - vec3.scale(v, this.state.up, vec3.dot(u, this.state.up)); - const forward = vec3.normalize( - vec3.create(), - vec3.sub(vec3.create(), v, u), - ); - const left = vec3.normalize( - vec3.create(), - vec3.cross(vec3.create(), forward, u), - ); + const proj = vec3.dot(u, this.state.up); + + let forward: vec3; + let left: vec3; + + if (proj === 0) { + forward = vec3.normalize(u, vec3.scale(u, u, -1)); + left = vec3.normalize( + vec3.create(), + vec3.cross(vec3.create(), u, this.state.up), + ); + } else { + vec3.scale(v, this.state.up, proj); + forward = vec3.normalize(vec3.create(), vec3.sub(vec3.create(), v, u)); + left = vec3.normalize( + vec3.create(), + vec3.cross(vec3.create(), forward, u), + ); + } return { forward, diff --git a/src/lib/plot/utils.ts b/src/lib/plot/utils.ts index 0d1a10ad6..77525cf73 100644 --- a/src/lib/plot/utils.ts +++ b/src/lib/plot/utils.ts @@ -1,3 +1,11 @@ +import { vec3 } from "gl-matrix"; + export function clamp(x: number, lo: number, hi: number) { return Math.min(Math.max(x, lo), hi); } + +export function clampVector(v: vec3, maxLength: number) { + const l = vec3.length(v); + vec3.normalize(v, v); + return vec3.scale(v, v, Math.min(l, maxLength)); +} From 3b8729677443a7c3bccb2724b1c0e1db46eea546 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 6 Oct 2023 17:30:06 -0400 Subject: [PATCH 21/46] remove unused function --- src/lib/plot/utils.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/lib/plot/utils.ts b/src/lib/plot/utils.ts index 77525cf73..0d1a10ad6 100644 --- a/src/lib/plot/utils.ts +++ b/src/lib/plot/utils.ts @@ -1,11 +1,3 @@ -import { vec3 } from "gl-matrix"; - export function clamp(x: number, lo: number, hi: number) { return Math.min(Math.max(x, lo), hi); } - -export function clampVector(v: vec3, maxLength: number) { - const l = vec3.length(v); - vec3.normalize(v, v); - return vec3.scale(v, v, Math.min(l, maxLength)); -} From f6e7145d0824925fac6dbe27a5e8f12e33d1d23f Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 10 Oct 2023 14:35:05 -0400 Subject: [PATCH 22/46] plot cleanup functions --- src/lib/plot/plot.ts | 4 +++ src/lib/plot/plots/3d/scatter.ts | 45 +++++++++++++++++++++++++------- src/lib/plot/primitives/plane.ts | 9 ++++--- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts index b83316d9c..0e913cc15 100644 --- a/src/lib/plot/plot.ts +++ b/src/lib/plot/plot.ts @@ -67,4 +67,8 @@ export class Plot { this.draw(); }); } + + public destroy() { + this.regl.destroy(); + } } diff --git a/src/lib/plot/plots/3d/scatter.ts b/src/lib/plot/plots/3d/scatter.ts index 0197f7214..8ce7bfcba 100644 --- a/src/lib/plot/plots/3d/scatter.ts +++ b/src/lib/plot/plots/3d/scatter.ts @@ -1,7 +1,7 @@ import { Vec3, Vec4 } from "regl"; import { Plot } from "../../plot"; import { OrthogonalPlane, Points } from "../../primitives"; -import { Axis } from "../../types"; +import { Axis, Drawable } from "../../types"; import { CameraOptions } from "../../camera"; type ScatterPlot3DOptions = { @@ -12,6 +12,11 @@ type ScatterPlot3DOptions = { y: Axis; z: Axis; }; + showPlanes?: { + xy?: boolean; + xz?: boolean; + yz?: boolean; + }; cameraOptions?: Partial; }; @@ -49,23 +54,39 @@ export class ScatterPlot3D { }, }; - this.plot - .with([ - this.points, - new OrthogonalPlane(this.plot, { - orientation: "xz", - axes: [x, z], - }), + const showPlanes = options.showPlanes ?? { + xy: true, + xz: true, + yz: true, + }; + + const objects: Drawable[] = [this.points]; + if (showPlanes.xy) { + objects.push( new OrthogonalPlane(this.plot, { orientation: "xy", axes: [x, y], }), + ); + } + if (showPlanes.xz) { + objects.push( + new OrthogonalPlane(this.plot, { + orientation: "xz", + axes: [x, z], + }), + ); + } + if (showPlanes.yz) { + objects.push( new OrthogonalPlane(this.plot, { orientation: "yz", axes: [y, z], }), - ]) - .withCamera(options.cameraOptions); + ); + } + + this.plot.with(objects).withCamera(options.cameraOptions); } public draw() { @@ -79,4 +100,8 @@ export class ScatterPlot3D { public updateData(data: Vec3[]) { this.points.updateData(data); } + + public destroy() { + this.plot.destroy(); + } } diff --git a/src/lib/plot/primitives/plane.ts b/src/lib/plot/primitives/plane.ts index 4a422e9fd..6a6209372 100644 --- a/src/lib/plot/primitives/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -74,18 +74,19 @@ export class OrthogonalPlane implements Drawable { } private createVertices(options: OrthogonalPlaneOptions): Vec3[] { - const vertices = this.createXZPlaneVertices(options); + const vertices = this.createXYPlaneVertices(options); switch (options.orientation) { - case "xz": - return vertices; case "xy": + return vertices; + case "xz": return vertices.map((v) => [v[0], v[2], v[1]]); case "yz": return vertices.map((v) => [v[1], v[0], v[2]]); } } - private createXZPlaneVertices(options: OrthogonalPlaneOptions): Vec3[] { + // OpenGL considers Y to be up but we would like Z to be up instead + private createXYPlaneVertices(options: OrthogonalPlaneOptions): Vec3[] { const [a, b] = options.axes; const { domain: aDomain, step: aStep } = a; const { domain: bDomain, step: bStep } = b; From 8d465ab0f2abb214045e9005a36b5455fbaa6b43 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 10 Oct 2023 14:35:11 -0400 Subject: [PATCH 23/46] make ctrl update immutable --- src/hooks/useFlowChartGraph.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/hooks/useFlowChartGraph.ts b/src/hooks/useFlowChartGraph.ts index 7ca900809..75f21c797 100644 --- a/src/hooks/useFlowChartGraph.ts +++ b/src/hooks/useFlowChartGraph.ts @@ -66,7 +66,14 @@ export const useFlowChartGraph = () => { setNodes((element) => { const node = element.find((e) => e.id === nodeId); if (node) { - node.data.ctrls[inputData.param].value = inputData.value; + node.data.ctrls = { + ...node.data.ctrls, + [inputData.param]: { + ...node.data.ctrls[inputData.param], + value: inputData.value, + }, + }; + // node.data.ctrls[inputData.param].value = inputData.value; if (node.data.func === "CONSTANT" && inputData.param === "constant") { node.data.label = inputData.value?.toString() ?? "CONSTANT"; } From 0139864db59b7f400c3620c8d6d511f42de91e78 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 10 Oct 2023 14:35:25 -0400 Subject: [PATCH 24/46] more configurable scatter3d --- captain/models/topology.py | 131 +++++++++--------- src/components/nodes/visual/Scatter3DNode.tsx | 79 +++++++---- 2 files changed, 116 insertions(+), 94 deletions(-) diff --git a/captain/models/topology.py b/captain/models/topology.py index 631a35fad..8c0a70fa8 100644 --- a/captain/models/topology.py +++ b/captain/models/topology.py @@ -37,12 +37,11 @@ def __init__( self.time_start = 0 self.is_finished = False self.loop_nodes = ( - list() - ) # using list instead of set as we need to maintain order + list()) # using list instead of set as we need to maintain order def process_worker_response( - self, finished_job_fetch: JobSuccess | JobFailure - ) -> list[str] | None: + self, + finished_job_fetch: JobSuccess | JobFailure) -> list[str] | None: """ Handle when producer receives the consumer's response (worker response). Returns potential new tasks (jobs) to be run. @@ -53,32 +52,31 @@ def process_worker_response( # handle failed job if isinstance(finished_job_fetch, JobFailure): - self.process_job_result( - job_id=finished_job_fetch.node_id, job_result=None, success=False - ) + self.process_job_result(job_id=finished_job_fetch.node_id, + job_result=None, + success=False) # handle successful job elif isinstance(finished_job_fetch, JobSuccess): - logger.debug(f"{finished_job_fetch.node_id} finished at {time.time()}") + logger.debug( + f"{finished_job_fetch.node_id} finished at {time.time()}") return self.handle_finished_job( - finished_job_fetch, return_new_jobs=True - ) # return new jobs + finished_job_fetch, return_new_jobs=True) # return new jobs def run(self, task_queue: Queue[Any]): """ Topology entry point function for producer """ self.time_start = time.time() - next_jobs: list[str] = self.collect_ready_jobs() # get nodes with in-degree 0 + next_jobs: list[str] = self.collect_ready_jobs( + ) # get nodes with in-degree 0 self.run_jobs(next_jobs, task_queue) def collect_ready_jobs(self): next_jobs: list[str] = [] for job_id in cast(list[str], self.working_graph.nodes): - if ( - job_id not in self.finished_jobs - and self.original_graph.in_degree(job_id) == 0 - ): + if (job_id not in self.finished_jobs + and self.original_graph.in_degree(job_id) == 0): next_jobs.append(job_id) return next_jobs @@ -89,7 +87,8 @@ def run_jobs(self, jobs: list[str], task_queue: Queue[Any]): def run_job(self, job_id: str, task_queue: Queue[Any]): node = cast(dict[str, Any], self.working_graph.nodes[job_id]) - previous_jobs = self.get_job_dependencies_with_label(job_id, original=True) + previous_jobs = self.get_job_dependencies_with_label(job_id, + original=True) logger.debug( f" enqueue job: {self.get_label(job_id)}, dependencies: {[self.get_label(dep_id.get('job_id', ''), original=True) for dep_id in previous_jobs]}" @@ -105,8 +104,7 @@ def run_job(self, job_id: str, task_queue: Queue[Any]): iteration_id=job_id, ctrls=node["ctrls"], previous_jobs=previous_jobs, - ) - ) + )) self.queued_jobs.add(job_id) # ------------------- @@ -124,13 +122,16 @@ def cancel(self): def is_cancelled(self): return self.cancelled - def handle_finished_job(self, job: JobSuccess, return_new_jobs: bool = False): + def handle_finished_job(self, + job: JobSuccess, + return_new_jobs: bool = False): """ get the data from the worker response (flojoy package is responsible for sending to /worker_response endpoint) """ if self.cancelled: - logger.debug("Received job, but skipping since topology is cancelled") + logger.debug( + "Received job, but skipping since topology is cancelled") return time.sleep(self.node_delay) @@ -138,13 +139,13 @@ def handle_finished_job(self, job: JobSuccess, return_new_jobs: bool = False): job_id: str = job.node_id job_result = job.result - logger.debug(f"job {self.get_label(job_id)} is done and has been received.") + logger.debug( + f"job {self.get_label(job_id)} is done and has been received.") if job_id in self.queued_jobs: self.queued_jobs.remove(job_id) if job_id in self.finished_jobs: logging.warning( - f"{job_id} HAS ALREADY BEEN PROCESSED, NOT SUPPOSED TO HAPPEN" - ) + f"{job_id} HAS ALREADY BEEN PROCESSED, NOT SUPPOSED TO HAPPEN") return self.finished_jobs.add(job_id) @@ -156,9 +157,8 @@ def handle_finished_job(self, job: JobSuccess, return_new_jobs: bool = False): if return_new_jobs: return next_jobs - def process_job_result( - self, job_id: str, job_result: dict[str, Any] | None, success: bool - ): + def process_job_result(self, job_id: str, + job_result: dict[str, Any] | None, success: bool): """ process special instructions to scheduler """ @@ -190,24 +190,19 @@ def process_job_result( self.loop_nodes.pop() next_nodes = self.remove_edges_and_get_next(job_id, direction) next_nodes_from_dependencies = next_nodes_from_dependencies.union( - next_nodes - ) + next_nodes) - logger.debug( - "After removing edges of node, next nodes are: " - + str(next_nodes_from_dependencies) - ) + logger.debug("After removing edges of node, next nodes are: " + + str(next_nodes_from_dependencies)) nodes_to_add: list[str] = [] # -- verify if the flowchart is done running -- - if ( - self.queued_jobs.__len__() == 0 - and next_nodes_from_dependencies.__len__() == 0 - ): + if (self.queued_jobs.__len__() == 0 + and next_nodes_from_dependencies.__len__() == 0): if not self.loop_nodes: self.is_finished = True - logger.debug( + logger.critical( f"FLOWCHART TOOK {time.time() - self.time_start} SECONDS TO COMPLETE" ) self.cancel() @@ -224,14 +219,15 @@ def process_job_result( self.restart(node_id) for node_id in nodes_to_add: - if ( - self.working_graph.in_degree(node_id) == 0 - ): # check if no dependencies left for node + if (self.working_graph.in_degree(node_id) == 0 + ): # check if no dependencies left for node next_nodes_from_dependencies.add(node_id) return list(next_nodes_from_dependencies) - def remove_edges_and_get_next(self, job_id: str, label_direction: str = "default"): + def remove_edges_and_get_next(self, + job_id: str, + label_direction: str = "default"): """ this function removes the node edges and checks its successors for new jobs. A new job is ready when a sucessor has no dependencies. @@ -249,13 +245,13 @@ def remove_edges_and_get_next(self, job_id: str, label_direction: str = "default return next_nodes def restart(self, job_id: str): - logger.debug(f" *** restarting job: {self.get_label(job_id, original=True)}") + logger.debug( + f" *** restarting job: {self.get_label(job_id, original=True)}") if self.loop_nodes: self.loop_nodes.pop() graph = self.original_graph sub_graph: nx.MultiDiGraph = graph.subgraph( - [job_id] + list(nx.descendants(graph, job_id)) - ) + [job_id] + list(nx.descendants(graph, job_id))) original_edges = sub_graph.edges(data=True) self.working_graph.add_edges_from(original_edges) self.finished_jobs.remove(job_id) @@ -287,39 +283,40 @@ def remove_dependencies(self, job_id: str, label: str = "default"): for edge in edges: self.remove_dependency(edge[0], edge[1]) - def get_edges_by_label(self, job_id: str, label: str) -> list[tuple[str, Any, Any]]: + def get_edges_by_label(self, job_id: str, + label: str) -> list[tuple[str, Any, Any]]: edges = self.working_graph.edges(job_id, data=True) - edges = [ - (s, t, data) for (s, t, data) in edges if data.get("label", "") == label - ] + edges = [(s, t, data) for (s, t, data) in edges + if data.get("label", "") == label] return edges - def get_job_dependencies_with_label( - self, job_id: str, original: bool = True - ) -> list[dict[str, str]]: + def get_job_dependencies_with_label(self, + job_id: str, + original: bool = True + ) -> list[dict[str, str]]: graph = self.get_graph(original) try: deps = [] - for prev_job_id, _, data in list(graph.in_edges(job_id, data=True)): + for prev_job_id, _, data in list(graph.in_edges(job_id, + data=True)): input_name = data.get("target_label", "") multiple = data.get("multiple", False) edge_label = data.get("label", "") - deps.append( - { - "job_id": prev_job_id, - "input_name": input_name, - "multiple": multiple, - "edge": edge_label, - } - ) + deps.append({ + "job_id": prev_job_id, + "input_name": input_name, + "multiple": multiple, + "edge": edge_label, + }) logger.debug(f"deps: {deps}") return deps except Exception: return [] - def get_input_info( - self, source_job_id: str, target_job_id: str, original: bool = False - ) -> list[tuple[str, bool]]: + def get_input_info(self, + source_job_id: str, + target_job_id: str, + original: bool = False) -> list[tuple[str, bool]]: graph = self.get_graph(original) edge_data = graph.get_edge_data(source_job_id, target_job_id) target_label = "" @@ -408,12 +405,8 @@ def get_maximum_workers(self, maximum_capacity: int = 1): def get_outputs(self, job_id: str): out = self.working_graph.out_edges(job_id) return list( - set( - edge["label"] - for (u, v) in out - for edge in self.working_graph.get_edge_data(u, v).values() - ) - ) + set(edge["label"] for (u, v) in out + for edge in self.working_graph.get_edge_data(u, v).values())) def is_loop_node(self, job_id: str): node = cast( diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 04aa2aaae..5f794d151 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -7,6 +7,49 @@ import { memo, useEffect, useRef } from "react"; import Scatter3D from "@src/assets/nodes/3DScatter"; import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; +import { Vec3 } from "regl"; + +const initializePlot = ( + canvas: HTMLCanvasElement, + data: Vec3[], + params: CustomNodeProps["data"]["ctrls"], +) => { + return new ScatterPlot3D(canvas, data, { + axes: { + x: { + domain: [ + params["x_min"].value as number, + params["x_max"].value as number, + ], + step: params["x_step"].value as number, + }, + y: { + domain: [ + params["y_min"].value as number, + params["y_max"].value as number, + ], + step: params["y_step"].value as number, + }, + z: { + domain: [ + params["z_min"].value as number, + params["z_max"].value as number, + ], + step: params["z_step"].value as number, + }, + }, + showPlanes: { + xy: params["show_xy_plane"].value as boolean, + xz: params["show_xz_plane"].value as boolean, + yz: params["show_yz_plane"].value as boolean, + }, + cameraOptions: { + center: [2.5, 2.5, 2.5], + }, + color: [0.6, 0.96, 1, 1], + backgroundColor: [0.1, 0.1, 0.1, 1], + }); +}; const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const { nodeError, nodeResult } = useNodeStatus(data.id); @@ -23,32 +66,18 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { }, [nodeResult?.result.data]); useEffect(() => { - if (!scatter.current && canvas.current && nodeResult?.result?.data) { - const pts = (nodeResult.result.data as OrderedTripleData).extra; - scatter.current = new ScatterPlot3D(canvas.current, pts, { - axes: { - x: { - domain: [0, 10], - step: 1, - }, - y: { - domain: [0, 10], - step: 1, - }, - z: { - domain: [0, 10], - step: 1, - }, - }, - cameraOptions: { - center: [2.5, 2.5, 2.5], - }, - color: [0.6, 0.96, 1, 1], - backgroundColor: [0.1, 0.1, 0.1, 1], - }); - scatter.current.frame(); + if (scatter.current) { + scatter.current.destroy(); } - }, [nodeResult?.result.data]); + scatter.current = null; + }, [data.ctrls]); + + if (!scatter.current && canvas.current && nodeResult?.result?.data) { + const pts = (nodeResult.result.data as OrderedTripleData).extra; + const plot = initializePlot(canvas.current, pts, data.ctrls); + plot.frame(); + scatter.current = plot; + } if (!nodeResult?.result?.data) { return ( From fce568d12da9112d4560d059f78b24d96c9e0f0f Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 10 Oct 2023 20:33:14 -0400 Subject: [PATCH 25/46] more configurability --- src/components/nodes/visual/Scatter3DNode.tsx | 31 ++++++++++---- src/feature/common/types/ResultsType.ts | 7 +++- src/lib/plot/camera.ts | 14 +++---- src/lib/plot/plots/3d/scatter.ts | 41 +++++++++++++------ src/lib/plot/primitives/plane.ts | 8 ++-- src/lib/plot/primitives/points.ts | 27 +++++++----- 6 files changed, 85 insertions(+), 43 deletions(-) diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 5f794d151..e1a7fbe48 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -7,14 +7,18 @@ import { memo, useEffect, useRef } from "react"; import Scatter3D from "@src/assets/nodes/3DScatter"; import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; -import { Vec3 } from "regl"; +import { Vec3, Vec4 } from "regl"; const initializePlot = ( canvas: HTMLCanvasElement, - data: Vec3[], + initialData: { + points: Vec3[]; + colors?: Vec4 | Vec4[]; + }, params: CustomNodeProps["data"]["ctrls"], ) => { - return new ScatterPlot3D(canvas, data, { + return new ScatterPlot3D(canvas, initialData.points, { + pointSize: 2, axes: { x: { domain: [ @@ -46,7 +50,7 @@ const initializePlot = ( cameraOptions: { center: [2.5, 2.5, 2.5], }, - color: [0.6, 0.96, 1, 1], + colors: initialData.colors, backgroundColor: [0.1, 0.1, 0.1, 1], }); }; @@ -59,9 +63,11 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { useEffect(() => { if (scatter.current && nodeResult?.result?.data) { - const pts = (nodeResult.result.data as OrderedTripleData).extra; + const resultData = nodeResult.result.data as OrderedTripleData; + const pts = resultData.v; + const colors = resultData.extra?.colors; - scatter.current.updateData(pts); + scatter.current.updateData(pts, colors); } }, [nodeResult?.result.data]); @@ -73,8 +79,17 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { }, [data.ctrls]); if (!scatter.current && canvas.current && nodeResult?.result?.data) { - const pts = (nodeResult.result.data as OrderedTripleData).extra; - const plot = initializePlot(canvas.current, pts, data.ctrls); + const resultData = nodeResult.result.data as OrderedTripleData; + const pts = resultData.v; + const colors = resultData.extra?.colors; + const plot = initializePlot( + canvas.current, + { + points: pts, + colors, + }, + data.ctrls, + ); plot.frame(); scatter.current = plot; } diff --git a/src/feature/common/types/ResultsType.ts b/src/feature/common/types/ResultsType.ts index b1a7ab2d8..c73c5ebe3 100644 --- a/src/feature/common/types/ResultsType.ts +++ b/src/feature/common/types/ResultsType.ts @@ -1,6 +1,6 @@ import { OverridePlotData } from "@/types"; import { Layout } from "plotly.js"; -import { Vec3 } from "regl"; +import { Vec3, Vec4 } from "regl"; export type ResultIO = { cmd: string; @@ -32,5 +32,8 @@ export type OrderedPairData = { }; export type OrderedTripleData = { - extra: Vec3[]; + v: Vec3[]; + extra?: { + colors: Vec4[]; + }; }; diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 9c5efcb4c..2f75073ad 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -32,7 +32,7 @@ export class Camera { private readonly right = new Float32Array([1, 0, 0]); private readonly front = new Float32Array([0, 0, 1]); private readonly minDistance: number; - private readonly maxDistance: number; + // private readonly maxDistance: number; private state: CameraState; @@ -57,7 +57,7 @@ export class Camera { }; this.minDistance = Math.log(options?.minDistance ?? 0.1); - this.maxDistance = Math.log(options?.maxDistance ?? 1000); + // this.maxDistance = Math.log(options?.maxDistance ?? 1000); this.plot = plot; @@ -83,8 +83,8 @@ export class Camera { const leftButtonPressed = ev.buttons & 1; ev.preventDefault(); ev.stopPropagation(); - const dx = ev.movementX / window.innerWidth; - const dy = ev.movementY / window.innerHeight; + const dx = (ev.movementX / window.innerWidth) * 2; + const dy = (ev.movementY / window.innerHeight) * 2; if (leftButtonPressed && ev.ctrlKey) { this.rotate(dx, dy); } else if (leftButtonPressed) { @@ -95,7 +95,7 @@ export class Camera { const onMouseWheel = (ev: WheelEvent) => { ev.preventDefault(); ev.stopPropagation(); - this.ddistance += ev.deltaY / window.innerHeight / 5; + this.ddistance += ev.deltaY / window.innerHeight; }; plot.canvas.addEventListener("mousemove", onMouseMove); @@ -114,10 +114,10 @@ export class Camera { this.state.theta += this.dtheta; this.state.phi = clamp(this.state.phi + this.dphi, PHI_MIN, PHI_MAX); - this.state.distance = clamp( + this.state.distance = Math.max( this.state.distance + this.ddistance, this.minDistance, - this.maxDistance, + // this.maxDistance, ); this.dtheta = 0; diff --git a/src/lib/plot/plots/3d/scatter.ts b/src/lib/plot/plots/3d/scatter.ts index 8ce7bfcba..955e69561 100644 --- a/src/lib/plot/plots/3d/scatter.ts +++ b/src/lib/plot/plots/3d/scatter.ts @@ -4,21 +4,35 @@ import { OrthogonalPlane, Points } from "../../primitives"; import { Axis, Drawable } from "../../types"; import { CameraOptions } from "../../camera"; -type ScatterPlot3DOptions = { - color?: Vec4; - backgroundColor?: Vec4; - axes?: { +const point3dAverage = (points: Vec3[]): Vec3 => { + const n = points.length; + const res = [0, 0, 0]; + + for (const p of points) { + res[0] += p[0]; + res[1] += p[1]; + res[2] += p[2]; + } + + return [res[0] / n, res[1] / n, res[2] / n]; +}; + +type ScatterPlot3DOptions = Partial<{ + pointSize: number; + colors: Vec4 | Vec4[]; + backgroundColor: Vec4; + axes: { x: Axis; y: Axis; z: Axis; }; - showPlanes?: { + showPlanes: { xy?: boolean; xz?: boolean; yz?: boolean; }; - cameraOptions?: Partial; -}; + cameraOptions: CameraOptions; +}>; export class ScatterPlot3D { private plot: Plot; @@ -32,10 +46,10 @@ export class ScatterPlot3D { this.plot = new Plot(canvas, options); this.points = new Points( this.plot, - { pointSize: 5 }, + { pointSize: options.pointSize ?? 5 }, { points: data, - color: options.color, + colors: options.colors, }, ); @@ -86,7 +100,10 @@ export class ScatterPlot3D { ); } - this.plot.with(objects).withCamera(options.cameraOptions); + this.plot.with(objects).withCamera({ + center: point3dAverage(data), + ...options.cameraOptions, + }); } public draw() { @@ -97,8 +114,8 @@ export class ScatterPlot3D { this.plot.frame(); } - public updateData(data: Vec3[]) { - this.points.updateData(data); + public updateData(data: Vec3[], colors?: Vec4 | Vec4[]) { + this.points.updateData(data, colors); } public destroy() { diff --git a/src/lib/plot/primitives/plane.ts b/src/lib/plot/primitives/plane.ts index 6a6209372..33c58fb69 100644 --- a/src/lib/plot/primitives/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -74,11 +74,11 @@ export class OrthogonalPlane implements Drawable { } private createVertices(options: OrthogonalPlaneOptions): Vec3[] { - const vertices = this.createXYPlaneVertices(options); + const vertices = this.createXZPlaneVertices(options); switch (options.orientation) { - case "xy": - return vertices; case "xz": + return vertices; + case "xy": return vertices.map((v) => [v[0], v[2], v[1]]); case "yz": return vertices.map((v) => [v[1], v[0], v[2]]); @@ -86,7 +86,7 @@ export class OrthogonalPlane implements Drawable { } // OpenGL considers Y to be up but we would like Z to be up instead - private createXYPlaneVertices(options: OrthogonalPlaneOptions): Vec3[] { + private createXZPlaneVertices(options: OrthogonalPlaneOptions): Vec3[] { const [a, b] = options.axes; const { domain: aDomain, step: aStep } = a; const { domain: bDomain, step: bStep } = b; diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 9b482bbe4..700533cb7 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -2,30 +2,33 @@ import { Vec3, DrawCommand, Vec4 } from "regl"; import { Drawable } from "../types"; import { Plot } from "../plot"; +const DEFAULT_COLOR = [0.6, 0.96, 1, 1]; + type Props = { points: Vec3[]; count: number; - color?: Vec4; + colors?: Vec4 | Vec4[]; }; type Uniforms = { size: number; - color: Vec4; }; type Attributes = { position: Vec3[]; + color: Vec4 | Vec4[]; }; type PointsOptions = { pointSize: number; }; +// TODO: Make this scale better with small values export class Points implements Drawable { private readonly drawCommand: DrawCommand; private points: Vec3[]; private count: number; - private color?: Vec4; + private colors?: Vec4 | Vec4[]; constructor( plot: Plot, @@ -34,7 +37,7 @@ export class Points implements Drawable { ) { this.points = initialProps.points; this.count = initialProps.points.length; - this.color = initialProps.color; + this.colors = initialProps.colors; this.drawCommand = plot.regl({ frag: ` precision mediump float; @@ -52,26 +55,27 @@ export class Points implements Drawable { precision mediump float; attribute vec3 position; + attribute vec4 color; uniform mat4 view, projection; uniform float size; + varying vec4 v_color; void main() { - vec4 pos = vec4(position.x, position.z, position.y, 1); + vec4 pos = vec4(position, 1); gl_PointSize = size; gl_Position = projection * view * pos; - float v = abs(mod(position.z, 2.0) - 1.0); - v_color = vec4(v, v, 0.6, 1); + v_color = color; } `, attributes: { position: plot.regl.prop("points"), + color: plot.regl.prop("colors"), }, uniforms: { size: options.pointSize, - color: plot.regl.prop("color"), }, count: plot.regl.prop("count"), @@ -79,16 +83,19 @@ export class Points implements Drawable { }); } - public updateData(data: Vec3[]) { + public updateData(data: Vec3[], colors?: Vec4 | Vec4[]) { this.points = data; this.count = data.length; + if (colors) { + this.colors = colors; + } } public draw() { this.drawCommand({ points: this.points, count: this.count, - color: this.color ?? [1, 0, 0, 1], + colors: this.colors ?? DEFAULT_COLOR, }); } } From cf2f8bb23a011aa5d9e12285772f5571c09e2df2 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:21:25 -0400 Subject: [PATCH 26/46] fix up plot lib --- pkgs/flojoy/flojoy/__init__.pyi | 1 + pkgs/flojoy/flojoy/flojoy_python.py | 46 +- pkgs/flojoy/flojoy/job_result_utils.py | 34 +- pkgs/flojoy/flojoy/utils.py | 16 +- pnpm-lock.yaml | 24 + poetry.lock | 936 ++++++++++-------- pyproject.toml | 4 +- src/components/nodes/visual/BigNumberNode.tsx | 3 +- src/components/nodes/visual/Scatter3DNode.tsx | 15 +- src/components/nodes/visual/ScatterNode.tsx | 32 +- src/components/nodes/visual/plotConstants.ts | 18 + src/lib/plot/primitives/points.ts | 10 +- 12 files changed, 633 insertions(+), 506 deletions(-) create mode 100644 src/components/nodes/visual/plotConstants.ts diff --git a/pkgs/flojoy/flojoy/__init__.pyi b/pkgs/flojoy/flojoy/__init__.pyi index ffd98d654..3963b5e33 100644 --- a/pkgs/flojoy/flojoy/__init__.pyi +++ b/pkgs/flojoy/flojoy/__init__.pyi @@ -27,4 +27,5 @@ def flojoy( deps: Optional[dict[str, str]] = None, inject_node_metadata: bool = False, inject_connection: bool = False, + forward_result: bool = False ) -> Callable[..., DataContainer | dict[str, Any] | None]: ... diff --git a/pkgs/flojoy/flojoy/flojoy_python.py b/pkgs/flojoy/flojoy/flojoy_python.py index bbe41747e..193fa55dd 100644 --- a/pkgs/flojoy/flojoy/flojoy_python.py +++ b/pkgs/flojoy/flojoy/flojoy_python.py @@ -49,10 +49,8 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): multiple = prev_job.get("multiple", False) edge = prev_job.get("edge", "") - logger.debug( - f"fetching input from prev job id: {prev_job_id}" - + f"for input: {input_name} edge: {edge}" - ) + logger.debug(f"fetching input from prev job id: {prev_job_id}" + + f"for input: {input_name} edge: {edge}") job_result = JobService().get_job_result(prev_job_id) if not job_result: @@ -60,11 +58,8 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): f"Tried to get job result from {prev_job_id} but it was None" ) - result = ( - get_dc_from_result(job_result[edge]) - if edge != "default" - else get_dc_from_result(job_result) - ) + result = (get_dc_from_result(job_result[edge]) + if edge != "default" else get_dc_from_result(job_result)) if result is not None: logger.debug(f"got job result from {prev_job_id}") if multiple: @@ -82,9 +77,9 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): class DefaultParams: - def __init__( - self, node_id: str, job_id: str, jobset_id: str, node_type: str - ) -> None: + + def __init__(self, node_id: str, job_id: str, jobset_id: str, + node_type: str) -> None: self.node_id = node_id self.job_id = job_id self.jobset_id = jobset_id @@ -107,9 +102,8 @@ def __exit__(self, *exc): return False -def display( - original_function: Callable[..., DataContainer | dict[str, Any]] | None = None -): +def display(original_function: Callable[..., DataContainer | dict[str, Any]] + | None = None): return original_function @@ -121,6 +115,7 @@ def flojoy( deps: Optional[dict[str, str]] = None, inject_node_metadata: bool = False, inject_connection: bool = False, + forward_result: bool = False, ): """ Decorator to turn Python functions with numerical return @@ -165,7 +160,8 @@ def SINE(dc_inputs:list[DataContainer], params:dict[str, Any]): ``` """ - def decorator(func: Callable[..., Optional[DataContainer | dict[str, Any]]]): + def decorator(func: Callable[..., + Optional[DataContainer | dict[str, Any]]]): # Wrap func here to override the HF_HOME env var func = cache_huggingface_to_flojoy()(func) @@ -185,7 +181,8 @@ def wrapper( for _, input in ctrls.items(): param = input["param"] value = input["value"] - func_params[param] = format_param_value(value, input["type"]) + func_params[param] = format_param_value( + value, input["type"]) func_params["type"] = "default" logger.debug( @@ -216,7 +213,8 @@ def wrapper( # check if node has an init container and if so, inject it if NodeInitService().has_init_store(node_id): - args["init_container"] = NodeInitService().get_init_store(node_id) + args["init_container"] = NodeInitService().get_init_store( + node_id) if inject_connection: logger.debug("injecting connection") @@ -228,10 +226,8 @@ def wrapper( # This fixes when people forget to add `= None` in # default: Optional[DataContainer] = None - if ( - "default" not in args - and "default" in inspect.signature(func).parameters.keys() - ): + if ("default" not in args and "default" + in inspect.signature(func).parameters.keys()): args["default"] = None ########################## @@ -244,8 +240,7 @@ def wrapper( # some special nodes like LOOP return dict instead of `DataContainer` if isinstance(dc_obj, DataContainer) and not isinstance( - dc_obj, Stateful - ): + dc_obj, Stateful): dc_obj.validate() # Validate returned DataContainer object elif dc_obj is not None: for value in dc_obj.values(): @@ -257,7 +252,8 @@ def wrapper( # Package the result and return it FN = func.__name__ - result = get_frontend_res_obj_from_result(dc_obj) + result = get_frontend_res_obj_from_result( + dc_obj, forward_result) return JobSuccess( result=result, fn=FN, diff --git a/pkgs/flojoy/flojoy/job_result_utils.py b/pkgs/flojoy/flojoy/job_result_utils.py index f1a5d9bed..403d3b830 100644 --- a/pkgs/flojoy/flojoy/job_result_utils.py +++ b/pkgs/flojoy/flojoy/job_result_utils.py @@ -4,14 +4,14 @@ from .dao import Dao from typing import Any, cast, Optional -__all__ = ["get_job_result", "get_next_directions", "get_next_nodes", "get_job_result"] +__all__ = [ + "get_job_result", "get_next_directions", "get_next_nodes", "get_job_result" +] def is_flow_controled(result: dict[str, Any] | DataContainer): - if ( - FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS in result - or FLOJOY_INSTRUCTION.FLOW_TO_NODES in result - ): + if (FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS in result + or FLOJOY_INSTRUCTION.FLOW_TO_NODES in result): return True return False @@ -23,11 +23,9 @@ def get_next_directions(result: dict[str, Any] | None) -> list[str] | None: if not result.get(FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS): for value in result.values(): if isinstance(value, dict) and value.get( - FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS - ): - direction = cast( - list[str], value[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS] - ) + FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS): + direction = cast(list[str], + value[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS]) break else: direction = result[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS] @@ -41,8 +39,7 @@ def get_next_nodes(result: dict[str, Any] | None) -> list[str]: def get_dc_from_result( - result: dict[str, Any] | DataContainer | None -) -> DataContainer | None: + result: dict[str, Any] | DataContainer | None) -> DataContainer | None: if not result: return None if isinstance(result, DataContainer): @@ -55,7 +52,8 @@ def get_dc_from_result( def get_job_result(job_id: str) -> dict[str, Any] | DataContainer | None: try: job_result: Any = Dao.get_instance().get_job_result(job_id) - result = get_dc_from_result(cast(dict[str, Any] | DataContainer, job_result)) + result = get_dc_from_result( + cast(dict[str, Any] | DataContainer, job_result)) return result except Exception: return None @@ -72,11 +70,15 @@ def get_text_blob_from_dc(dc: DataContainer) -> str | None: def get_frontend_res_obj_from_result( - result: Optional[dict[str, Any] | DataContainer] -) -> Optional[dict[str, Any]]: + result: Optional[dict[str, Any] | DataContainer], + forward_result: bool = False) -> Optional[dict[str, Any]]: if result is None: return None + if forward_result: + if isinstance(result, DataContainer): + return {"data": result} + # Only return a plotly fig if it is a viz node match result: case Plotly() | TextBlob() | Bytes(): @@ -107,4 +109,4 @@ def get_frontend_res_obj_from_result( "text_blob": text_blob, } keys = list(result.keys()) - return get_frontend_res_obj_from_result(result[keys[0]]) + return get_frontend_res_obj_from_result(result[keys[0]], ) diff --git a/pkgs/flojoy/flojoy/utils.py b/pkgs/flojoy/flojoy/utils.py index 0ea58592b..c92be5eb0 100644 --- a/pkgs/flojoy/flojoy/utils.py +++ b/pkgs/flojoy/flojoy/utils.py @@ -23,7 +23,6 @@ import base64 from .CONSTANTS import FLOJOY_DIR, FLOJOY_CACHE_DIR, CREDENTIAL_FILE - __all__ = [ "get_env_var", "set_env_var", @@ -36,7 +35,6 @@ "clear_flojoy_memory", ] - # # package result # def package_result(result: dict | None, fn: str, node_id: str, jobset_id: str) -> dict: # return { @@ -55,6 +53,7 @@ # "FAILED_NODES": {node_id: str(error)}, # "jobsetId": jobset_id, # } +# # Make as a function to mock at test-time @@ -138,13 +137,13 @@ def encode(self, o: Any): # 1. `loads` to switch Infinity, -Infinity, NaN to None # 2. `dumps` again so you get 'null' instead of extended JSON try: - new_o = _json.loads(encoded_o, parse_constant=self.coerce_to_strict) + new_o = _json.loads(encoded_o, + parse_constant=self.coerce_to_strict) except ValueError: # invalid separators will fail here. raise a helpful exception raise ValueError( "Encoding into strict JSON failed. Did you set the separators " - "valid JSON separators?" - ) + "valid JSON separators?") else: return _json.dumps( new_o, @@ -281,11 +280,8 @@ class NotEncodable(Exception): def dump_str(result: Any, limit: int | None = None): result_str = str(result) - return ( - result_str - if limit is None or len(result_str) <= limit - else result_str[:limit] + "..." - ) + return (result_str if limit is None or len(result_str) <= limit else + result_str[:limit] + "...") def get_flojoy_root_dir() -> str: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92bffba2d..c05605184 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,6 +62,9 @@ dependencies: axios: specifier: ^1.5.1 version: 1.5.1 + candygraph: + specifier: ^0.10.0 + version: 0.10.0 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -92,6 +95,9 @@ dependencies: framer-motion: specifier: ^10.16.4 version: 10.16.4(react-dom@18.2.0)(react@18.2.0) + gl-matrix: + specifier: ^3.4.3 + version: 3.4.3 html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -173,6 +179,9 @@ dependencies: reactflow: specifier: ^11.9.3 version: 11.9.3(@types/react@18.2.28)(immer@10.0.3)(react-dom@18.2.0)(react@18.2.0) + regl: + specifier: ^2.1.0 + version: 2.1.0 sonner: specifier: ^1.0.3 version: 1.0.3(react-dom@18.2.0)(react@18.2.0) @@ -5547,6 +5556,13 @@ packages: engines: {node: '>=10'} dev: true + /candygraph@0.10.0: + resolution: {integrity: sha512-8jQl+fNpRzAgjg5J3jkV0CffHnCWC3atqGTkpUkGbZksNa5BFu7GpfJO4rfFRaVrjPQlbfI5ONCbI9kVIH2pQg==} + dependencies: + gl-matrix: 3.4.3 + regl: 2.1.0 + dev: false + /caniuse-lite@1.0.30001547: resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} dev: true @@ -7463,6 +7479,10 @@ packages: assert-plus: 1.0.0 dev: true + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -10749,6 +10769,10 @@ packages: jsesc: 0.5.0 dev: true + /regl@2.1.0: + resolution: {integrity: sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg==} + dev: false + /release-zalgo@1.0.0: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} diff --git a/poetry.lock b/poetry.lock index 9b561a0be..7a6985c83 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "annotated-types" -version = "0.5.0" +version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, - {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] [[package]] @@ -110,13 +110,13 @@ aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.14.0" +version = "1.14.1" description = "Microsoft Azure Identity Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-identity-1.14.0.zip", hash = "sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1"}, - {file = "azure_identity-1.14.0-py3-none-any.whl", hash = "sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b"}, + {file = "azure-identity-1.14.1.zip", hash = "sha256:48e2a9dbdc59b4f095f841d867d9a8cbe4c1cdbbad8251e055561afd47b4a9b8"}, + {file = "azure_identity-1.14.1-py3-none-any.whl", hash = "sha256:3a5bef8e9c3281e864e869739be8d67424bff616cddae96b546ca2a5168d863d"}, ] [package.dependencies] @@ -138,33 +138,29 @@ files = [ [[package]] name = "black" -version = "23.9.1" +version = "23.10.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, - {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, - {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, - {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, - {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, - {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, - {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, - {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, - {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, - {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, - {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, + {file = "black-23.10.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:f8dc7d50d94063cdfd13c82368afd8588bac4ce360e4224ac399e769d6704e98"}, + {file = "black-23.10.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:f20ff03f3fdd2fd4460b4f631663813e57dc277e37fb216463f3b907aa5a9bdd"}, + {file = "black-23.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3d9129ce05b0829730323bdcb00f928a448a124af5acf90aa94d9aba6969604"}, + {file = "black-23.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:960c21555be135c4b37b7018d63d6248bdae8514e5c55b71e994ad37407f45b8"}, + {file = "black-23.10.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:30b78ac9b54cf87bcb9910ee3d499d2bc893afd52495066c49d9ee6b21eee06e"}, + {file = "black-23.10.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:0e232f24a337fed7a82c1185ae46c56c4a6167fb0fe37411b43e876892c76699"}, + {file = "black-23.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31946ec6f9c54ed7ba431c38bc81d758970dd734b96b8e8c2b17a367d7908171"}, + {file = "black-23.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:c870bee76ad5f7a5ea7bd01dc646028d05568d33b0b09b7ecfc8ec0da3f3f39c"}, + {file = "black-23.10.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:6901631b937acbee93c75537e74f69463adaf34379a04eef32425b88aca88a23"}, + {file = "black-23.10.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:481167c60cd3e6b1cb8ef2aac0f76165843a374346aeeaa9d86765fe0dd0318b"}, + {file = "black-23.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74892b4b836e5162aa0452393112a574dac85e13902c57dfbaaf388e4eda37c"}, + {file = "black-23.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:47c4510f70ec2e8f9135ba490811c071419c115e46f143e4dce2ac45afdcf4c9"}, + {file = "black-23.10.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:76baba9281e5e5b230c9b7f83a96daf67a95e919c2dfc240d9e6295eab7b9204"}, + {file = "black-23.10.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:a3c2ddb35f71976a4cfeca558848c2f2f89abc86b06e8dd89b5a65c1e6c0f22a"}, + {file = "black-23.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db451a3363b1e765c172c3fd86213a4ce63fb8524c938ebd82919bf2a6e28c6a"}, + {file = "black-23.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:7fb5fc36bb65160df21498d5a3dd330af8b6401be3f25af60c6ebfe23753f747"}, + {file = "black-23.10.0-py3-none-any.whl", hash = "sha256:e223b731a0e025f8ef427dd79d8cd69c167da807f5710add30cdf131f13dd62e"}, + {file = "black-23.10.0.tar.gz", hash = "sha256:31b9f87b277a68d0e99d2905edae08807c007973eaa609da5f0c62def6b7c0bd"}, ] [package.dependencies] @@ -638,13 +634,13 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cycler" -version = "0.12.0" +version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" files = [ - {file = "cycler-0.12.0-py3-none-any.whl", hash = "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947"}, - {file = "cycler-0.12.0.tar.gz", hash = "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] [package.extras] @@ -783,12 +779,12 @@ typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "flojoy" -version = "0.1.15" +version = "0.1.16" description = "" optional = false python-versions = "~3.10" files = [] -develop = false +develop = true [package.dependencies] cloudpickle = "~2" @@ -815,53 +811,53 @@ url = "pkgs/flojoy" [[package]] name = "fonttools" -version = "4.43.0" +version = "4.43.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef"}, - {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213"}, - {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84"}, - {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3"}, - {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef"}, - {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803"}, - {file = "fonttools-4.43.0-cp310-cp310-win32.whl", hash = "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1"}, - {file = "fonttools-4.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38"}, - {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465"}, - {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92"}, - {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd"}, - {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64"}, - {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a"}, - {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9"}, - {file = "fonttools-4.43.0-cp311-cp311-win32.whl", hash = "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e"}, - {file = "fonttools-4.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186"}, - {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3"}, - {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f"}, - {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92"}, - {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69"}, - {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7"}, - {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a"}, - {file = "fonttools-4.43.0-cp312-cp312-win32.whl", hash = "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f"}, - {file = "fonttools-4.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348"}, - {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289"}, - {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3"}, - {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126"}, - {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662"}, - {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe"}, - {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544"}, - {file = "fonttools-4.43.0-cp38-cp38-win32.whl", hash = "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646"}, - {file = "fonttools-4.43.0-cp38-cp38-win_amd64.whl", hash = "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836"}, - {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1"}, - {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da"}, - {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c"}, - {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb"}, - {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce"}, - {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e"}, - {file = "fonttools-4.43.0-cp39-cp39-win32.whl", hash = "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1"}, - {file = "fonttools-4.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f"}, - {file = "fonttools-4.43.0-py3-none-any.whl", hash = "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384"}, - {file = "fonttools-4.43.0.tar.gz", hash = "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e"}, + {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273"}, + {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c"}, + {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca"}, + {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6"}, + {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184"}, + {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7"}, + {file = "fonttools-4.43.1-cp310-cp310-win32.whl", hash = "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02"}, + {file = "fonttools-4.43.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef"}, + {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b"}, + {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f"}, + {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0"}, + {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8"}, + {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd"}, + {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b"}, + {file = "fonttools-4.43.1-cp311-cp311-win32.whl", hash = "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204"}, + {file = "fonttools-4.43.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8"}, + {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5"}, + {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c"}, + {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680"}, + {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215"}, + {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3"}, + {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b"}, + {file = "fonttools-4.43.1-cp312-cp312-win32.whl", hash = "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f"}, + {file = "fonttools-4.43.1-cp312-cp312-win_amd64.whl", hash = "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72"}, + {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590"}, + {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7"}, + {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6"}, + {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d"}, + {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0"}, + {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933"}, + {file = "fonttools-4.43.1-cp38-cp38-win32.whl", hash = "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b"}, + {file = "fonttools-4.43.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896"}, + {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba"}, + {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13"}, + {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477"}, + {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860"}, + {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86"}, + {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3"}, + {file = "fonttools-4.43.1-cp39-cp39-win32.whl", hash = "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad"}, + {file = "fonttools-4.43.1-cp39-cp39-win_amd64.whl", hash = "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a"}, + {file = "fonttools-4.43.1-py3-none-any.whl", hash = "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9"}, + {file = "fonttools-4.43.1.tar.gz", hash = "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212"}, ] [package.extras] @@ -947,13 +943,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.23.2" +version = "2.23.3" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.2.tar.gz", hash = "sha256:5a9af4be520ba33651471a0264eead312521566f44631cbb621164bc30c8fd40"}, - {file = "google_auth-2.23.2-py2.py3-none-any.whl", hash = "sha256:c2e253347579d483004f17c3bd0bf92e611ef6c7ba24d41c5c59f2e7aeeaf088"}, + {file = "google-auth-2.23.3.tar.gz", hash = "sha256:6864247895eea5d13b9c57c9e03abb49cb94ce2dc7c58e91cba3248c7477c9e3"}, + {file = "google_auth-2.23.3-py2.py3-none-any.whl", hash = "sha256:a8f4608e65c244ead9e0538f181a96c6e11199ec114d41f1d7b1bffa96937bda"}, ] [package.dependencies] @@ -970,13 +966,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "googleapis-common-protos" -version = "1.60.0" +version = "1.61.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, - {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, ] [package.dependencies] @@ -1016,32 +1012,36 @@ test = ["netCDF4", "pytest"] [[package]] name = "h5py" -version = "3.9.0" +version = "3.10.0" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.8" files = [ - {file = "h5py-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb7bdd5e601dd1739698af383be03f3dad0465fe67184ebd5afca770f50df9d6"}, - {file = "h5py-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:78e44686334cbbf2dd21d9df15823bc38663f27a3061f6a032c68a3e30c47bf7"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68b41efd110ce9af1cbe6fa8af9f4dcbadace6db972d30828b911949e28fadd"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12aa556d540f11a2cae53ea7cfb94017353bd271fb3962e1296b342f6550d1b8"}, - {file = "h5py-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d97409e17915798029e297a84124705c8080da901307ea58f29234e09b073ddc"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:551e358db05a874a0f827b22e95b30092f2303edc4b91bb62ad2f10e0236e1a0"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6822a814b9d8b8363ff102f76ea8d026f0ca25850bb579d85376029ee3e73b93"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f01202cdea754ab4227dd27014bdbd561a4bbe4b631424fd812f7c2ce9c6ac"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64acceaf6aff92af091a4b83f6dee3cf8d3061f924a6bb3a33eb6c4658a8348b"}, - {file = "h5py-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:804c7fb42a34c8ab3a3001901c977a5c24d2e9c586a0f3e7c0a389130b4276fc"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d9492391ff5c3c80ec30ae2fe82a3f0efd1e750833739c25b0d090e3be1b095"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da9e7e63376c32704e37ad4cea2dceae6964cee0d8515185b3ab9cbd6b947bc"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e20897c88759cbcbd38fb45b507adc91af3e0f67722aa302d71f02dd44d286"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf5225543ca35ce9f61c950b73899a82be7ba60d58340e76d0bd42bf659235a"}, - {file = "h5py-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:36408f8c62f50007d14e000f9f3acf77e103b9e932c114cbe52a3089e50ebf94"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23e74b878bbe1653ab34ca49b83cac85529cd0b36b9d625516c5830cc5ca2eac"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f457089c5d524b7998e3649bc63240679b8fb0a3859ea53bbb06841f3d755f1"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6284061f3214335e1eec883a6ee497dbe7a79f19e6a57fed2dd1f03acd5a8cb"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7a745efd0d56076999b52e8da5fad5d30823bac98b59c68ae75588d09991a"}, - {file = "h5py-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:79bbca34696c6f9eeeb36a91776070c49a060b2879828e2c8fa6c58b8ed10dd1"}, - {file = "h5py-3.9.0.tar.gz", hash = "sha256:e604db6521c1e367c6bd7fad239c847f53cc46646f2d2651372d05ae5e95f817"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, + {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, + {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, + {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, + {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, + {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, + {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, + {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, ] [package.dependencies] @@ -1049,46 +1049,47 @@ numpy = ">=1.17.3" [[package]] name = "httptools" -version = "0.6.0" +version = "0.6.1" description = "A collection of framework independent HTTP protocol utils." optional = false -python-versions = ">=3.5.0" -files = [ - {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:818325afee467d483bfab1647a72054246d29f9053fd17cc4b86cda09cc60339"}, - {file = "httptools-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72205730bf1be875003692ca54a4a7c35fac77b4746008966061d9d41a61b0f5"}, - {file = "httptools-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33eb1d4e609c835966e969a31b1dedf5ba16b38cab356c2ce4f3e33ffa94cad3"}, - {file = "httptools-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdc6675ec6cb79d27e0575750ac6e2b47032742e24eed011b8db73f2da9ed40"}, - {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:463c3bc5ef64b9cf091be9ac0e0556199503f6e80456b790a917774a616aff6e"}, - {file = "httptools-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f228b88b0e8c6099a9c4757ce9fdbb8b45548074f8d0b1f0fc071e35655d1c"}, - {file = "httptools-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:0781fedc610293a2716bc7fa142d4c85e6776bc59d617a807ff91246a95dea35"}, - {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:721e503245d591527cddd0f6fd771d156c509e831caa7a57929b55ac91ee2b51"}, - {file = "httptools-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:274bf20eeb41b0956e34f6a81f84d26ed57c84dd9253f13dcb7174b27ccd8aaf"}, - {file = "httptools-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:259920bbae18740a40236807915def554132ad70af5067e562f4660b62c59b90"}, - {file = "httptools-0.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03bfd2ae8a2d532952ac54445a2fb2504c804135ed28b53fefaf03d3a93eb1fd"}, - {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f959e4770b3fc8ee4dbc3578fd910fab9003e093f20ac8c621452c4d62e517cb"}, - {file = "httptools-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e22896b42b95b3237eccc42278cd72c0df6f23247d886b7ded3163452481e38"}, - {file = "httptools-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:38f3cafedd6aa20ae05f81f2e616ea6f92116c8a0f8dcb79dc798df3356836e2"}, - {file = "httptools-0.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47043a6e0ea753f006a9d0dd076a8f8c99bc0ecae86a0888448eb3076c43d717"}, - {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a541579bed0270d1ac10245a3e71e5beeb1903b5fbbc8d8b4d4e728d48ff1d"}, - {file = "httptools-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d802e7b2538a9756df5acc062300c160907b02e15ed15ba035b02bce43e89c"}, - {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:26326e0a8fe56829f3af483200d914a7cd16d8d398d14e36888b56de30bec81a"}, - {file = "httptools-0.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e41ccac9e77cd045f3e4ee0fc62cbf3d54d7d4b375431eb855561f26ee7a9ec4"}, - {file = "httptools-0.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4e748fc0d5c4a629988ef50ac1aef99dfb5e8996583a73a717fc2cac4ab89932"}, - {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cf8169e839a0d740f3d3c9c4fa630ac1a5aaf81641a34575ca6773ed7ce041a1"}, - {file = "httptools-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dcc14c090ab57b35908d4a4585ec5c0715439df07be2913405991dbb37e049d"}, - {file = "httptools-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d0b0571806a5168013b8c3d180d9f9d6997365a4212cb18ea20df18b938aa0b"}, - {file = "httptools-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb4a608c631f7dcbdf986f40af7a030521a10ba6bc3d36b28c1dc9e9035a3c0"}, - {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:93f89975465133619aea8b1952bc6fa0e6bad22a447c6d982fc338fbb4c89649"}, - {file = "httptools-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:73e9d66a5a28b2d5d9fbd9e197a31edd02be310186db423b28e6052472dc8201"}, - {file = "httptools-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:22c01fcd53648162730a71c42842f73b50f989daae36534c818b3f5050b54589"}, - {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f96d2a351b5625a9fd9133c95744e8ca06f7a4f8f0b8231e4bbaae2c485046a"}, - {file = "httptools-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72ec7c70bd9f95ef1083d14a755f321d181f046ca685b6358676737a5fecd26a"}, - {file = "httptools-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b703d15dbe082cc23266bf5d9448e764c7cb3fcfe7cb358d79d3fd8248673ef9"}, - {file = "httptools-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c723ed5982f8ead00f8e7605c53e55ffe47c47465d878305ebe0082b6a1755"}, - {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b0a816bb425c116a160fbc6f34cece097fd22ece15059d68932af686520966bd"}, - {file = "httptools-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dea66d94e5a3f68c5e9d86e0894653b87d952e624845e0b0e3ad1c733c6cc75d"}, - {file = "httptools-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:23b09537086a5a611fad5696fc8963d67c7e7f98cb329d38ee114d588b0b74cd"}, - {file = "httptools-0.6.0.tar.gz", hash = "sha256:9fc6e409ad38cbd68b177cd5158fc4042c796b82ca88d99ec78f07bed6c6b796"}, +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, ] [package.extras] @@ -1096,18 +1097,18 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "huggingface-hub" -version = "0.17.3" +version = "0.18.0" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.17.3-py3-none-any.whl", hash = "sha256:545eb3665f6ac587add946e73984148f2ea5c7877eac2e845549730570c1933a"}, - {file = "huggingface_hub-0.17.3.tar.gz", hash = "sha256:40439632b211311f788964602bf8b0d9d6b7a2314fba4e8d67b2ce3ecea0e3fd"}, + {file = "huggingface_hub-0.18.0-py3-none-any.whl", hash = "sha256:ee0b6b68acbf6aeb6d083ea081e981c277a1104b82ab67fdf6780ff5396830af"}, + {file = "huggingface_hub-0.18.0.tar.gz", hash = "sha256:10eda12b9c1cfa800b4b7c096b3ace8843734c3f28d69d1c243743fb7d7a2e81"}, ] [package.dependencies] filelock = "*" -fsspec = "*" +fsspec = ">=2023.5.0" packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -1372,13 +1373,13 @@ referencing = ">=0.28.0" [[package]] name = "jupyter-client" -version = "8.3.1" +version = "8.4.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.3.1-py3-none-any.whl", hash = "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5"}, - {file = "jupyter_client-8.3.1.tar.gz", hash = "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9"}, + {file = "jupyter_client-8.4.0-py3-none-any.whl", hash = "sha256:6a2a950ec23a8f62f9e4c66acec7f0ea6c7d1f80ba0992e747b10c56ce2e6dbe"}, + {file = "jupyter_client-8.4.0.tar.gz", hash = "sha256:dc1b857d5d7d76ac101766c6e9b646bf18742721126e72e5d484c75a993cada2"}, ] [package.dependencies] @@ -1394,13 +1395,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.3.2" +version = "5.4.0" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.2-py3-none-any.whl", hash = "sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6"}, - {file = "jupyter_core-5.3.2.tar.gz", hash = "sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f"}, + {file = "jupyter_core-5.4.0-py3-none-any.whl", hash = "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571"}, + {file = "jupyter_core-5.4.0.tar.gz", hash = "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d"}, ] [package.dependencies] @@ -1712,43 +1713,43 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numpy" -version = "1.26.0" +version = "1.26.1" description = "Fundamental package for array computing in Python" optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "numpy-1.26.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8db2f125746e44dce707dd44d4f4efeea8d7e2b43aace3f8d1f235cfa2733dd"}, - {file = "numpy-1.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0621f7daf973d34d18b4e4bafb210bbaf1ef5e0100b5fa750bd9cde84c7ac292"}, - {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51be5f8c349fdd1a5568e72713a21f518e7d6707bcf8503b528b88d33b57dc68"}, - {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:767254ad364991ccfc4d81b8152912e53e103ec192d1bb4ea6b1f5a7117040be"}, - {file = "numpy-1.26.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:436c8e9a4bdeeee84e3e59614d38c3dbd3235838a877af8c211cfcac8a80b8d3"}, - {file = "numpy-1.26.0-cp310-cp310-win32.whl", hash = "sha256:c2e698cb0c6dda9372ea98a0344245ee65bdc1c9dd939cceed6bb91256837896"}, - {file = "numpy-1.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:09aaee96c2cbdea95de76ecb8a586cb687d281c881f5f17bfc0fb7f5890f6b91"}, - {file = "numpy-1.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:637c58b468a69869258b8ae26f4a4c6ff8abffd4a8334c830ffb63e0feefe99a"}, - {file = "numpy-1.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:306545e234503a24fe9ae95ebf84d25cba1fdc27db971aa2d9f1ab6bba19a9dd"}, - {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6adc33561bd1d46f81131d5352348350fc23df4d742bb246cdfca606ea1208"}, - {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e062aa24638bb5018b7841977c360d2f5917268d125c833a686b7cbabbec496c"}, - {file = "numpy-1.26.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:546b7dd7e22f3c6861463bebb000646fa730e55df5ee4a0224408b5694cc6148"}, - {file = "numpy-1.26.0-cp311-cp311-win32.whl", hash = "sha256:c0b45c8b65b79337dee5134d038346d30e109e9e2e9d43464a2970e5c0e93229"}, - {file = "numpy-1.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:eae430ecf5794cb7ae7fa3808740b015aa80747e5266153128ef055975a72b99"}, - {file = "numpy-1.26.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:166b36197e9debc4e384e9c652ba60c0bacc216d0fc89e78f973a9760b503388"}, - {file = "numpy-1.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f042f66d0b4ae6d48e70e28d487376204d3cbf43b84c03bac57e28dac6151581"}, - {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e18e5b14a7560d8acf1c596688f4dfd19b4f2945b245a71e5af4ddb7422feb"}, - {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6bad22a791226d0a5c7c27a80a20e11cfe09ad5ef9084d4d3fc4a299cca505"}, - {file = "numpy-1.26.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4acc65dd65da28060e206c8f27a573455ed724e6179941edb19f97e58161bb69"}, - {file = "numpy-1.26.0-cp312-cp312-win32.whl", hash = "sha256:bb0d9a1aaf5f1cb7967320e80690a1d7ff69f1d47ebc5a9bea013e3a21faec95"}, - {file = "numpy-1.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ee84ca3c58fe48b8ddafdeb1db87388dce2c3c3f701bf447b05e4cfcc3679112"}, - {file = "numpy-1.26.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a873a8180479bc829313e8d9798d5234dfacfc2e8a7ac188418189bb8eafbd2"}, - {file = "numpy-1.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:914b28d3215e0c721dc75db3ad6d62f51f630cb0c277e6b3bcb39519bed10bd8"}, - {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c78a22e95182fb2e7874712433eaa610478a3caf86f28c621708d35fa4fd6e7f"}, - {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f737708b366c36b76e953c46ba5827d8c27b7a8c9d0f471810728e5a2fe57c"}, - {file = "numpy-1.26.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b44e6a09afc12952a7d2a58ca0a2429ee0d49a4f89d83a0a11052da696440e49"}, - {file = "numpy-1.26.0-cp39-cp39-win32.whl", hash = "sha256:5671338034b820c8d58c81ad1dafc0ed5a00771a82fccc71d6438df00302094b"}, - {file = "numpy-1.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:020cdbee66ed46b671429c7265cf00d8ac91c046901c55684954c3958525dab2"}, - {file = "numpy-1.26.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0792824ce2f7ea0c82ed2e4fecc29bb86bee0567a080dacaf2e0a01fe7654369"}, - {file = "numpy-1.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d484292eaeb3e84a51432a94f53578689ffdea3f90e10c8b203a99be5af57d8"}, - {file = "numpy-1.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:186ba67fad3c60dbe8a3abff3b67a91351100f2661c8e2a80364ae6279720299"}, - {file = "numpy-1.26.0.tar.gz", hash = "sha256:f93fc78fe8bf15afe2b8d6b6499f1c73953169fad1e9a8dd086cdff3190e7fdf"}, + {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, + {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, + {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, + {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, + {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, + {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, + {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, + {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, + {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, + {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, + {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, + {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, + {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, + {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, + {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, ] [[package]] @@ -1779,13 +1780,13 @@ files = [ [[package]] name = "opencensus-ext-azure" -version = "1.1.10" +version = "1.1.11" description = "OpenCensus Azure Monitor Exporter" optional = false python-versions = "*" files = [ - {file = "opencensus-ext-azure-1.1.10.tar.gz", hash = "sha256:c3fa3472bfbc71d7442375f2c78c1c9b6046cf0d6d2c9408b3944c84f86a30bd"}, - {file = "opencensus_ext_azure-1.1.10-py2.py3-none-any.whl", hash = "sha256:321730b42ee8b93b932edf4d9207bb3481d7a6f125e9410a5ea6e75b5a13f3a8"}, + {file = "opencensus-ext-azure-1.1.11.tar.gz", hash = "sha256:21d4d4d0519d48239d04142c90b6a51f5ecc043684eb80cfa0a701aa23346073"}, + {file = "opencensus_ext_azure-1.1.11-py2.py3-none-any.whl", hash = "sha256:d1e3c724cb53135ce33da0d856d3abc59565871b4cf37254bfe3c667937f1807"}, ] [package.dependencies] @@ -1813,8 +1814,11 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, ] [[package]] @@ -1960,65 +1964,65 @@ files = [ [[package]] name = "pillow" -version = "10.0.1" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] @@ -2127,25 +2131,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.6" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, ] [package.extras] @@ -2616,6 +2622,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2623,8 +2630,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2641,6 +2655,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2648,6 +2663,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2843,110 +2859,110 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.10.4" +version = "0.10.6" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.10.4-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e41824343c2c129599645373992b1ce17720bb8a514f04ff9567031e1c26951e"}, - {file = "rpds_py-0.10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9d8884d58ea8801e5906a491ab34af975091af76d1a389173db491ee7e316bb"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5db93f9017b384a4f194e1d89e1ce82d0a41b1fafdbbd3e0c8912baf13f2950f"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c31ecfc53ac03dad4928a1712f3a2893008bfba1b3cde49e1c14ff67faae2290"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f92d2372ec992c82fd7c74aa21e2a1910b3dcdc6a7e6392919a138f21d528a3"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7ea49ddf51d5ec0c3cbd95190dd15e077a3153c8d4b22a33da43b5dd2b3c640"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c27942722cd5039bbf5098c7e21935a96243fed00ea11a9589f3c6c6424bd84"}, - {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08f07150c8ebbdbce1d2d51b8e9f4d588749a2af6a98035485ebe45c7ad9394e"}, - {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f3331a3684192659fa1090bf2b448db928152fcba08222e58106f44758ef25f7"}, - {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efffa359cc69840c8793f0c05a7b663de6afa7b9078fa6c80309ee38b9db677d"}, - {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:86e8d6ff15fa7a9590c0addaf3ce52fb58bda4299cab2c2d0afa404db6848dab"}, - {file = "rpds_py-0.10.4-cp310-none-win32.whl", hash = "sha256:8f90fc6dd505867514c8b8ef68a712dc0be90031a773c1ae2ad469f04062daef"}, - {file = "rpds_py-0.10.4-cp310-none-win_amd64.whl", hash = "sha256:9f9184744fb800c9f28e155a5896ecb54816296ee79d5d1978be6a2ae60f53c4"}, - {file = "rpds_py-0.10.4-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:72e9b1e92830c876cd49565d8404e4dcc9928302d348ea2517bc3f9e3a873a2a"}, - {file = "rpds_py-0.10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3650eae998dc718960e90120eb45d42bd57b18b21b10cb9ee05f91bff2345d48"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f40413d2859737ce6d95c29ce2dde0ef7cdc3063b5830ae4342fef5922c3bba7"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b953d11b544ca5f2705bb77b177d8e17ab1bfd69e0fd99790a11549d2302258c"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28b4942ec7d9d6114c1e08cace0157db92ef674636a38093cab779ace5742d3a"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e0e2e01c5f61ddf47e3ed2d1fe1c9136e780ca6222d57a2517b9b02afd4710c"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:927e3461dae0c09b1f2e0066e50c1a9204f8a64a3060f596e9a6742d3b307785"}, - {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e69bbe0ede8f7fe2616e779421bbdb37f025c802335a90f6416e4d98b368a37"}, - {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc688a59c100f038fa9fec9e4ab457c2e2d1fca350fe7ea395016666f0d0a2dc"}, - {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ec001689402b9104700b50a005c2d3d0218eae90eaa8bdbbd776fe78fe8a74b7"}, - {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:628fbb8be71a103499d10b189af7764996ab2634ed7b44b423f1e19901606e0e"}, - {file = "rpds_py-0.10.4-cp311-none-win32.whl", hash = "sha256:e3f9c9e5dd8eba4768e15f19044e1b5e216929a43a54b4ab329e103aed9f3eda"}, - {file = "rpds_py-0.10.4-cp311-none-win_amd64.whl", hash = "sha256:3bc561c183684636c0099f9c3fbab8c1671841942edbce784bb01b4707d17924"}, - {file = "rpds_py-0.10.4-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:36ff30385fb9fb3ac23a28bffdd4a230a5229ed5b15704b708b7c84bfb7fce51"}, - {file = "rpds_py-0.10.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db0589e0bf41ff6ce284ab045ca89f27be1adf19e7bce26c2e7de6739a70c18b"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c330cb125983c5d380fef4a4155248a276297c86d64625fdaf500157e1981c"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d230fddc60caced271cc038e43e6fb8f4dd6b2dbaa44ac9763f2d76d05b0365a"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a9e864ec051a58fdb6bb2e6da03942adb20273897bc70067aee283e62bbac4d"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e41d5b334e8de4bc3f38843f31b2afa9a0c472ebf73119d3fd55cde08974bdf"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bb3f3cb6072c73e6ec1f865d8b80419b599f1597acf33f63fbf02252aab5a03"}, - {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576d48e1e45c211e99fc02655ade65c32a75d3e383ccfd98ce59cece133ed02c"}, - {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b28b9668a22ca2cfca4433441ba9acb2899624a323787a509a3dc5fbfa79c49d"}, - {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ddbd113a37307638f94be5ae232a325155fd24dbfae2c56455da8724b471e7be"}, - {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd0ad98c7d72b0e4cbfe89cdfa12cd07d2fd6ed22864341cdce12b318a383442"}, - {file = "rpds_py-0.10.4-cp312-none-win32.whl", hash = "sha256:2a97406d5e08b7095428f01dac0d3c091dc072351151945a167e7968d2755559"}, - {file = "rpds_py-0.10.4-cp312-none-win_amd64.whl", hash = "sha256:aab24b9bbaa3d49e666e9309556591aa00748bd24ea74257a405f7fed9e8b10d"}, - {file = "rpds_py-0.10.4-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6c5ca3eb817fb54bfd066740b64a2b31536eb8fe0b183dc35b09a7bd628ed680"}, - {file = "rpds_py-0.10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd37ab9a24021821b715478357af1cf369d5a42ac7405e83e5822be00732f463"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2573ec23ad3a59dd2bc622befac845695972f3f2d08dc1a4405d017d20a6c225"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:362faeae52dc6ccc50c0b6a01fa2ec0830bb61c292033f3749a46040b876f4ba"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f6e53461b19ddbb3354fe5bcf3d50d4333604ae4bf25b478333d83ca68002c"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6090ba604ea06b525a231450ae5d343917a393cbf50423900dea968daf61d16f"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e29dac59df890972f73c511948072897f512974714a803fe793635b80ff8c7"}, - {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f82abb5c5b83dc30e96be99ce76239a030b62a73a13c64410e429660a5602bfd"}, - {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a3628815fd170a64624001bfb4e28946fd515bd672e68a1902d9e0290186eaf3"}, - {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d37f27ad80f742ef82796af3fe091888864958ad0bc8bab03da1830fa00c6004"}, - {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255a23bded80605e9f3997753e3a4b89c9aec9efb07ec036b1ca81440efcc1a9"}, - {file = "rpds_py-0.10.4-cp38-none-win32.whl", hash = "sha256:049098dabfe705e9638c55a3321137a821399c50940041a6fcce267a22c70db2"}, - {file = "rpds_py-0.10.4-cp38-none-win_amd64.whl", hash = "sha256:aa45cc71bf23a3181b8aa62466b5a2b7b7fb90fdc01df67ca433cd4fce7ec94d"}, - {file = "rpds_py-0.10.4-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3507c459767cf24c11e9520e2a37c89674266abe8e65453e5cb66398aa47ee7b"}, - {file = "rpds_py-0.10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2603e084054351cc65097da326570102c4c5bd07426ba8471ceaefdb0b642cc9"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0f1d336786cb62613c72c00578c98e5bb8cd57b49c5bae5d4ab906ca7872f98"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf032367f921201deaecf221d4cc895ea84b3decf50a9c73ee106f961885a0ad"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f050ceffd8c730c1619a16bbf0b9cd037dcdb94b54710928ba38c7bde67e4a4"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8709eb4ab477c533b7d0a76cd3065d7d95c9e25e6b9f6e27caeeb8c63e8799c9"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc20dadb102140dff63529e08ce6f9745dbd36e673ebb2b1c4a63e134bca81c2"}, - {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd7da2adc721ccf19ac7ec86cae3a4fcaba03d9c477d5bd64ded6e9bb817bf3f"}, - {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5dba1c11e089b526379e74f6c636202e4c5bad9a48c7416502b8a5b0d026c91"}, - {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ffd539d213c1ea2989ab92a5b9371ae7159c8c03cf2bcb9f2f594752f755ecd3"}, - {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e791e3d13b14d0a7921804d0efe4d7bd15508bbcf8cb7a0c1ee1a27319a5f033"}, - {file = "rpds_py-0.10.4-cp39-none-win32.whl", hash = "sha256:2f2ac8bb01f705c5caaa7fe77ffd9b03f92f1b5061b94228f6ea5eaa0fca68ad"}, - {file = "rpds_py-0.10.4-cp39-none-win_amd64.whl", hash = "sha256:7c7ca791bedda059e5195cf7c6b77384657a51429357cdd23e64ac1d4973d6dc"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9c7e7bd1fa1f535af71dfcd3700fc83a6dc261a1204f8f5327d8ffe82e52905d"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7089d8bfa8064b28b2e39f5af7bf12d42f61caed884e35b9b4ea9e6fb1175077"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1f191befea279cb9669b57be97ab1785781c8bab805900e95742ebfaa9cbf1d"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98c0aecf661c175ce9cb17347fc51a5c98c3e9189ca57e8fcd9348dae18541db"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d81359911c3bb31c899c6a5c23b403bdc0279215e5b3bc0d2a692489fed38632"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83da147124499fe41ed86edf34b4e81e951b3fe28edcc46288aac24e8a5c8484"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49db6c0a0e6626c2b97f5e7f8f7074da21cbd8ec73340c25e839a2457c007efa"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:125776d5db15162fdd9135372bef7fe4fb7c5f5810cf25898eb74a06a0816aec"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:32819b662e3b4c26355a4403ea2f60c0a00db45b640fe722dd12db3d2ef807fb"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3bd38b80491ef9686f719c1ad3d24d14fbd0e069988fdd4e7d1a6ffcdd7f4a13"}, - {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2e79eeeff8394284b09577f36316d410525e0cf0133abb3de10660e704d3d38e"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3e37f1f134037601eb4b1f46854194f0cc082435dac2ee3de11e51529f7831f2"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ba3246c60303eab3d0e562addf25a983d60bddc36f4d1edc2510f056d19df255"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9123ba0f3f98ff79780eebca9984a2b525f88563844b740f94cffb9099701230"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d98802b78093c7083cc51f83da41a5be5a57d406798c9f69424bd75f8ae0812a"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:58bae860d1d116e6b4e1aad0cdc48a187d5893994f56d26db0c5534df7a47afd"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd7e62e7d5bcfa38a62d8397fba6d0428b970ab7954c2197501cd1624f7f0bbb"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83f5228459b84fa6279e4126a53abfdd73cd9cc183947ee5084153880f65d7"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bcb1abecd998a72ad4e36a0fca93577fd0c059a6aacc44f16247031b98f6ff4"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9e7b3ad9f53ea9e085b3d27286dd13f8290969c0a153f8a52c8b5c46002c374b"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:cbec8e43cace64e63398155dc585dc479a89fef1e57ead06c22d3441e1bd09c3"}, - {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ad21c60fc880204798f320387164dcacc25818a7b4ec2a0bf6b6c1d57b007d23"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:6baea8a4f6f01e69e75cfdef3edd4a4d1c4b56238febbdf123ce96d09fbff010"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:94876c21512535955a960f42a155213315e6ab06a4ce8ce372341a2a1b143eeb"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cb55454a20d1b935f9eaab52e6ceab624a2efd8b52927c7ae7a43e02828dbe0"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13cbd79ccedc6b39c279af31ebfb0aec0467ad5d14641ddb15738bf6e4146157"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00a88003db3cc953f8656b59fc9af9d0637a1fb93c235814007988f8c153b2f2"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0f7f77a77c37159c9f417b8dd847f67a29e98c6acb52ee98fc6b91efbd1b2b6"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70563a1596d2e0660ca2cebb738443437fc0e38597e7cbb276de0a7363924a52"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3ece9aa6d07e18c966f14b4352a4c6f40249f6174d3d2c694c1062e19c6adbb"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d5ad7b1a1f6964d19b1a8acfc14bf7864f39587b3e25c16ca04f6cd1815026b3"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:60018626e637528a1fa64bb3a2b3e46ab7bf672052316d61c3629814d5e65052"}, - {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ae8a32ab77a84cc870bbfb60645851ca0f7d58fd251085ad67464b1445d632ca"}, - {file = "rpds_py-0.10.4.tar.gz", hash = "sha256:18d5ff7fbd305a1d564273e9eb22de83ae3cd9cd6329fddc8f12f6428a711a6a"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, + {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, + {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, + {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, + {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, + {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, + {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, + {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, + {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, + {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, + {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, + {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, ] [[package]] @@ -2990,30 +3006,36 @@ python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, @@ -3383,13 +3405,13 @@ tests = ["nose", "numpy"] [[package]] name = "urllib3" -version = "2.0.6" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.7" files = [ - {file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"}, - {file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] @@ -3426,47 +3448,52 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "uvloop" -version = "0.17.0" +version = "0.18.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false -python-versions = ">=3.7" +python-versions = ">=3.7.0" files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, -] - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] + {file = "uvloop-0.18.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f354d669586fca96a9a688c585b6257706d216177ac457c92e15709acaece10"}, + {file = "uvloop-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:280904236a5b333a273292b3bcdcbfe173690f69901365b973fa35be302d7781"}, + {file = "uvloop-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad79cd30c7e7484bdf6e315f3296f564b3ee2f453134a23ffc80d00e63b3b59e"}, + {file = "uvloop-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99deae0504547d04990cc5acf631d9f490108c3709479d90c1dcd14d6e7af24d"}, + {file = "uvloop-0.18.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:edbb4de38535f42f020da1e3ae7c60f2f65402d027a08a8c60dc8569464873a6"}, + {file = "uvloop-0.18.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:54b211c46facb466726b227f350792770fc96593c4ecdfaafe20dc00f3209aef"}, + {file = "uvloop-0.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25b714f07c68dcdaad6994414f6ec0f2a3b9565524fba181dcbfd7d9598a3e73"}, + {file = "uvloop-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1121087dfeb46e9e65920b20d1f46322ba299b8d93f7cb61d76c94b5a1adc20c"}, + {file = "uvloop-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74020ef8061678e01a40c49f1716b4f4d1cc71190d40633f08a5ef8a7448a5c6"}, + {file = "uvloop-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4a549cd747e6f4f8446f4b4c8cb79504a8372d5d3a9b4fc20e25daf8e76c05"}, + {file = "uvloop-0.18.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6132318e1ab84a626639b252137aa8d031a6c0550250460644c32ed997604088"}, + {file = "uvloop-0.18.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:585b7281f9ea25c4a5fa993b1acca4ad3d8bc3f3fe2e393f0ef51b6c1bcd2fe6"}, + {file = "uvloop-0.18.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:61151cc207cf5fc88863e50de3d04f64ee0fdbb979d0b97caf21cae29130ed78"}, + {file = "uvloop-0.18.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c65585ae03571b73907b8089473419d8c0aff1e3826b3bce153776de56cbc687"}, + {file = "uvloop-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3d301e23984dcbc92d0e42253e0e0571915f0763f1eeaf68631348745f2dccc"}, + {file = "uvloop-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:680da98f12a7587f76f6f639a8aa7708936a5d17c5e7db0bf9c9d9cbcb616593"}, + {file = "uvloop-0.18.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:75baba0bfdd385c886804970ae03f0172e0d51e51ebd191e4df09b929771b71e"}, + {file = "uvloop-0.18.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ed3c28337d2fefc0bac5705b9c66b2702dc392f2e9a69badb1d606e7e7f773bb"}, + {file = "uvloop-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8849b8ef861431543c07112ad8436903e243cdfa783290cbee3df4ce86d8dd48"}, + {file = "uvloop-0.18.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211ce38d84118ae282a91408f61b85cf28e2e65a0a8966b9a97e0e9d67c48722"}, + {file = "uvloop-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0a8f706b943c198dcedf1f2fb84899002c195c24745e47eeb8f2fb340f7dfc3"}, + {file = "uvloop-0.18.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:58e44650cbc8607a218caeece5a689f0a2d10be084a69fc32f7db2e8f364927c"}, + {file = "uvloop-0.18.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b8b7cf7806bdc745917f84d833f2144fabcc38e9cd854e6bc49755e3af2b53e"}, + {file = "uvloop-0.18.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:56c1026a6b0d12b378425e16250acb7d453abaefe7a2f5977143898db6cfe5bd"}, + {file = "uvloop-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:12af0d2e1b16780051d27c12de7e419b9daeb3516c503ab3e98d364cc55303bb"}, + {file = "uvloop-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b028776faf9b7a6d0a325664f899e4c670b2ae430265189eb8d76bd4a57d8a6e"}, + {file = "uvloop-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53aca21735eee3859e8c11265445925911ffe410974f13304edb0447f9f58420"}, + {file = "uvloop-0.18.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:847f2ed0887047c63da9ad788d54755579fa23f0784db7e752c7cf14cf2e7506"}, + {file = "uvloop-0.18.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6e20bb765fcac07879cd6767b6dca58127ba5a456149717e0e3b1f00d8eab51c"}, + {file = "uvloop-0.18.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e14de8800765b9916d051707f62e18a304cde661fa2b98a58816ca38d2b94029"}, + {file = "uvloop-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f3b18663efe0012bc4c315f1b64020e44596f5fabc281f5b0d9bc9465288559c"}, + {file = "uvloop-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6d341bc109fb8ea69025b3ec281fcb155d6824a8ebf5486c989ff7748351a37"}, + {file = "uvloop-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:895a1e3aca2504638a802d0bec2759acc2f43a0291a1dff886d69f8b7baff399"}, + {file = "uvloop-0.18.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d90858f32a852988d33987d608bcfba92a1874eb9f183995def59a34229f30d"}, + {file = "uvloop-0.18.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db1fcbad5deb9551e011ca589c5e7258b5afa78598174ac37a5f15ddcfb4ac7b"}, + {file = "uvloop-0.18.0.tar.gz", hash = "sha256:d5d1135beffe9cd95d0350f19e2716bc38be47d5df296d7cc46e3b7557c0d1ff"}, +] + +[package.extras] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "versioningit" @@ -3485,33 +3512,86 @@ tomli = {version = ">=1.2,<3.0", markers = "python_version < \"3.11\""} [[package]] name = "watchfiles" -version = "0.20.0" +version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchfiles-0.20.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:3796312bd3587e14926013612b23066912cf45a14af71cf2b20db1c12dadf4e9"}, - {file = "watchfiles-0.20.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:d0002d81c89a662b595645fb684a371b98ff90a9c7d8f8630c82f0fde8310458"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:570848706440373b4cd8017f3e850ae17f76dbdf1e9045fc79023b11e1afe490"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a0351d20d03c6f7ad6b2e8a226a5efafb924c7755ee1e34f04c77c3682417fa"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:007dcc4a401093010b389c044e81172c8a2520dba257c88f8828b3d460c6bb38"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d82dbc1832da83e441d112069833eedd4cf583d983fb8dd666fbefbea9d99c0"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99f4c65fd2fce61a571b2a6fcf747d6868db0bef8a934e8ca235cc8533944d95"}, - {file = "watchfiles-0.20.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5392dd327a05f538c56edb1c6ebba6af91afc81b40822452342f6da54907bbdf"}, - {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:08dc702529bb06a2b23859110c214db245455532da5eaea602921687cfcd23db"}, - {file = "watchfiles-0.20.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d4e66a857621584869cfbad87039e65dadd7119f0d9bb9dbc957e089e32c164"}, - {file = "watchfiles-0.20.0-cp37-abi3-win32.whl", hash = "sha256:a03d1e6feb7966b417f43c3e3783188167fd69c2063e86bad31e62c4ea794cc5"}, - {file = "watchfiles-0.20.0-cp37-abi3-win_amd64.whl", hash = "sha256:eccc8942bcdc7d638a01435d915b913255bbd66f018f1af051cd8afddb339ea3"}, - {file = "watchfiles-0.20.0-cp37-abi3-win_arm64.whl", hash = "sha256:b17d4176c49d207865630da5b59a91779468dd3e08692fe943064da260de2c7c"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d97db179f7566dcf145c5179ddb2ae2a4450e3a634eb864b09ea04e68c252e8e"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:835df2da7a5df5464c4a23b2d963e1a9d35afa422c83bf4ff4380b3114603644"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608cd94a8767f49521901aff9ae0c92cc8f5a24d528db7d6b0295290f9d41193"}, - {file = "watchfiles-0.20.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89d1de8218874925bce7bb2ae9657efc504411528930d7a83f98b1749864f2ef"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:13f995d5152a8ba4ed7c2bbbaeee4e11a5944defc7cacd0ccb4dcbdcfd78029a"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b5c8d3be7b502f8c43a33c63166ada8828dbb0c6d49c8f9ce990a96de2f5a49"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e43af4464daa08723c04b43cf978ab86cc55c684c16172622bdac64b34e36af0"}, - {file = "watchfiles-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d9e1f75c4f86c93d73b5bd1ebe667558357548f11b4f8af4e0e272f79413ce"}, - {file = "watchfiles-0.20.0.tar.gz", hash = "sha256:728575b6b94c90dd531514677201e8851708e6e4b5fe7028ac506a200b622019"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"}, + {file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"}, + {file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"}, + {file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"}, + {file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"}, + {file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"}, + {file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"}, + {file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"}, + {file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"}, + {file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"}, + {file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"}, + {file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"}, + {file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"}, + {file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"}, + {file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"}, + {file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"}, + {file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"}, + {file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"}, + {file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"}, + {file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"}, + {file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"}, + {file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"}, + {file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"}, + {file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"}, + {file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"}, + {file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"}, + {file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"}, + {file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"}, + {file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"}, + {file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"}, + {file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"}, + {file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"}, ] [package.dependencies] @@ -3816,4 +3896,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "7d3e81b88c164b1daf5812165c57d8462122ce17f064defad816f6c18d5af751" +content-hash = "fa63a1ad29605dcebd6de28f01c552ef0b6c155236df35ebc359a85d3f214355" diff --git a/pyproject.toml b/pyproject.toml index a9ec28991..b12fd644b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,8 +13,8 @@ readme = "README.md" [tool.poetry.dependencies] python = "~3.10" -uvicorn = {extras = ["standard"], version = "^0.23.2"} -flojoy = {path = "pkgs/flojoy"} +uvicorn = { extras = ["standard"], version = "^0.23.2" } +flojoy = { path = "pkgs/flojoy", develop = true } fastapi = "^0.103.2" scikit-learn = "^1.3.1" python-dotenv = "^1.0.0" diff --git a/src/components/nodes/visual/BigNumberNode.tsx b/src/components/nodes/visual/BigNumberNode.tsx index 5f125a70e..7e635015f 100644 --- a/src/components/nodes/visual/BigNumberNode.tsx +++ b/src/components/nodes/visual/BigNumberNode.tsx @@ -5,7 +5,6 @@ import { ScalarData } from "@src/feature/common/types/ResultsType"; import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; -import { memo } from "react"; const BigNumberNode = ({ data, selected }: CustomNodeProps) => { const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); @@ -32,4 +31,4 @@ const BigNumberNode = ({ data, selected }: CustomNodeProps) => { ); }; -export default memo(BigNumberNode); +export default BigNumberNode; diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index e1a7fbe48..2ac754db8 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -8,6 +8,8 @@ import Scatter3D from "@src/assets/nodes/3DScatter"; import { OrderedTripleData } from "@src/feature/common/types/ResultsType"; import { ScatterPlot3D } from "@src/lib/plot/plots/3d/scatter"; import { Vec3, Vec4 } from "regl"; +import { Theme, darkTheme, lightTheme } from "./plotConstants"; +import { useTheme } from "@src/providers/themeProvider"; const initializePlot = ( canvas: HTMLCanvasElement, @@ -16,9 +18,10 @@ const initializePlot = ( colors?: Vec4 | Vec4[]; }, params: CustomNodeProps["data"]["ctrls"], + theme: Theme, ) => { return new ScatterPlot3D(canvas, initialData.points, { - pointSize: 2, + pointSize: params["point_size"].value as number, axes: { x: { domain: [ @@ -50,8 +53,8 @@ const initializePlot = ( cameraOptions: { center: [2.5, 2.5, 2.5], }, - colors: initialData.colors, - backgroundColor: [0.1, 0.1, 0.1, 1], + colors: initialData.colors ?? theme.accent, + backgroundColor: theme.bg, }); }; @@ -60,6 +63,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { const canvas = useRef(null); const scatter = useRef(null); + const { resolvedTheme } = useTheme(); useEffect(() => { if (scatter.current && nodeResult?.result?.data) { @@ -76,7 +80,9 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { scatter.current.destroy(); } scatter.current = null; - }, [data.ctrls]); + }, [data.ctrls, resolvedTheme]); + + const theme = resolvedTheme === "dark" ? darkTheme : lightTheme; if (!scatter.current && canvas.current && nodeResult?.result?.data) { const resultData = nodeResult.result.data as OrderedTripleData; @@ -89,6 +95,7 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { colors, }, data.ctrls, + theme, ); plot.frame(); scatter.current = plot; diff --git a/src/components/nodes/visual/ScatterNode.tsx b/src/components/nodes/visual/ScatterNode.tsx index d9853714e..c890cd4ef 100644 --- a/src/components/nodes/visual/ScatterNode.tsx +++ b/src/components/nodes/visual/ScatterNode.tsx @@ -4,28 +4,23 @@ import { OrderedPairData } from "@src/feature/common/types/ResultsType"; import { useNodeStatus } from "@src/hooks/useNodeStatus"; import { CustomNodeProps } from "@src/types"; import clsx from "clsx"; -import { memo } from "react"; import { CartesianCoordinateSystem, Circles, LinearScale, OrthoAxis, - // OrthoAxis, - // createDefaultFont, } from "candygraph"; import Scatter from "@src/assets/nodes/Scatter"; import { useCandyGraph } from "@src/hooks/useCandyGraph"; +import { useTheme } from "@src/providers/themeProvider"; +import { PLOT_HEIGHT, PLOT_WIDTH, darkTheme, lightTheme } from "./plotConstants"; -type Color = [number, number, number, number]; - -const viewport = { x: 0, y: 0, width: 360, height: 224 }; +const viewport = { x: 0, y: 0, width: PLOT_WIDTH, height: PLOT_HEIGHT }; const dpr = window.devicePixelRatio; -const bgColor: Color = [0.05, 0.05, 0.05, 1]; -const accentColor: Color = [0.598, 0.957, 1, 1]; - const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + const { resolvedTheme } = useTheme(); const { cg, font } = useCandyGraph({ width: viewport.width, height: viewport.height, @@ -48,20 +43,23 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { ); } + const theme = resolvedTheme === "dark" ? darkTheme : lightTheme; + const plotData = nodeResult.result.data as OrderedPairData; const x = plotData.x as number[]; const y = plotData.y as number[]; + const xMin = Math.min(...x); - const yMin = Math.min(...y); const xMax = Math.max(...x); + const yMin = Math.min(...y); const yMax = Math.max(...y); - const xscale = new LinearScale([xMin, xMax], [16, viewport.width - 16]); - const yscale = new LinearScale([yMin, yMax], [16, viewport.height - 16]); + const xscale = new LinearScale([xMin, xMax], [32, viewport.width - 16]); + const yscale = new LinearScale([yMin, yMax], [32, viewport.height - 16]); const coords = new CartesianCoordinateSystem(cg, xscale, yscale); - cg.clear(bgColor); + cg.clear(theme.bg); const axes = font ? [ @@ -83,7 +81,7 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { cg.render(coords, viewport, [ new Circles(cg, x, y, { - colors: accentColor, + colors: theme.accent, radii: 3 * dpr, borderWidths: 0, }), @@ -107,8 +105,8 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => {
@@ -116,4 +114,4 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { ); }; -export default memo(ScatterNode); +export default ScatterNode; diff --git a/src/components/nodes/visual/plotConstants.ts b/src/components/nodes/visual/plotConstants.ts new file mode 100644 index 000000000..44e07b0a1 --- /dev/null +++ b/src/components/nodes/visual/plotConstants.ts @@ -0,0 +1,18 @@ +export const PLOT_WIDTH = 360; +export const PLOT_HEIGHT = 224; + +export type Color = [number, number, number, number]; +export type Theme = { + bg: Color, + accent: Color, +} + +export const lightTheme: Theme = { + bg: [0.98, 0.98, 0.98, 1], + accent: [0.48, 0.38, 1, 1], +}; + +export const darkTheme: Theme = { + bg: [0.05, 0.05, 0.05, 1], + accent: [0.598, 0.957, 1, 1], +}; diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 700533cb7..6c34566ca 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -2,7 +2,7 @@ import { Vec3, DrawCommand, Vec4 } from "regl"; import { Drawable } from "../types"; import { Plot } from "../plot"; -const DEFAULT_COLOR = [0.6, 0.96, 1, 1]; +const DEFAULT_COLOR: Vec4 = [0.6, 0.96, 1, 1]; type Props = { points: Vec3[]; @@ -11,6 +11,7 @@ type Props = { }; type Uniforms = { + color: Vec4 | Vec4[]; size: number; }; @@ -38,6 +39,10 @@ export class Points implements Drawable { this.points = initialProps.points; this.count = initialProps.points.length; this.colors = initialProps.colors; + + const singleColor = + this.colors === undefined || !Array.isArray(this.colors[0]); + this.drawCommand = plot.regl({ frag: ` precision mediump float; @@ -55,7 +60,7 @@ export class Points implements Drawable { precision mediump float; attribute vec3 position; - attribute vec4 color; + ${singleColor ? "uniform vec4 color" : "attribute vec4 color"}; uniform mat4 view, projection; uniform float size; @@ -76,6 +81,7 @@ export class Points implements Drawable { uniforms: { size: options.pointSize, + color: this.colors ?? DEFAULT_COLOR, }, count: plot.regl.prop("count"), From 13e01971910b90a74e92612724082dddfba2e6ee Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:28:59 -0400 Subject: [PATCH 27/46] add scientific notation to big number --- PYTHON/nodes | 2 +- src/components/nodes/visual/BigNumberNode.tsx | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index c28f99d21..7afdd9dff 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit c28f99d21209319fdc01f02306cf05f8a7e2ba09 +Subproject commit 7afdd9dff968865d1a3648a427fd060f762c647b diff --git a/src/components/nodes/visual/BigNumberNode.tsx b/src/components/nodes/visual/BigNumberNode.tsx index 7e635015f..1a42eec1c 100644 --- a/src/components/nodes/visual/BigNumberNode.tsx +++ b/src/components/nodes/visual/BigNumberNode.tsx @@ -9,6 +9,8 @@ import clsx from "clsx"; const BigNumberNode = ({ data, selected }: CustomNodeProps) => { const { nodeRunning, nodeError, nodeResult } = useNodeStatus(data.id); + const scientificNotation = data.ctrls["scientific_notation"].value as boolean; + return (
{ > {nodeResult?.result?.data ? (

- {(nodeResult.result.data as ScalarData).c} + {scientificNotation + ? (nodeResult.result.data as ScalarData).c.toExponential() + : (nodeResult.result.data as ScalarData).c}

) : ( From 49a3d78b8544ecb77eda61f7202488ece36719a7 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:31:31 -0400 Subject: [PATCH 28/46] submodule --- PYTHON/nodes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 7afdd9dff..55f54f116 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 7afdd9dff968865d1a3648a427fd060f762c647b +Subproject commit 55f54f116194a1629bdc0d10cea7090c0bc3c24c From 3f14e8ce10fb3ed56ef541421461b267e06684fb Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:35:15 -0400 Subject: [PATCH 29/46] submodule --- PYTHON/nodes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 53f04fc88..d8f11c8b9 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 53f04fc88a48d25d4ba652d752886836d702fbc4 +Subproject commit d8f11c8b95b1ee239c53dcd80969414b1932b854 From e922eb0e1f1b122b24d562a8e3eacc68cbe89d1e Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:35:29 -0400 Subject: [PATCH 30/46] submodule --- PYTHON/nodes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 55f54f116..d8f11c8b9 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 55f54f116194a1629bdc0d10cea7090c0bc3c24c +Subproject commit d8f11c8b95b1ee239c53dcd80969414b1932b854 From 11ddd5a31ac270a43312f686cfa871a68c21995c Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 18 Oct 2023 18:38:03 -0400 Subject: [PATCH 31/46] format --- captain/models/topology.py | 129 +++++++++++++------------ pkgs/flojoy/flojoy/flojoy_python.py | 45 +++++---- pkgs/flojoy/flojoy/job_result_utils.py | 32 +++--- pkgs/flojoy/flojoy/utils.py | 13 ++- 4 files changed, 119 insertions(+), 100 deletions(-) diff --git a/captain/models/topology.py b/captain/models/topology.py index 20b0804f9..62353bb1c 100644 --- a/captain/models/topology.py +++ b/captain/models/topology.py @@ -39,11 +39,12 @@ def __init__( self.time_start = 0.0 self.finished = False self.loop_nodes = ( - list()) # using list instead of set as we need to maintain order + list() + ) # using list instead of set as we need to maintain order def process_worker_response( - self, - finished_job_fetch: JobSuccess | JobFailure) -> list[str] | None: + self, finished_job_fetch: JobSuccess | JobFailure + ) -> list[str] | None: """ Handle when producer receives the consumer's response (worker response). Returns potential new tasks (jobs) to be run. @@ -54,31 +55,32 @@ def process_worker_response( # handle failed job if isinstance(finished_job_fetch, JobFailure): - self.process_job_result(job_id=finished_job_fetch.node_id, - job_result=None, - success=False) + self.process_job_result( + job_id=finished_job_fetch.node_id, job_result=None, success=False + ) # handle successful job elif isinstance(finished_job_fetch, JobSuccess): - logger.debug( - f"{finished_job_fetch.node_id} finished at {time.time()}") + logger.debug(f"{finished_job_fetch.node_id} finished at {time.time()}") return self.handle_finished_job( - finished_job_fetch, return_new_jobs=True) # return new jobs + finished_job_fetch, return_new_jobs=True + ) # return new jobs def run(self, task_queue: Queue[Any]): """ Topology entry point function for producer """ self.time_start = time.perf_counter() - next_jobs: list[str] = self.collect_ready_jobs( - ) # get nodes with in-degree 0 + next_jobs: list[str] = self.collect_ready_jobs() # get nodes with in-degree 0 self.run_jobs(next_jobs, task_queue) def collect_ready_jobs(self): next_jobs: list[str] = [] for job_id in cast(list[str], self.working_graph.nodes): - if (job_id not in self.finished_jobs - and self.original_graph.in_degree(job_id) == 0): + if ( + job_id not in self.finished_jobs + and self.original_graph.in_degree(job_id) == 0 + ): next_jobs.append(job_id) return next_jobs @@ -89,8 +91,7 @@ def run_jobs(self, jobs: list[str], task_queue: Queue[Any]): def run_job(self, job_id: str, task_queue: Queue[Any]): node = cast(dict[str, Any], self.working_graph.nodes[job_id]) - previous_jobs = self.get_job_dependencies_with_label(job_id, - original=True) + previous_jobs = self.get_job_dependencies_with_label(job_id, original=True) logger.debug( f" enqueue job: {self.get_label(job_id)}, dependencies: {[self.get_label(dep_id.get('job_id', ''), original=True) for dep_id in previous_jobs]}" @@ -106,7 +107,8 @@ def run_job(self, job_id: str, task_queue: Queue[Any]): iteration_id=job_id, ctrls=node["ctrls"], previous_jobs=previous_jobs, - )) + ) + ) self.queued_jobs.add(job_id) # ------------------- @@ -127,16 +129,13 @@ def is_cancelled(self): def is_finished(self): return self.finished - def handle_finished_job(self, - job: JobSuccess, - return_new_jobs: bool = False): + def handle_finished_job(self, job: JobSuccess, return_new_jobs: bool = False): """ get the data from the worker response (flojoy package is responsible for sending to /worker_response endpoint) """ if self.cancelled: - logger.debug( - "Received job, but skipping since topology is cancelled") + logger.debug("Received job, but skipping since topology is cancelled") return time.sleep(self.node_delay) @@ -144,13 +143,13 @@ def handle_finished_job(self, job_id: str = job.node_id job_result = job.result - logger.debug( - f"job {self.get_label(job_id)} is done and has been received.") + logger.debug(f"job {self.get_label(job_id)} is done and has been received.") if job_id in self.queued_jobs: self.queued_jobs.remove(job_id) if job_id in self.finished_jobs: logging.warning( - f"{job_id} HAS ALREADY BEEN PROCESSED, NOT SUPPOSED TO HAPPEN") + f"{job_id} HAS ALREADY BEEN PROCESSED, NOT SUPPOSED TO HAPPEN" + ) return self.finished_jobs.add(job_id) @@ -162,8 +161,9 @@ def handle_finished_job(self, if return_new_jobs: return next_jobs - def process_job_result(self, job_id: str, - job_result: dict[str, Any] | None, success: bool): + def process_job_result( + self, job_id: str, job_result: dict[str, Any] | None, success: bool + ): """ process special instructions to scheduler """ @@ -195,16 +195,21 @@ def process_job_result(self, job_id: str, self.loop_nodes.pop() next_nodes = self.remove_edges_and_get_next(job_id, direction) next_nodes_from_dependencies = next_nodes_from_dependencies.union( - next_nodes) + next_nodes + ) - logger.debug("After removing edges of node, next nodes are: " + - str(next_nodes_from_dependencies)) + logger.debug( + "After removing edges of node, next nodes are: " + + str(next_nodes_from_dependencies) + ) nodes_to_add: list[str] = [] # -- verify if the flowchart is done running -- - if (self.queued_jobs.__len__() == 0 - and next_nodes_from_dependencies.__len__() == 0): + if ( + self.queued_jobs.__len__() == 0 + and next_nodes_from_dependencies.__len__() == 0 + ): if not self.loop_nodes: self.finished = True logger.info( @@ -224,15 +229,14 @@ def process_job_result(self, job_id: str, self.restart(node_id) for node_id in nodes_to_add: - if (self.working_graph.in_degree(node_id) == 0 - ): # check if no dependencies left for node + if ( + self.working_graph.in_degree(node_id) == 0 + ): # check if no dependencies left for node next_nodes_from_dependencies.add(node_id) return list(next_nodes_from_dependencies) - def remove_edges_and_get_next(self, - job_id: str, - label_direction: str = "default"): + def remove_edges_and_get_next(self, job_id: str, label_direction: str = "default"): """ this function removes the node edges and checks its successors for new jobs. A new job is ready when a successor has no dependencies. @@ -250,13 +254,13 @@ def remove_edges_and_get_next(self, return next_nodes def restart(self, job_id: str): - logger.debug( - f" *** restarting job: {self.get_label(job_id, original=True)}") + logger.debug(f" *** restarting job: {self.get_label(job_id, original=True)}") if self.loop_nodes: self.loop_nodes.pop() graph = self.original_graph sub_graph: nx.MultiDiGraph = graph.subgraph( - [job_id] + list(nx.descendants(graph, job_id))) + [job_id] + list(nx.descendants(graph, job_id)) + ) original_edges = sub_graph.edges(data=True) self.working_graph.add_edges_from(original_edges) self.finished_jobs.remove(job_id) @@ -288,40 +292,39 @@ def remove_dependencies(self, job_id: str, label: str = "default"): for edge in edges: self.remove_dependency(edge[0], edge[1]) - def get_edges_by_label(self, job_id: str, - label: str) -> list[tuple[str, Any, Any]]: + def get_edges_by_label(self, job_id: str, label: str) -> list[tuple[str, Any, Any]]: edges = self.working_graph.edges(job_id, data=True) - edges = [(s, t, data) for (s, t, data) in edges - if data.get("label", "") == label] + edges = [ + (s, t, data) for (s, t, data) in edges if data.get("label", "") == label + ] return edges - def get_job_dependencies_with_label(self, - job_id: str, - original: bool = True - ) -> list[dict[str, str]]: + def get_job_dependencies_with_label( + self, job_id: str, original: bool = True + ) -> list[dict[str, str]]: graph = self.get_graph(original) try: deps = [] - for prev_job_id, _, data in list(graph.in_edges(job_id, - data=True)): + for prev_job_id, _, data in list(graph.in_edges(job_id, data=True)): input_name = data.get("target_label", "") multiple = data.get("multiple", False) edge_label = data.get("label", "") - deps.append({ - "job_id": prev_job_id, - "input_name": input_name, - "multiple": multiple, - "edge": edge_label, - }) + deps.append( + { + "job_id": prev_job_id, + "input_name": input_name, + "multiple": multiple, + "edge": edge_label, + } + ) logger.debug(f"deps: {deps}") return deps except Exception: return [] - def get_input_info(self, - source_job_id: str, - target_job_id: str, - original: bool = False) -> list[tuple[str, bool]]: + def get_input_info( + self, source_job_id: str, target_job_id: str, original: bool = False + ) -> list[tuple[str, bool]]: graph = self.get_graph(original) edge_data = graph.get_edge_data(source_job_id, target_job_id) target_label = "" @@ -410,8 +413,12 @@ def get_maximum_workers(self, maximum_capacity: int = 1): def get_outputs(self, job_id: str): out = self.working_graph.out_edges(job_id) return list( - set(edge["label"] for (u, v) in out - for edge in self.working_graph.get_edge_data(u, v).values())) + set( + edge["label"] + for (u, v) in out + for edge in self.working_graph.get_edge_data(u, v).values() + ) + ) def is_loop_node(self, job_id: str): node = cast( diff --git a/pkgs/flojoy/flojoy/flojoy_python.py b/pkgs/flojoy/flojoy/flojoy_python.py index 193fa55dd..705054845 100644 --- a/pkgs/flojoy/flojoy/flojoy_python.py +++ b/pkgs/flojoy/flojoy/flojoy_python.py @@ -49,8 +49,10 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): multiple = prev_job.get("multiple", False) edge = prev_job.get("edge", "") - logger.debug(f"fetching input from prev job id: {prev_job_id}" + - f"for input: {input_name} edge: {edge}") + logger.debug( + f"fetching input from prev job id: {prev_job_id}" + + f"for input: {input_name} edge: {edge}" + ) job_result = JobService().get_job_result(prev_job_id) if not job_result: @@ -58,8 +60,11 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): f"Tried to get job result from {prev_job_id} but it was None" ) - result = (get_dc_from_result(job_result[edge]) - if edge != "default" else get_dc_from_result(job_result)) + result = ( + get_dc_from_result(job_result[edge]) + if edge != "default" + else get_dc_from_result(job_result) + ) if result is not None: logger.debug(f"got job result from {prev_job_id}") if multiple: @@ -77,9 +82,9 @@ def fetch_inputs(previous_jobs: list[dict[str, str]]): class DefaultParams: - - def __init__(self, node_id: str, job_id: str, jobset_id: str, - node_type: str) -> None: + def __init__( + self, node_id: str, job_id: str, jobset_id: str, node_type: str + ) -> None: self.node_id = node_id self.job_id = job_id self.jobset_id = jobset_id @@ -102,8 +107,9 @@ def __exit__(self, *exc): return False -def display(original_function: Callable[..., DataContainer | dict[str, Any]] - | None = None): +def display( + original_function: Callable[..., DataContainer | dict[str, Any]] | None = None +): return original_function @@ -160,8 +166,7 @@ def SINE(dc_inputs:list[DataContainer], params:dict[str, Any]): ``` """ - def decorator(func: Callable[..., - Optional[DataContainer | dict[str, Any]]]): + def decorator(func: Callable[..., Optional[DataContainer | dict[str, Any]]]): # Wrap func here to override the HF_HOME env var func = cache_huggingface_to_flojoy()(func) @@ -181,8 +186,7 @@ def wrapper( for _, input in ctrls.items(): param = input["param"] value = input["value"] - func_params[param] = format_param_value( - value, input["type"]) + func_params[param] = format_param_value(value, input["type"]) func_params["type"] = "default" logger.debug( @@ -213,8 +217,7 @@ def wrapper( # check if node has an init container and if so, inject it if NodeInitService().has_init_store(node_id): - args["init_container"] = NodeInitService().get_init_store( - node_id) + args["init_container"] = NodeInitService().get_init_store(node_id) if inject_connection: logger.debug("injecting connection") @@ -226,8 +229,10 @@ def wrapper( # This fixes when people forget to add `= None` in # default: Optional[DataContainer] = None - if ("default" not in args and "default" - in inspect.signature(func).parameters.keys()): + if ( + "default" not in args + and "default" in inspect.signature(func).parameters.keys() + ): args["default"] = None ########################## @@ -240,7 +245,8 @@ def wrapper( # some special nodes like LOOP return dict instead of `DataContainer` if isinstance(dc_obj, DataContainer) and not isinstance( - dc_obj, Stateful): + dc_obj, Stateful + ): dc_obj.validate() # Validate returned DataContainer object elif dc_obj is not None: for value in dc_obj.values(): @@ -252,8 +258,7 @@ def wrapper( # Package the result and return it FN = func.__name__ - result = get_frontend_res_obj_from_result( - dc_obj, forward_result) + result = get_frontend_res_obj_from_result(dc_obj, forward_result) return JobSuccess( result=result, fn=FN, diff --git a/pkgs/flojoy/flojoy/job_result_utils.py b/pkgs/flojoy/flojoy/job_result_utils.py index 403d3b830..0df1660ae 100644 --- a/pkgs/flojoy/flojoy/job_result_utils.py +++ b/pkgs/flojoy/flojoy/job_result_utils.py @@ -4,14 +4,14 @@ from .dao import Dao from typing import Any, cast, Optional -__all__ = [ - "get_job_result", "get_next_directions", "get_next_nodes", "get_job_result" -] +__all__ = ["get_job_result", "get_next_directions", "get_next_nodes", "get_job_result"] def is_flow_controled(result: dict[str, Any] | DataContainer): - if (FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS in result - or FLOJOY_INSTRUCTION.FLOW_TO_NODES in result): + if ( + FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS in result + or FLOJOY_INSTRUCTION.FLOW_TO_NODES in result + ): return True return False @@ -23,9 +23,11 @@ def get_next_directions(result: dict[str, Any] | None) -> list[str] | None: if not result.get(FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS): for value in result.values(): if isinstance(value, dict) and value.get( - FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS): - direction = cast(list[str], - value[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS]) + FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS + ): + direction = cast( + list[str], value[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS] + ) break else: direction = result[FLOJOY_INSTRUCTION.FLOW_TO_DIRECTIONS] @@ -39,7 +41,8 @@ def get_next_nodes(result: dict[str, Any] | None) -> list[str]: def get_dc_from_result( - result: dict[str, Any] | DataContainer | None) -> DataContainer | None: + result: dict[str, Any] | DataContainer | None +) -> DataContainer | None: if not result: return None if isinstance(result, DataContainer): @@ -52,8 +55,7 @@ def get_dc_from_result( def get_job_result(job_id: str) -> dict[str, Any] | DataContainer | None: try: job_result: Any = Dao.get_instance().get_job_result(job_id) - result = get_dc_from_result( - cast(dict[str, Any] | DataContainer, job_result)) + result = get_dc_from_result(cast(dict[str, Any] | DataContainer, job_result)) return result except Exception: return None @@ -70,8 +72,8 @@ def get_text_blob_from_dc(dc: DataContainer) -> str | None: def get_frontend_res_obj_from_result( - result: Optional[dict[str, Any] | DataContainer], - forward_result: bool = False) -> Optional[dict[str, Any]]: + result: Optional[dict[str, Any] | DataContainer], forward_result: bool = False +) -> Optional[dict[str, Any]]: if result is None: return None @@ -109,4 +111,6 @@ def get_frontend_res_obj_from_result( "text_blob": text_blob, } keys = list(result.keys()) - return get_frontend_res_obj_from_result(result[keys[0]], ) + return get_frontend_res_obj_from_result( + result[keys[0]], + ) diff --git a/pkgs/flojoy/flojoy/utils.py b/pkgs/flojoy/flojoy/utils.py index c92be5eb0..9b06982e5 100644 --- a/pkgs/flojoy/flojoy/utils.py +++ b/pkgs/flojoy/flojoy/utils.py @@ -137,13 +137,13 @@ def encode(self, o: Any): # 1. `loads` to switch Infinity, -Infinity, NaN to None # 2. `dumps` again so you get 'null' instead of extended JSON try: - new_o = _json.loads(encoded_o, - parse_constant=self.coerce_to_strict) + new_o = _json.loads(encoded_o, parse_constant=self.coerce_to_strict) except ValueError: # invalid separators will fail here. raise a helpful exception raise ValueError( "Encoding into strict JSON failed. Did you set the separators " - "valid JSON separators?") + "valid JSON separators?" + ) else: return _json.dumps( new_o, @@ -280,8 +280,11 @@ class NotEncodable(Exception): def dump_str(result: Any, limit: int | None = None): result_str = str(result) - return (result_str if limit is None or len(result_str) <= limit else - result_str[:limit] + "...") + return ( + result_str + if limit is None or len(result_str) <= limit + else result_str[:limit] + "..." + ) def get_flojoy_root_dir() -> str: From d53293322881a56e538d09cd334a00fa0b6df5d3 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 19 Oct 2023 16:33:28 -0400 Subject: [PATCH 32/46] fix memory leak --- src/components/nodes/visual/Scatter3DNode.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/nodes/visual/Scatter3DNode.tsx b/src/components/nodes/visual/Scatter3DNode.tsx index 2ac754db8..deff35535 100644 --- a/src/components/nodes/visual/Scatter3DNode.tsx +++ b/src/components/nodes/visual/Scatter3DNode.tsx @@ -82,6 +82,14 @@ const Scatter3DNode = ({ data, selected, id }: CustomNodeProps) => { scatter.current = null; }, [data.ctrls, resolvedTheme]); + useEffect(() => { + return () => { + if (scatter.current) { + scatter.current.destroy(); + } + } + }, []) + const theme = resolvedTheme === "dark" ? darkTheme : lightTheme; if (!scatter.current && canvas.current && nodeResult?.result?.data) { From 6e2d7d78a1ef3375921dfc10c4b8198371171aff Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 19 Oct 2023 16:33:37 -0400 Subject: [PATCH 33/46] add packages --- PYTHON/nodes | 2 +- poetry.lock | 106 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 4 ++ 3 files changed, 110 insertions(+), 2 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index d8f11c8b9..b56c01f7f 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit d8f11c8b95b1ee239c53dcd80969414b1932b854 +Subproject commit b56c01f7f2c8147b7c87d8bf5450ba29140fde04 diff --git a/poetry.lock b/poetry.lock index 7a6985c83..e89db86ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1634,6 +1634,23 @@ files = [ {file = "more_itertools-10.1.0-py3-none-any.whl", hash = "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6"}, ] +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + [[package]] name = "msal" version = "1.24.1" @@ -1796,6 +1813,31 @@ opencensus = ">=0.11.3,<1.0.0" psutil = ">=5.6.3" requests = ">=2.19.0" +[[package]] +name = "opencv-python" +version = "4.8.1.78" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.8.1.78.tar.gz", hash = "sha256:cc7adbbcd1112877a39274106cb2752e04984bc01a031162952e97450d6117f6"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:91d5f6f5209dc2635d496f6b8ca6573ecdad051a09e6b5de4c399b8e673c60da"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31f47e05447da8b3089faa0a07ffe80e114c91ce0b171e6424f9badbd1c5cd"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9814beca408d3a0eca1bae7e3e5be68b07c17ecceb392b94170881216e09b319"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c406bdb41eb21ea51b4e90dfbc989c002786c3f601c236a99c59a54670a394"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:a7aac3900fbacf55b551e7b53626c3dad4c71ce85643645c43e91fcb19045e47"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:b983197f97cfa6fcb74e1da1802c7497a6f94ed561aba6980f1f33123f904956"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, +] + [[package]] name = "opencv-python-headless" version = "4.8.1.78" @@ -2403,6 +2445,28 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyrealsense2" +version = "2.54.2.5684" +description = "Python Wrapper for Intel Realsense SDK 2.0." +optional = false +python-versions = "*" +files = [ + {file = "pyrealsense2-2.54.2.5684-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:c49ac2ca7550b896670bc94113e2e13c672cba6e5ca8aa646dcb3c8f9545a552"}, + {file = "pyrealsense2-2.54.2.5684-cp310-cp310-win_amd64.whl", hash = "sha256:21ea9db6f80b425d6435dfc78add39620749107069a4d20d66a191df614f5622"}, + {file = "pyrealsense2-2.54.2.5684-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:95953633b97306742e689706d5bfc2fef7f848fde10ce49d080d26ff4b4d0483"}, + {file = "pyrealsense2-2.54.2.5684-cp311-cp311-win_amd64.whl", hash = "sha256:8b7036c43f332ddf116d200ff4fcdee2b69f845b7dad55415764e6b90c40723a"}, + {file = "pyrealsense2-2.54.2.5684-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ed8c6421b7dd9efda33723aced0a0720ac053abc0d6fb11343c82c430a241be2"}, + {file = "pyrealsense2-2.54.2.5684-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4c2a136cd7f6b65b858fe3de6129170d56172452cd36122b57ed662071a02be8"}, + {file = "pyrealsense2-2.54.2.5684-cp37-cp37m-win_amd64.whl", hash = "sha256:836b44ed4b47b6633d1e8a4fcabfbf7c89454980ba70ceab017bd5b78b55f8f0"}, + {file = "pyrealsense2-2.54.2.5684-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:104f61d4bce6bbdc8a859020c11efede1d1bce867adf4725a31bd34723640677"}, + {file = "pyrealsense2-2.54.2.5684-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f3eb5cb41ab1c58c1809624473e67db43f2cfa46c780d130a2a607328fba91a1"}, + {file = "pyrealsense2-2.54.2.5684-cp38-cp38-win_amd64.whl", hash = "sha256:c8db6c2b1abbf7bacaad8b670533351335a8cf639bf0f6a347d56cf6b7059eb0"}, + {file = "pyrealsense2-2.54.2.5684-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b8be634e01023a8a052aac5c7e53f0b4e2dea048d05051d91de15bb7ad8c5833"}, + {file = "pyrealsense2-2.54.2.5684-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a42b27b29ce13110cdd1a20fd99d732a1ba3fc601f86686f9567b62ba864ef2b"}, + {file = "pyrealsense2-2.54.2.5684-cp39-cp39-win_amd64.whl", hash = "sha256:fe63ab1aa223e1e360f10f2625cbab5da711a8372bf4b43f37b71b6163f2feb3"}, +] + [[package]] name = "pyserial" version = "3.5" @@ -3256,6 +3320,20 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + [[package]] name = "tabulate" version = "0.9.0" @@ -3270,6 +3348,32 @@ files = [ [package.extras] widechars = ["wcwidth"] +[[package]] +name = "taulidarcamera" +version = "0.0.5" +description = "Python host-side API for the Onion Tau Lidar Camera" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "TauLidarCamera-0.0.5-py3-none-any.whl", hash = "sha256:ab61dbb7b3bc3a594fdf1dc22a018bb00688e264bffd3b86357eee4cfaee67f6"}, + {file = "TauLidarCamera-0.0.5.tar.gz", hash = "sha256:48bbb45968b6ebee29c075c4d926b1bf087f0eb59343c2e42ed00d58cd29ad29"}, +] + +[package.dependencies] +pyserial = "*" +TauLidarCommon = "*" + +[[package]] +name = "taulidarcommon" +version = "0.0.2" +description = "Tau LiDAR common package" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "TauLidarCommon-0.0.2-py3-none-any.whl", hash = "sha256:fceaae3e7c1119135d166ff83beb6b1dcbbdf0e0959a9e0043bfc8420640c834"}, + {file = "TauLidarCommon-0.0.2.tar.gz", hash = "sha256:625a35d51e482a706eb1b247588f72ef9cc8ea5f551f75a4551032d788766c9c"}, +] + [[package]] name = "tenacity" version = "8.2.3" @@ -3896,4 +4000,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "fa63a1ad29605dcebd6de28f01c552ef0b6c155236df35ebc359a85d3f214355" +content-hash = "dc3f6261bb74aae6b20f25746f3bf7853d4fda88200118a446d377a1f80159f7" diff --git a/pyproject.toml b/pyproject.toml index b12fd644b..dbc69c00d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,10 @@ qcodes = "^0.40.0" pyvisa-py = "^0.7.0" pyvisa = "^1.13.0" pyusb = "^1.2.1" +pyrealsense2 = "^2.54.2.5684" +taulidarcamera = "^0.0.5" +sympy = "^1.12" +opencv-python = "^4.8.1.78" [tool.poetry.group.dev.dependencies] From 9c07990dd7735114235736cbeb77e261515df089 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 19 Oct 2023 16:33:49 -0400 Subject: [PATCH 34/46] camera adjustments --- src/lib/plot/camera.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index 2f75073ad..a9e493abb 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -83,8 +83,8 @@ export class Camera { const leftButtonPressed = ev.buttons & 1; ev.preventDefault(); ev.stopPropagation(); - const dx = (ev.movementX / window.innerWidth) * 2; - const dy = (ev.movementY / window.innerHeight) * 2; + const dx = (ev.movementX / window.innerWidth) * this.state.distance; + const dy = (ev.movementY / window.innerHeight) * this.state.distance; if (leftButtonPressed && ev.ctrlKey) { this.rotate(dx, dy); } else if (leftButtonPressed) { @@ -141,8 +141,6 @@ export class Camera { private pan(dx: number, dy: number) { const { forward, left } = this.getPanVectors(); - console.log(this.state.eye); - console.log(this.state.center); vec3.scaleAndAdd(this.state.center, this.state.center, forward, dy * 10); vec3.scaleAndAdd(this.state.center, this.state.center, left, -dx * 10); From 0195240791b8512543834f0c325c00420f6e1f4b Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Thu, 19 Oct 2023 16:33:55 -0400 Subject: [PATCH 35/46] point color fixes --- src/lib/plot/primitives/points.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 6c34566ca..4402a793b 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -81,7 +81,7 @@ export class Points implements Drawable { uniforms: { size: options.pointSize, - color: this.colors ?? DEFAULT_COLOR, + color: singleColor && this.colors ? this.colors : DEFAULT_COLOR, }, count: plot.regl.prop("count"), @@ -103,5 +103,6 @@ export class Points implements Drawable { count: this.count, colors: this.colors ?? DEFAULT_COLOR, }); + console.log(this.drawCommand.stats.count); } } From a6e974ef971a2586377795f54350def561414064 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 13:29:48 -0400 Subject: [PATCH 36/46] fix key error --- src/components/common/CustomHandle.tsx | 44 +++++++++++-------- src/components/common/HandleComponent.tsx | 4 +- .../common/LogicHandleComponent.tsx | 8 +++- src/components/common/ParamTooltip.tsx | 17 ++++--- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/components/common/CustomHandle.tsx b/src/components/common/CustomHandle.tsx index 4d5eefeb2..b5926192d 100644 --- a/src/components/common/CustomHandle.tsx +++ b/src/components/common/CustomHandle.tsx @@ -26,32 +26,40 @@ type CustomHandleProps = HandleProps & id: string; desc: string | null; }; + nodeId: string; } & HandleVariantProps; -const HandleWrapper = forwardRef( - ({ variant, param, type, className, ...props }, ref) => { - return ( - - ); - }, -); +const HandleWrapper = forwardRef< + HTMLDivElement, + Omit +>(({ variant, param, type, className, ...props }, ref) => { + return ( + + ); +}); HandleWrapper.displayName = "HandleWrapper"; -export const CustomHandle = ({ type, param, ...props }: CustomHandleProps) => { +export const CustomHandle = ({ + type, + param, + nodeId, + ...props +}: CustomHandleProps) => { return ( { const outputs = data.outputs ?? []; const inputs = data.inputs ?? []; @@ -22,6 +22,7 @@ const HandleComponent = ({
- {param.desc?.split("\n").map((line) => ( - - {line} -
-
- )) ?? "No description."} + {param.desc + ?.split("\n") + .filter((s) => s !== "") + .map((line) => ( + + {line} +
+
+ )) ?? "No description."}
, From c8122490f1e5b07cc3ad957e52821da4c8466e37 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 13:29:56 -0400 Subject: [PATCH 37/46] add text color to theme --- src/components/nodes/visual/ScatterNode.tsx | 11 +++++++++-- src/components/nodes/visual/plotConstants.ts | 9 ++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/nodes/visual/ScatterNode.tsx b/src/components/nodes/visual/ScatterNode.tsx index c890cd4ef..344b84d0c 100644 --- a/src/components/nodes/visual/ScatterNode.tsx +++ b/src/components/nodes/visual/ScatterNode.tsx @@ -13,7 +13,12 @@ import { import Scatter from "@src/assets/nodes/Scatter"; import { useCandyGraph } from "@src/hooks/useCandyGraph"; import { useTheme } from "@src/providers/themeProvider"; -import { PLOT_HEIGHT, PLOT_WIDTH, darkTheme, lightTheme } from "./plotConstants"; +import { + PLOT_HEIGHT, + PLOT_WIDTH, + darkTheme, + lightTheme, +} from "./plotConstants"; const viewport = { x: 0, y: 0, width: PLOT_WIDTH, height: PLOT_HEIGHT }; const dpr = window.devicePixelRatio; @@ -69,12 +74,14 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { tickOffset: -2, axisColor: [0.5, 0.5, 0.5, 1], tickColor: [0.5, 0.5, 0.5, 1], + labelColor: theme.text, }), new OrthoAxis(cg, coords, "y", font, { - tickStep: Math.pow(10, Math.round(Math.log10(yMax - yMin)) - 1), + tickStep: Math.pow(10, Math.round(Math.log10(yMax - yMin)) - 1) * 2, tickOffset: 2, axisColor: [0.5, 0.5, 0.5, 1], tickColor: [0.5, 0.5, 0.5, 1], + labelColor: theme.text, }), ] : []; diff --git a/src/components/nodes/visual/plotConstants.ts b/src/components/nodes/visual/plotConstants.ts index 44e07b0a1..192d17d7f 100644 --- a/src/components/nodes/visual/plotConstants.ts +++ b/src/components/nodes/visual/plotConstants.ts @@ -3,16 +3,19 @@ export const PLOT_HEIGHT = 224; export type Color = [number, number, number, number]; export type Theme = { - bg: Color, - accent: Color, -} + bg: Color; + accent: Color; + text: Color; +}; export const lightTheme: Theme = { bg: [0.98, 0.98, 0.98, 1], accent: [0.48, 0.38, 1, 1], + text: [0.1, 0.1, 0.1, 1], }; export const darkTheme: Theme = { bg: [0.05, 0.05, 0.05, 1], accent: [0.598, 0.957, 1, 1], + text: [0.9, 0.9, 0.9, 1], }; From 7a3bdf5586898ffab1c2ad7230e2024b126875c9 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 13:30:01 -0400 Subject: [PATCH 38/46] logging --- PYTHON/nodes | 2 +- src/lib/plot/plot.ts | 4 ++++ src/lib/plot/primitives/plane.ts | 1 + src/lib/plot/primitives/points.ts | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index 53f04fc88..d0650d5a4 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit 53f04fc88a48d25d4ba652d752886836d702fbc4 +Subproject commit d0650d5a421b333a1e563e9a7f46d671e121e512 diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts index 0e913cc15..d725ac128 100644 --- a/src/lib/plot/plot.ts +++ b/src/lib/plot/plot.ts @@ -15,6 +15,7 @@ export class Plot { private objects: Drawable[] = []; constructor(canvas: HTMLCanvasElement, options: PlotOptions) { + console.log(`Instantiating plot object for canvas ${canvas.id}`) this.regl = REGL(canvas); this.canvas = canvas; this.backgroundColor = options.backgroundColor ?? [0.2, 0.2, 0.2, 1]; @@ -23,6 +24,7 @@ export class Plot { } public with(obj: Drawable | Drawable[]) { + console.log(`Adding object ${typeof obj} to ${this.canvas.id}`) if (Array.isArray(obj)) { this.objects.push(...obj); return this; @@ -46,6 +48,7 @@ export class Plot { } public frame() { + console.log(`Starting frame for ${this.canvas.id}`) if (this.camera) { this.regl.frame(() => { this.regl.clear({ @@ -69,6 +72,7 @@ export class Plot { } public destroy() { + console.log(`Destroying plot for ${this.canvas.id}`) this.regl.destroy(); } } diff --git a/src/lib/plot/primitives/plane.ts b/src/lib/plot/primitives/plane.ts index 33c58fb69..a952d5f9d 100644 --- a/src/lib/plot/primitives/plane.ts +++ b/src/lib/plot/primitives/plane.ts @@ -30,6 +30,7 @@ export class OrthogonalPlane implements Drawable { options: OrthogonalPlaneOptions, props?: Partial>, ) { + console.log("Instantiating plane"); this.vertices = this.createVertices(options); this.color = props?.color ?? [0.5, 0.5, 0.5, 1]; diff --git a/src/lib/plot/primitives/points.ts b/src/lib/plot/primitives/points.ts index 4402a793b..b6d9a3da0 100644 --- a/src/lib/plot/primitives/points.ts +++ b/src/lib/plot/primitives/points.ts @@ -36,6 +36,7 @@ export class Points implements Drawable { options: PointsOptions, initialProps: Omit, ) { + console.log("Instantiating points"); this.points = initialProps.points; this.count = initialProps.points.length; this.colors = initialProps.colors; @@ -103,6 +104,5 @@ export class Points implements Drawable { count: this.count, colors: this.colors ?? DEFAULT_COLOR, }); - console.log(this.drawCommand.stats.count); } } From e4648dc3b7540518b8acd59b1d89b3858b777d8a Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 13:59:25 -0400 Subject: [PATCH 39/46] use orjson instead for serialization --- captain/internal/wsmanager.py | 11 ++++--- poetry.lock | 61 ++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + src/web-socket/socket.ts | 5 +-- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/captain/internal/wsmanager.py b/captain/internal/wsmanager.py index 9392c1c99..9b5ad4d82 100644 --- a/captain/internal/wsmanager.py +++ b/captain/internal/wsmanager.py @@ -3,7 +3,7 @@ from flojoy import PlotlyJSONEncoder from queue import Queue from typing import Any, Union -import json +import orjson from captain.types.worker import WorkerJobResponse import threading import traceback @@ -44,7 +44,8 @@ async def disconnect(self, socket_id: str): del self.active_connections_map[socket_id] # this method sends a message to all connected websockets - async def broadcast(self, message: Union[dict[str, Any], WorkerJobResponse]): + async def broadcast(self, message: Union[dict[str, Any], + WorkerJobResponse]): if not isinstance(message, WorkerJobResponse): return @@ -56,9 +57,9 @@ async def broadcast(self, message: Union[dict[str, Any], WorkerJobResponse]): continue try: - await connection.send_text( - json.dumps(message, cls=PlotlyJSONEncoder) - ) + await connection.send_bytes( + orjson.dumps(message, + option=orjson.OPT_SERIALIZE_NUMPY)) except Exception as e: print( f"Error in broadcast to {id}", diff --git a/poetry.lock b/poetry.lock index e89db86ac..4f1bbb186 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1878,6 +1878,65 @@ files = [ deprecated = ">=1.2.6" importlib-metadata = ">=6.0,<7.0" +[[package]] +name = "orjson" +version = "3.9.9" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.9-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f28090060a31f4d11221f9ba48b2273b0d04b702f4dcaa197c38c64ce639cc51"}, + {file = "orjson-3.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8038ba245d0c0a6337cfb6747ea0c51fe18b0cf1a4bc943d530fd66799fae33d"}, + {file = "orjson-3.9.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:543b36df56db195739c70d645ecd43e49b44d5ead5f8f645d2782af118249b37"}, + {file = "orjson-3.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e7877256b5092f1e4e48fc0f1004728dc6901e7a4ffaa4acb0a9578610aa4ce"}, + {file = "orjson-3.9.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b83e0d8ba4ca88b894c3e00efc59fe6d53d9ffb5dbbb79d437a466fc1a513d"}, + {file = "orjson-3.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef06431f021453a47a9abb7f7853f04f031d31fbdfe1cc83e3c6aadde502cce"}, + {file = "orjson-3.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0a1a4d9e64597e550428ba091e51a4bcddc7a335c8f9297effbfa67078972b5c"}, + {file = "orjson-3.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:879d2d1f6085c9c0831cec6716c63aaa89e41d8e036cabb19a315498c173fcc6"}, + {file = "orjson-3.9.9-cp310-none-win32.whl", hash = "sha256:d3f56e41bc79d30fdf077073072f2377d2ebf0b946b01f2009ab58b08907bc28"}, + {file = "orjson-3.9.9-cp310-none-win_amd64.whl", hash = "sha256:ab7bae2b8bf17620ed381e4101aeeb64b3ba2a45fc74c7617c633a923cb0f169"}, + {file = "orjson-3.9.9-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:31d676bc236f6e919d100fb85d0a99812cff1ebffaa58106eaaec9399693e227"}, + {file = "orjson-3.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:678ffb5c0a6b1518b149cc328c610615d70d9297e351e12c01d0beed5d65360f"}, + {file = "orjson-3.9.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71b0cc21f2c324747bc77c35161e0438e3b5e72db6d3b515310457aba743f7f"}, + {file = "orjson-3.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae72621f216d1d990468291b1ec153e1b46e0ed188a86d54e0941f3dabd09ee8"}, + {file = "orjson-3.9.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:512e5a41af008e76451f5a344941d61f48dddcf7d7ddd3073deb555de64596a6"}, + {file = "orjson-3.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f89dc338a12f4357f5bf1b098d3dea6072fb0b643fd35fec556f4941b31ae27"}, + {file = "orjson-3.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:957a45fb201c61b78bcf655a16afbe8a36c2c27f18a998bd6b5d8a35e358d4ad"}, + {file = "orjson-3.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1c01cf4b8e00c7e98a0a7cf606a30a26c32adf2560be2d7d5d6766d6f474b31"}, + {file = "orjson-3.9.9-cp311-none-win32.whl", hash = "sha256:397a185e5dd7f8ebe88a063fe13e34d61d394ebb8c70a443cee7661b9c89bda7"}, + {file = "orjson-3.9.9-cp311-none-win_amd64.whl", hash = "sha256:24301f2d99d670ded4fb5e2f87643bc7428a54ba49176e38deb2887e42fe82fb"}, + {file = "orjson-3.9.9-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bd55ea5cce3addc03f8fb0705be0cfed63b048acc4f20914ce5e1375b15a293b"}, + {file = "orjson-3.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b28c1a65cd13fff5958ab8b350f0921121691464a7a1752936b06ed25c0c7b6e"}, + {file = "orjson-3.9.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b97a67c47840467ccf116136450c50b6ed4e16a8919c81a4b4faef71e0a2b3f4"}, + {file = "orjson-3.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75b805549cbbcb963e9c9068f1a05abd0ea4c34edc81f8d8ef2edb7e139e5b0f"}, + {file = "orjson-3.9.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5424ecbafe57b2de30d3b5736c5d5835064d522185516a372eea069b92786ba6"}, + {file = "orjson-3.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2cd6ef4726ef1b8c63e30d8287225a383dbd1de3424d287b37c1906d8d2855"}, + {file = "orjson-3.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c959550e0705dc9f59de8fca1a316da0d9b115991806b217c82931ac81d75f74"}, + {file = "orjson-3.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ece2d8ed4c34903e7f1b64fb1e448a00e919a4cdb104fc713ad34b055b665fca"}, + {file = "orjson-3.9.9-cp312-none-win_amd64.whl", hash = "sha256:f708ca623287186e5876256cb30599308bce9b2757f90d917b7186de54ce6547"}, + {file = "orjson-3.9.9-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:335406231f9247f985df045f0c0c8f6b6d5d6b3ff17b41a57c1e8ef1a31b4d04"}, + {file = "orjson-3.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b5440a5d215d9e1cfd4aee35fd4101a8b8ceb8329f549c16e3894ed9f18b5"}, + {file = "orjson-3.9.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e98ca450cb4fb176dd572ce28c6623de6923752c70556be4ef79764505320acb"}, + {file = "orjson-3.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3bf6ca6bce22eb89dd0650ef49c77341440def966abcb7a2d01de8453df083a"}, + {file = "orjson-3.9.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb50d869b3c97c7c5187eda3759e8eb15deb1271d694bc5d6ba7040db9e29036"}, + {file = "orjson-3.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fcf06c69ccc78e32d9f28aa382ab2ab08bf54b696dbe00ee566808fdf05da7d"}, + {file = "orjson-3.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9a4402e7df1b5c9a4c71c7892e1c8f43f642371d13c73242bda5964be6231f95"}, + {file = "orjson-3.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b20becf50d4aec7114dc902b58d85c6431b3a59b04caa977e6ce67b6fee0e159"}, + {file = "orjson-3.9.9-cp38-none-win32.whl", hash = "sha256:1f352117eccac268a59fedac884b0518347f5e2b55b9f650c2463dd1e732eb61"}, + {file = "orjson-3.9.9-cp38-none-win_amd64.whl", hash = "sha256:c4eb31a8e8a5e1d9af5aa9e247c2a52ad5cf7e968aaa9aaefdff98cfcc7f2e37"}, + {file = "orjson-3.9.9-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a308aeac326c2bafbca9abbae1e1fcf682b06e78a54dad0347b760525838d85"}, + {file = "orjson-3.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e159b97f5676dcdac0d0f75ec856ef5851707f61d262851eb41a30e8fadad7c9"}, + {file = "orjson-3.9.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f692e7aabad92fa0fff5b13a846fb586b02109475652207ec96733a085019d80"}, + {file = "orjson-3.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cffb77cf0cd3cbf20eb603f932e0dde51b45134bdd2d439c9f57924581bb395b"}, + {file = "orjson-3.9.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c63eca397127ebf46b59c9c1fb77b30dd7a8fc808ac385e7a58a7e64bae6e106"}, + {file = "orjson-3.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f0c024a75e8ba5d9101facb4fb5a028cdabe3cdfe081534f2a9de0d5062af2"}, + {file = "orjson-3.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8cba20c9815c2a003b8ca4429b0ad4aa87cb6649af41365821249f0fd397148e"}, + {file = "orjson-3.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:906cac73b7818c20cf0f6a7dde5a6f009c52aecc318416c7af5ea37f15ca7e66"}, + {file = "orjson-3.9.9-cp39-none-win32.whl", hash = "sha256:50232572dd300c49f134838c8e7e0917f29a91f97dbd608d23f2895248464b7f"}, + {file = "orjson-3.9.9-cp39-none-win_amd64.whl", hash = "sha256:920814e02e3dd7af12f0262bbc18b9fe353f75a0d0c237f6a67d270da1a1bb44"}, + {file = "orjson-3.9.9.tar.gz", hash = "sha256:02e693843c2959befdd82d1ebae8b05ed12d1cb821605d5f9fe9f98ca5c9fd2b"}, +] + [[package]] name = "packaging" version = "23.2" @@ -4000,4 +4059,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "dc3f6261bb74aae6b20f25746f3bf7853d4fda88200118a446d377a1f80159f7" +content-hash = "7d85549f0ee3b0db10e6fb0876991bf99eec87dde834a830a3f1622391b484bf" diff --git a/pyproject.toml b/pyproject.toml index dbc69c00d..7779844f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ pyrealsense2 = "^2.54.2.5684" taulidarcamera = "^0.0.5" sympy = "^1.12" opencv-python = "^4.8.1.78" +orjson = "^3.9.9" [tool.poetry.group.dev.dependencies] diff --git a/src/web-socket/socket.ts b/src/web-socket/socket.ts index 08a8cf78e..699cd42ad 100644 --- a/src/web-socket/socket.ts +++ b/src/web-socket/socket.ts @@ -56,8 +56,9 @@ export class WebSocketServer { this.init(); } init() { - this.server.onmessage = (ev) => { - const data = JSON.parse(ev.data); + this.server.onmessage = async (ev) => { + const blob = new Blob([ev.data], {type: 'application/json'}); + const data = JSON.parse(await blob.text()); switch (data.type) { case "worker_response": if (ResponseEnum.systemStatus in data) { From 15e7dbd4fb026a80e0af5621474636efc1f8625f Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 14:40:35 -0400 Subject: [PATCH 40/46] fix shadow --- src/components/nodes/visual/ScatterNode.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/nodes/visual/ScatterNode.tsx b/src/components/nodes/visual/ScatterNode.tsx index 344b84d0c..547e24c4f 100644 --- a/src/components/nodes/visual/ScatterNode.tsx +++ b/src/components/nodes/visual/ScatterNode.tsx @@ -111,7 +111,7 @@ const ScatterNode = ({ data, selected, id }: CustomNodeProps) => { > From 4cced6c280281b0ccbbbf9cf4f49462771cf80d3 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Fri, 20 Oct 2023 14:47:39 -0400 Subject: [PATCH 41/46] key error fix --- src/feature/logs/Logs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/feature/logs/Logs.tsx b/src/feature/logs/Logs.tsx index fe7a54e57..ee532b686 100644 --- a/src/feature/logs/Logs.tsx +++ b/src/feature/logs/Logs.tsx @@ -47,7 +47,7 @@ const Logs = ({ logs }: { logs: string[] }) => { > {logs.map((log, i) => (
Date: Tue, 24 Oct 2023 12:25:35 -0400 Subject: [PATCH 42/46] adjust camera motion multipliers --- src/lib/plot/camera.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/plot/camera.ts b/src/lib/plot/camera.ts index a9e493abb..da51a2dd4 100644 --- a/src/lib/plot/camera.ts +++ b/src/lib/plot/camera.ts @@ -83,19 +83,19 @@ export class Camera { const leftButtonPressed = ev.buttons & 1; ev.preventDefault(); ev.stopPropagation(); - const dx = (ev.movementX / window.innerWidth) * this.state.distance; - const dy = (ev.movementY / window.innerHeight) * this.state.distance; + const dx = (ev.movementX / window.innerWidth); + const dy = (ev.movementY / window.innerHeight); if (leftButtonPressed && ev.ctrlKey) { this.rotate(dx, dy); } else if (leftButtonPressed) { - this.pan(dx, dy); + this.pan(dx * this.state.distance, dy * this.state.distance); } }; const onMouseWheel = (ev: WheelEvent) => { ev.preventDefault(); ev.stopPropagation(); - this.ddistance += ev.deltaY / window.innerHeight; + this.ddistance += ev.deltaY / window.innerHeight / 4; }; plot.canvas.addEventListener("mousemove", onMouseMove); From 74b826d61afaf213eb3561e59b260af48462f754 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 24 Oct 2023 12:25:46 -0400 Subject: [PATCH 43/46] bump version --- pkgs/flojoy/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/flojoy/pyproject.toml b/pkgs/flojoy/pyproject.toml index 4d84a396c..75ea1bfe9 100644 --- a/pkgs/flojoy/pyproject.toml +++ b/pkgs/flojoy/pyproject.toml @@ -7,7 +7,7 @@ authors = [ "Dallas Strandell ", ] name = "flojoy" -version = "0.1.16" +version = "0.1.17" description = "" readme = "README.md" From eda35edc5248348212d05c2dd792470298b283ed Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 24 Oct 2023 12:33:48 -0400 Subject: [PATCH 44/46] bump packages --- poetry.lock | 645 ++++++++++++++++++++++++++----------------------- pyproject.toml | 1 + 2 files changed, 350 insertions(+), 296 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4f1bbb186..fba56a467 100644 --- a/poetry.lock +++ b/poetry.lock @@ -91,13 +91,13 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "azure-core" -version = "1.29.4" +version = "1.29.5" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.29.4.tar.gz", hash = "sha256:500b3aa9bf2e90c5ccc88bb105d056114ca0ce7d0ce73afb8bc4d714b2fc7568"}, - {file = "azure_core-1.29.4-py3-none-any.whl", hash = "sha256:b03261bcba22c0b9290faf9999cedd23e849ed2577feee90515694cea6bc74bf"}, + {file = "azure-core-1.29.5.tar.gz", hash = "sha256:52983c89d394c6f881a121e5101c5fa67278ca3b1f339c8fb2ef39230c70e9ac"}, + {file = "azure_core-1.29.5-py3-none-any.whl", hash = "sha256:0fa04b7b1f7d44a4fb8468c4093deb2ea01fdf4faddbf802ed9205615f99d68c"}, ] [package.dependencies] @@ -138,29 +138,29 @@ files = [ [[package]] name = "black" -version = "23.10.0" +version = "23.10.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.10.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:f8dc7d50d94063cdfd13c82368afd8588bac4ce360e4224ac399e769d6704e98"}, - {file = "black-23.10.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:f20ff03f3fdd2fd4460b4f631663813e57dc277e37fb216463f3b907aa5a9bdd"}, - {file = "black-23.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3d9129ce05b0829730323bdcb00f928a448a124af5acf90aa94d9aba6969604"}, - {file = "black-23.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:960c21555be135c4b37b7018d63d6248bdae8514e5c55b71e994ad37407f45b8"}, - {file = "black-23.10.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:30b78ac9b54cf87bcb9910ee3d499d2bc893afd52495066c49d9ee6b21eee06e"}, - {file = "black-23.10.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:0e232f24a337fed7a82c1185ae46c56c4a6167fb0fe37411b43e876892c76699"}, - {file = "black-23.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31946ec6f9c54ed7ba431c38bc81d758970dd734b96b8e8c2b17a367d7908171"}, - {file = "black-23.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:c870bee76ad5f7a5ea7bd01dc646028d05568d33b0b09b7ecfc8ec0da3f3f39c"}, - {file = "black-23.10.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:6901631b937acbee93c75537e74f69463adaf34379a04eef32425b88aca88a23"}, - {file = "black-23.10.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:481167c60cd3e6b1cb8ef2aac0f76165843a374346aeeaa9d86765fe0dd0318b"}, - {file = "black-23.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74892b4b836e5162aa0452393112a574dac85e13902c57dfbaaf388e4eda37c"}, - {file = "black-23.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:47c4510f70ec2e8f9135ba490811c071419c115e46f143e4dce2ac45afdcf4c9"}, - {file = "black-23.10.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:76baba9281e5e5b230c9b7f83a96daf67a95e919c2dfc240d9e6295eab7b9204"}, - {file = "black-23.10.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:a3c2ddb35f71976a4cfeca558848c2f2f89abc86b06e8dd89b5a65c1e6c0f22a"}, - {file = "black-23.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db451a3363b1e765c172c3fd86213a4ce63fb8524c938ebd82919bf2a6e28c6a"}, - {file = "black-23.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:7fb5fc36bb65160df21498d5a3dd330af8b6401be3f25af60c6ebfe23753f747"}, - {file = "black-23.10.0-py3-none-any.whl", hash = "sha256:e223b731a0e025f8ef427dd79d8cd69c167da807f5710add30cdf131f13dd62e"}, - {file = "black-23.10.0.tar.gz", hash = "sha256:31b9f87b277a68d0e99d2905edae08807c007973eaa609da5f0c62def6b7c0bd"}, + {file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"}, + {file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"}, + {file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"}, + {file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"}, + {file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"}, + {file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"}, + {file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"}, + {file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:7670242e90dc129c539e9ca17665e39a146a761e681805c54fbd86015c7c84f7"}, + {file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"}, + {file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"}, + {file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"}, + {file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"}, ] [package.dependencies] @@ -286,101 +286,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.0" +version = "3.3.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, + {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, + {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, ] [[package]] @@ -589,34 +589,34 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.4" +version = "41.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, - {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, - {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, - {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, - {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, - {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, - {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, - {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, - {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, - {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797"}, + {file = "cryptography-41.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da"}, + {file = "cryptography-41.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548"}, + {file = "cryptography-41.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d"}, + {file = "cryptography-41.0.5-cp37-abi3-win32.whl", hash = "sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936"}, + {file = "cryptography-41.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88"}, + {file = "cryptography-41.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179"}, + {file = "cryptography-41.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723"}, + {file = "cryptography-41.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84"}, + {file = "cryptography-41.0.5.tar.gz", hash = "sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7"}, ] [package.dependencies] @@ -779,7 +779,7 @@ typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "flojoy" -version = "0.1.16" +version = "0.1.17" description = "" optional = false python-versions = "~3.10" @@ -876,13 +876,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2023.9.2" +version = "2023.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.9.2-py3-none-any.whl", hash = "sha256:603dbc52c75b84da501b9b2ec8c11e1f61c25984c4a0dda1f129ef391fbfc9b4"}, - {file = "fsspec-2023.9.2.tar.gz", hash = "sha256:80bfb8c70cc27b2178cc62a935ecf242fc6e8c3fb801f9c571fc01b1e715ba7d"}, + {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, + {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, ] [package.extras] @@ -1560,6 +1560,62 @@ files = [ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] +[[package]] +name = "line-profiler" +version = "4.1.1" +description = "Line-by-line profiler" +optional = false +python-versions = ">=3.6" +files = [ + {file = "line_profiler-4.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a33d728098af1c0d24a7d6cb121bf4627d423fcd6bc6759525df4b1713fcf7cb"}, + {file = "line_profiler-4.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832fb1b2fcec6f466d1b28456ea6bd5208784326202569631100b7281331ca3c"}, + {file = "line_profiler-4.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86851d76cbc3c74c6cb1685cb22802e75b61f8c1d5cf4c1e7c9f3d8c7a032053"}, + {file = "line_profiler-4.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:99991e9af0b94aa41e3bf7745a21ea194076bd18640d63fdd6f2a535aaa030d0"}, + {file = "line_profiler-4.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b0707458ce16be63855c12f42790bef520ec9674a7373cbb2eec28e3c00dffeb"}, + {file = "line_profiler-4.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:1e750b1575e1e8c16da4a045ba4d566eb119a40b0a4ec9c4290cde6f7b2aa292"}, + {file = "line_profiler-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c0c4367077cb77187aca50ee79df1e09348d05dbf0a15341f50741101daa3"}, + {file = "line_profiler-4.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14944cf27c355f37e577d5c9a19192d9225766065fc3ea6bfc244ea10f6a4b9b"}, + {file = "line_profiler-4.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c00f4740640aa729fe7118d0dd3c2b96af201c20afcbb5c5f71e1a3cfa10d8"}, + {file = "line_profiler-4.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e9712fcae893ada6217586e3a4d73eaf7a1146596bb9e8152c963413eeb06384"}, + {file = "line_profiler-4.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9f7fec0d06f96e963cc30647f65442e5264f31c80d0f60dcd4a059973bf24281"}, + {file = "line_profiler-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:521eae25a5629e30e3f93a1aedfd20e423352316af29ba1805f8a60fe2b8ec37"}, + {file = "line_profiler-4.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d89030daef504e4d329f9405e1aae5e1191d8bb51c2bb75f8842b2b910544521"}, + {file = "line_profiler-4.1.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cbaa08adac1df3b16440ed00b73645cba008355e6e36ffd44f114e91ae554f6"}, + {file = "line_profiler-4.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e6c83a2a5cee7fb3b313141b3be12ff4eb1ba7ec31fb6739ac16a2f45cd001"}, + {file = "line_profiler-4.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e9873556c851423c4ef112d5391b4d51b8e9f57f031d54a64687f36e17d5efd"}, + {file = "line_profiler-4.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b3ed8a4150f7005c477853a97e3d7d36359d0bbdf5992b22cc050eb2b915a9a0"}, + {file = "line_profiler-4.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d231d8ebda1c0daa8b5c9467932a30602855e6cec7d3e8bd1593a3be0f7e4764"}, + {file = "line_profiler-4.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4d3b9026d2ee110a67b696783f5ad6c198d707701d563401a99d0dd386c5339"}, + {file = "line_profiler-4.1.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dea7e688ede3bf1ab85fa71963847472ab5e88ca0d70d46ad5acdd788af584e0"}, + {file = "line_profiler-4.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f67eed9a168293b7ebc5082ec003b4f72c5bd16853a57188d1060e5b6bb2232"}, + {file = "line_profiler-4.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:66288d7b28c65a647186d5127593041f4ffe9e78649bc4fc2b309d74d2ca6c1f"}, + {file = "line_profiler-4.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b987232d30f659591c978a40192e66f3815c9be8300cc927d264af9cd9eb73b8"}, + {file = "line_profiler-4.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7e37b62e47814081e36e33c9aee27c966e22ae4ac05b45515e45e5992d121698"}, + {file = "line_profiler-4.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:93401ea36653105568824becebe21e2a3c0c3e14b671268692b0af979ffa3cda"}, + {file = "line_profiler-4.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c0f4953090cb280ea6ab3d1fe1b194c4233deb1ee13ce5dc7701b6351fc244f"}, + {file = "line_profiler-4.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebea1e3a07f5f2925e6acc52007f041f173fe925b4876ce8c8b169620bf04f3"}, + {file = "line_profiler-4.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:508f5b6fd43047b0da2cf746f89b56064f23ac9040a1bdc258323634a1e17789"}, + {file = "line_profiler-4.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d161a6e34a8998cd7b94cd7e59c0501a4c06e32a9b0211125f03cbe7643c8142"}, + {file = "line_profiler-4.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:b432ab2424763103ab01cd7cd38d02de921530b05bc488240be587b29d64fa94"}, + {file = "line_profiler-4.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec5850c0fdcd7d2b55065c4c3fa92578e0d1331d610431f19af99ed056ef53dd"}, + {file = "line_profiler-4.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afa938b78de445f418825017732d4d4ff7a04398c02b57b15803e7936dfd0b39"}, + {file = "line_profiler-4.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ada23285e774adfec4088ca8a53565fcd55397d0c2287a03835f9e319785b3e"}, + {file = "line_profiler-4.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:924ab02db0d4572dd5f4945c1e0239ec300003fdce47a8ae1775a72477442d92"}, + {file = "line_profiler-4.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc9703f7aeff1e445661e3cc5b65f139e5e9a0f0666d0cde173586b841401fda"}, + {file = "line_profiler-4.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:583f3e6282a47f5f1c2aeb1234114f0d49d2eba0bb9c1f05c268d1543fe85794"}, + {file = "line_profiler-4.1.1.tar.gz", hash = "sha256:2fa73d2ac736902e0a6d1e74cf663244218d9c238a7aa5b5acfd6ac6d4672830"}, +] + +[package.extras] +all = ["Cython (==3.0.0a11)", "Cython (>=0.29.24,<=3.0.0a11)", "IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.11.2)", "cibuildwheel (>=2.8.1)", "cmake (>=3.21.2)", "coverage[toml] (>=5.3)", "ninja (>=1.10.2)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "rich (>=12.3.0)", "scikit-build (>=0.11.1)", "ubelt (>=1.3.3)", "xdoctest (>=1.1.1)"] +all-strict = ["Cython (==0.29.24)", "Cython (==3.0.0a11)", "IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.11.2)", "cibuildwheel (==2.8.1)", "cmake (==3.21.2)", "coverage[toml] (==5.3)", "ninja (==1.10.2)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "rich (==12.3.0)", "scikit-build (==0.11.1)", "ubelt (==1.3.3)", "xdoctest (==1.1.1)"] +ipython = ["IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)"] +ipython-strict = ["IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)"] +optional = ["IPython (>=7.14.0)", "IPython (>=7.18.0)", "IPython (>=8.12.2)", "IPython (>=8.14.0)", "rich (>=12.3.0)"] +optional-strict = ["IPython (==7.14.0)", "IPython (==7.18.0)", "IPython (==8.12.2)", "IPython (==8.14.0)", "rich (==12.3.0)"] +tests = ["coverage[toml] (>=5.3)", "pytest (>=4.6.0)", "pytest (>=4.6.0)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=4.6.11)", "pytest (>=4.6.0,<=6.1.2)", "pytest (>=6.2.5)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.8.1)", "pytest-cov (>=2.9.0)", "pytest-cov (>=3.0.0)", "ubelt (>=1.3.3)", "xdoctest (>=1.1.1)"] +tests-strict = ["coverage[toml] (==5.3)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pytest-cov (==2.8.1)", "pytest-cov (==2.8.1)", "pytest-cov (==2.9.0)", "pytest-cov (==3.0.0)", "ubelt (==1.3.3)", "xdoctest (==1.1.1)"] + [[package]] name = "matplotlib" version = "3.8.0" @@ -1712,21 +1768,21 @@ files = [ [[package]] name = "networkx" -version = "3.1" +version = "3.2" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, - {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, + {file = "networkx-3.2-py3-none-any.whl", hash = "sha256:8b25f564bd28f94ac821c58b04ae1a3109e73b001a7d476e4bb0d00d63706bf8"}, + {file = "networkx-3.2.tar.gz", hash = "sha256:bda29edf392d9bfa5602034c767d28549214ec45f620081f0b74dc036a1fbbc1"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numpy" @@ -3104,20 +3160,20 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.17.35" +version = "0.18.1" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3" files = [ - {file = "ruamel.yaml-0.17.35-py3-none-any.whl", hash = "sha256:b105e3e6fc15b41fdb201ba1b95162ae566a4ef792b9f884c46b4ccc5513a87a"}, - {file = "ruamel.yaml-0.17.35.tar.gz", hash = "sha256:801046a9caacb1b43acc118969b49b96b65e8847f29029563b29ac61d02db61b"}, + {file = "ruamel.yaml-0.18.1-py3-none-any.whl", hash = "sha256:93907ef6c731ec1bcb41ab7ff99413945f5acfd7eee27785f2cb18b175dd5aae"}, + {file = "ruamel.yaml-0.18.1.tar.gz", hash = "sha256:649a301890441d36ea9cb0f48d07353de82b8cbde2244387e7ef6b1d3b9ee6cd"}, ] [package.dependencies] "ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd"] +docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] @@ -3181,37 +3237,37 @@ contextlib2 = ">=0.5.5" [[package]] name = "scikit-learn" -version = "1.3.1" +version = "1.3.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, - {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, - {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, - {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, - {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, - {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, - {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, - {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, - {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, - {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, - {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, - {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, - {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, - {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, - {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, - {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, ] [package.dependencies] @@ -3611,47 +3667,42 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "uvloop" -version = "0.18.0" +version = "0.19.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.18.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f354d669586fca96a9a688c585b6257706d216177ac457c92e15709acaece10"}, - {file = "uvloop-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:280904236a5b333a273292b3bcdcbfe173690f69901365b973fa35be302d7781"}, - {file = "uvloop-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad79cd30c7e7484bdf6e315f3296f564b3ee2f453134a23ffc80d00e63b3b59e"}, - {file = "uvloop-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99deae0504547d04990cc5acf631d9f490108c3709479d90c1dcd14d6e7af24d"}, - {file = "uvloop-0.18.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:edbb4de38535f42f020da1e3ae7c60f2f65402d027a08a8c60dc8569464873a6"}, - {file = "uvloop-0.18.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:54b211c46facb466726b227f350792770fc96593c4ecdfaafe20dc00f3209aef"}, - {file = "uvloop-0.18.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25b714f07c68dcdaad6994414f6ec0f2a3b9565524fba181dcbfd7d9598a3e73"}, - {file = "uvloop-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1121087dfeb46e9e65920b20d1f46322ba299b8d93f7cb61d76c94b5a1adc20c"}, - {file = "uvloop-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74020ef8061678e01a40c49f1716b4f4d1cc71190d40633f08a5ef8a7448a5c6"}, - {file = "uvloop-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4a549cd747e6f4f8446f4b4c8cb79504a8372d5d3a9b4fc20e25daf8e76c05"}, - {file = "uvloop-0.18.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6132318e1ab84a626639b252137aa8d031a6c0550250460644c32ed997604088"}, - {file = "uvloop-0.18.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:585b7281f9ea25c4a5fa993b1acca4ad3d8bc3f3fe2e393f0ef51b6c1bcd2fe6"}, - {file = "uvloop-0.18.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:61151cc207cf5fc88863e50de3d04f64ee0fdbb979d0b97caf21cae29130ed78"}, - {file = "uvloop-0.18.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c65585ae03571b73907b8089473419d8c0aff1e3826b3bce153776de56cbc687"}, - {file = "uvloop-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3d301e23984dcbc92d0e42253e0e0571915f0763f1eeaf68631348745f2dccc"}, - {file = "uvloop-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:680da98f12a7587f76f6f639a8aa7708936a5d17c5e7db0bf9c9d9cbcb616593"}, - {file = "uvloop-0.18.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:75baba0bfdd385c886804970ae03f0172e0d51e51ebd191e4df09b929771b71e"}, - {file = "uvloop-0.18.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ed3c28337d2fefc0bac5705b9c66b2702dc392f2e9a69badb1d606e7e7f773bb"}, - {file = "uvloop-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8849b8ef861431543c07112ad8436903e243cdfa783290cbee3df4ce86d8dd48"}, - {file = "uvloop-0.18.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211ce38d84118ae282a91408f61b85cf28e2e65a0a8966b9a97e0e9d67c48722"}, - {file = "uvloop-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0a8f706b943c198dcedf1f2fb84899002c195c24745e47eeb8f2fb340f7dfc3"}, - {file = "uvloop-0.18.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:58e44650cbc8607a218caeece5a689f0a2d10be084a69fc32f7db2e8f364927c"}, - {file = "uvloop-0.18.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b8b7cf7806bdc745917f84d833f2144fabcc38e9cd854e6bc49755e3af2b53e"}, - {file = "uvloop-0.18.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:56c1026a6b0d12b378425e16250acb7d453abaefe7a2f5977143898db6cfe5bd"}, - {file = "uvloop-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:12af0d2e1b16780051d27c12de7e419b9daeb3516c503ab3e98d364cc55303bb"}, - {file = "uvloop-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b028776faf9b7a6d0a325664f899e4c670b2ae430265189eb8d76bd4a57d8a6e"}, - {file = "uvloop-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53aca21735eee3859e8c11265445925911ffe410974f13304edb0447f9f58420"}, - {file = "uvloop-0.18.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:847f2ed0887047c63da9ad788d54755579fa23f0784db7e752c7cf14cf2e7506"}, - {file = "uvloop-0.18.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6e20bb765fcac07879cd6767b6dca58127ba5a456149717e0e3b1f00d8eab51c"}, - {file = "uvloop-0.18.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e14de8800765b9916d051707f62e18a304cde661fa2b98a58816ca38d2b94029"}, - {file = "uvloop-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f3b18663efe0012bc4c315f1b64020e44596f5fabc281f5b0d9bc9465288559c"}, - {file = "uvloop-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6d341bc109fb8ea69025b3ec281fcb155d6824a8ebf5486c989ff7748351a37"}, - {file = "uvloop-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:895a1e3aca2504638a802d0bec2759acc2f43a0291a1dff886d69f8b7baff399"}, - {file = "uvloop-0.18.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d90858f32a852988d33987d608bcfba92a1874eb9f183995def59a34229f30d"}, - {file = "uvloop-0.18.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db1fcbad5deb9551e011ca589c5e7258b5afa78598174ac37a5f15ddcfb4ac7b"}, - {file = "uvloop-0.18.0.tar.gz", hash = "sha256:d5d1135beffe9cd95d0350f19e2716bc38be47d5df296d7cc46e3b7557c0d1ff"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, ] [package.extras] @@ -3773,81 +3824,83 @@ files = [ [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] [[package]] @@ -3947,17 +4000,17 @@ files = [ [[package]] name = "xarray" -version = "2023.9.0" +version = "2023.10.1" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.9" files = [ - {file = "xarray-2023.9.0-py3-none-any.whl", hash = "sha256:3fc4a558bd70968040a4e1cefc6ddb3f9a7a86ef6a48e67857156ffe655d3a66"}, - {file = "xarray-2023.9.0.tar.gz", hash = "sha256:271955c05dc626dad37791a7807d920aaf9c64cac71d03b45ec7e402cc646603"}, + {file = "xarray-2023.10.1-py3-none-any.whl", hash = "sha256:71ea549e9be6dfeab19c2736acf659967b861aad2397691a80e5fad0c61db2ad"}, + {file = "xarray-2023.10.1.tar.gz", hash = "sha256:9eeee170c3fc2f3321eb6ba40c17ffe4d8c98d49d55e4a3fba66a75bdc7dd9e5"}, ] [package.dependencies] -numpy = ">=1.21" +numpy = ">=1.22" packaging = ">=21.3" pandas = ">=1.4" @@ -4059,4 +4112,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "7d85549f0ee3b0db10e6fb0876991bf99eec87dde834a830a3f1622391b484bf" +content-hash = "27750d3938352a380ee3e1d7091fec78e59c0e0e66d70b670f934d0987b31a36" diff --git a/pyproject.toml b/pyproject.toml index 7779844f3..094176469 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ taulidarcamera = "^0.0.5" sympy = "^1.12" opencv-python = "^4.8.1.78" orjson = "^3.9.9" +line-profiler = "^4.1.1" [tool.poetry.group.dev.dependencies] From e9aa73209a7addd8c4a609694327babff0129adf Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Wed, 25 Oct 2023 11:04:27 -0400 Subject: [PATCH 45/46] Some logging --- PYTHON/nodes | 2 +- src/lib/plot/plot.ts | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/PYTHON/nodes b/PYTHON/nodes index d0650d5a4..1f98f612b 160000 --- a/PYTHON/nodes +++ b/PYTHON/nodes @@ -1 +1 @@ -Subproject commit d0650d5a421b333a1e563e9a7f46d671e121e512 +Subproject commit 1f98f612bf379600af2c341c70f5141a440fd3fb diff --git a/src/lib/plot/plot.ts b/src/lib/plot/plot.ts index d725ac128..45f6ee90e 100644 --- a/src/lib/plot/plot.ts +++ b/src/lib/plot/plot.ts @@ -15,7 +15,7 @@ export class Plot { private objects: Drawable[] = []; constructor(canvas: HTMLCanvasElement, options: PlotOptions) { - console.log(`Instantiating plot object for canvas ${canvas.id}`) + console.log(`Instantiating plot object for canvas ${canvas.id}`); this.regl = REGL(canvas); this.canvas = canvas; this.backgroundColor = options.backgroundColor ?? [0.2, 0.2, 0.2, 1]; @@ -24,7 +24,7 @@ export class Plot { } public with(obj: Drawable | Drawable[]) { - console.log(`Adding object ${typeof obj} to ${this.canvas.id}`) + console.log(`Adding object ${typeof obj} to ${this.canvas.id}`); if (Array.isArray(obj)) { this.objects.push(...obj); return this; @@ -48,7 +48,8 @@ export class Plot { } public frame() { - console.log(`Starting frame for ${this.canvas.id}`) + console.log(`Starting frame for ${this.canvas.id}`); + if (this.camera) { this.regl.frame(() => { this.regl.clear({ @@ -72,7 +73,7 @@ export class Plot { } public destroy() { - console.log(`Destroying plot for ${this.canvas.id}`) + console.log(`Destroying plot for ${this.canvas.id}`); this.regl.destroy(); } } From 1f6229a921a7f4778df2818540e13a0f78b71b18 Mon Sep 17 00:00:00 2001 From: JeffDotPng Date: Tue, 7 Nov 2023 15:50:12 -0500 Subject: [PATCH 46/46] fix manifest error --- captain/utils/manifest/generate_manifest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/captain/utils/manifest/generate_manifest.py b/captain/utils/manifest/generate_manifest.py index 81aecdae6..cbc880f5d 100644 --- a/captain/utils/manifest/generate_manifest.py +++ b/captain/utils/manifest/generate_manifest.py @@ -8,6 +8,7 @@ NAME_MAP = { "AI_ML": "AI & ML", + "COMPUTER_VISION": "Computer Vision", "DATA": "Data", "DSP": "Digital Signal Processing", "IMAGE": "Image", @@ -29,6 +30,7 @@ # A node will inherit the type of its parent if it is not in the allowed types. ALLOWED_TYPES = [ "AI_ML", + "COMPUTER_VISION", "DATA", "VISUALIZATION", "MATH", @@ -53,6 +55,7 @@ "ETL", "DSP", "IMAGE", + "COMPUTER_VISION", "CONTROL_FLOW", "HARDWARE", "DSP",