diff --git a/coprocessors/configure-linux-router.sh b/coprocessors/configure-linux-router.sh index 3c7df3e..f7fde7a 100755 --- a/coprocessors/configure-linux-router.sh +++ b/coprocessors/configure-linux-router.sh @@ -9,6 +9,7 @@ ip link set $IFACE down # Set the IP address and routable subnet of the interface echo "Setting IP address and subnet..." ip addr add 10.36.36.1/24 dev $IFACE +ip addr add 10.36.36.2/24 dev $IFACE # Enable IP forwarding echo "Enabling IP forwarding..." diff --git a/coprocessors/flake.lock b/coprocessors/flake.lock index a6f0bbf..ca4c65b 100644 --- a/coprocessors/flake.lock +++ b/coprocessors/flake.lock @@ -23,11 +23,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -58,23 +58,6 @@ "type": "github" } }, - "mesa-panfork": { - "flake": false, - "locked": { - "lastModified": 1670633863, - "narHash": "sha256-4eZHMiYS+sRDHNBtLZTA8ELZnLns7yT3USU5YQswxQ0=", - "owner": "panfork", - "repo": "mesa", - "rev": "120202c675749c5ef81ae4c8cdc30019b4de08f4", - "type": "gitlab" - }, - "original": { - "owner": "panfork", - "ref": "csf", - "repo": "mesa", - "type": "gitlab" - } - }, "naersk": { "inputs": { "nixpkgs": "nixpkgs_2" @@ -93,13 +76,50 @@ "type": "github" } }, + "nixlib": { + "locked": { + "lastModified": 1709426687, + "narHash": "sha256-jLBZmwXf0WYHzLkmEMq33bqhX55YtT5edvluFr0RcSA=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "7873d84a89ae6e4841528ff7f5697ddcb5bdfe6c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixos-generators": { + "inputs": { + "nixlib": "nixlib", + "nixpkgs": [ + "nixos-rk3588", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709557527, + "narHash": "sha256-PV8oYqhTHX6FGZMQ1m5dhRuS914AhofPwgnAMhUZtwE=", + "owner": "nix-community", + "repo": "nixos-generators", + "rev": "d048d6fc4bada612ff08d4b9d5edc48d45389431", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixos-generators", + "type": "github" + } + }, "nixos-hardware": { "locked": { - "lastModified": 1708091350, - "narHash": "sha256-o28BJYi68qqvHipT7V2jkWxDiMS1LF9nxUsou+eFUPQ=", + "lastModified": 1709410583, + "narHash": "sha256-esOSUoQ7mblwcsSea0K17McZuwAIjoS6dq/4b83+lvw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "106d3fec43bcea19cb2e061ca02531d54b542ce3", + "rev": "59e37017b9ed31dee303dbbd4531c594df95cfbc", "type": "github" }, "original": { @@ -112,18 +132,18 @@ "nixos-rk3588": { "inputs": { "flake-utils": "flake-utils", - "mesa-panfork": "mesa-panfork", + "nixos-generators": "nixos-generators", "nixpkgs": [ "nixpkgs" ], "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1703010942, - "narHash": "sha256-YYNCF1cnVyQk6OPVnwyvpeg3brwS/ICRGAvFwe2RCZc=", + "lastModified": 1709799829, + "narHash": "sha256-/hUwUFhKMRXRXU9tdW2GhqzyjrbR+duZbPMUcKdiCZ4=", "owner": "ryan4yin", "repo": "nixos-rk3588", - "rev": "fce637ae61bc0fce3c68c39c117d08bcc8e2bedf", + "rev": "52d63fecbaebd6fd0dab22d9a48d96084e8ca4e9", "type": "github" }, "original": { @@ -134,28 +154,26 @@ }, "nixpkgs": { "locked": { - "lastModified": 1708105575, - "narHash": "sha256-sS4AItZeUnAei6v8FqxNlm+/27MPlfoGym/TZP0rmH0=", + "lastModified": 1709703039, + "narHash": "sha256-6hqgQ8OK6gsMu1VtcGKBxKQInRLHtzulDo9Z5jxHEFY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1d1817869c47682a6bee85b5b0a6537b6c0fba26", + "rev": "9df3e30ce24fd28c7b3e2de0d986769db5d6225d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1707205916, - "narHash": "sha256-fmRJilYGlB7VCt3XsdYxrA0u8e/K84O5xYucerUY0iM=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "8cc79aa39bbc6eaedaf286ae655b224c71e02907", - "type": "github" + "lastModified": 0, + "narHash": "sha256-n6F0n8UV6lnTZbYPl1A9q1BS0p4hduAv1mGAP17CVd0=", + "path": "/nix/store/bjvqq8c79dbi59g7xzcc6lhl0f19m3d7-source", + "type": "path" }, "original": { "id": "nixpkgs", @@ -204,11 +222,11 @@ ] }, "locked": { - "lastModified": 1708286249, - "narHash": "sha256-kleRBU/1hbQdYCQrlahOdOzshOVWdzDkKbIYmsO+zJs=", + "lastModified": 1711075133, + "narHash": "sha256-0RU6tD3oGyQlCaX0zPBfKX1GfV0wgoxznKB/pa5zA3Y=", "owner": "FRC3636", "repo": "rgb-2024", - "rev": "a718855c6f8815d98f0b1285a8644aabe8e02cd5", + "rev": "eee8468ec24085b45e8d78c5983369789de55759", "type": "github" }, "original": { diff --git a/coprocessors/flake.nix b/coprocessors/flake.nix index 5c7f768..e2e73cc 100644 --- a/coprocessors/flake.nix +++ b/coprocessors/flake.nix @@ -2,7 +2,7 @@ description = "Coprocessor NixOS configurations for 3636's 2024 FRC robot."; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixos-rk3588 = { url = "github:ryan4yin/nixos-rk3588"; inputs.nixpkgs.follows = "nixpkgs"; @@ -70,7 +70,8 @@ }; overlays.default = self: super: { - photonvision = self.callPackage ./pkgs/photonvision.nix { }; + photonvision = self.callPackage ./pkgs/photonvision { }; + pplib-coprocessor = self.callPackage ./pkgs/pplib-coprocessor { }; rgb-2024 = rgb-2024.packages.${self.system}.default; }; diff --git a/coprocessors/hosts/copepod/default.nix b/coprocessors/hosts/copepod/default.nix index 2793b1c..b18de66 100644 --- a/coprocessors/hosts/copepod/default.nix +++ b/coprocessors/hosts/copepod/default.nix @@ -11,66 +11,146 @@ }; kernelModules = [ "spidev" ]; }; + systemd.services.rgb-2024 = { + description = "RGB LED strip driver"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + unitConfig = { + # Allow infinite restarts + StartLimitIntervalSec = "0"; + }; + serviceConfig = { + Type = "simple"; + ExecStart = "${pkgs.rgb-2024}/bin/rgb-2024"; + Restart = "on-failure"; + + RestartSec = 3; + }; + }; hardware = { raspberry-pi."4".apply-overlays-dtmerge.enable = true; deviceTree = { enable = true; filter = "*rpi-4-*.dtb"; - overlays = [{ - name = "spi"; - dtsText = '' - /dts-v1/; - /plugin/; - - / { - compatible = "raspberrypi"; - fragment@0 { - target = <&spi>; - __overlay__ { - cs-gpios = <&gpio 8 1>, <&gpio 7 1>; - status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&spi0_pins &spi0_cs_pins>; - #address-cells = <1>; - #size-cells = <0>; - spidev@0 { - reg = <0>; // CE0 - spi-max-frequency = <500000>; - compatible = "spidev"; - }; - - spidev@1 { - reg = <1>; // CE1 - spi-max-frequency = <500000>; - compatible = "spidev"; - }; - }; - }; - fragment@1 { - target = <&alt0>; - __overlay__ { - // Drop GPIO 7, SPI 8-11 - brcm,pins = <4 5>; - }; - }; - - fragment@2 { - target = <&gpio>; - __overlay__ { - spi0_pins: spi0_pins { - brcm,pins = <9 10 11>; - brcm,function = <4>; // alt0 - }; - spi0_cs_pins: spi0_cs_pins { - brcm,pins = <8 7>; - brcm,function = <1>; // out - }; - }; - }; - }; - ''; - }]; + overlays = [ + { + name = "spi0"; + dtsText = '' + /dts-v1/; + /plugin/; + + / { + compatible = "raspberrypi"; + fragment@0 { + target = <&spi>; + __overlay__ { + cs-gpios = <&gpio 8 1>, <&gpio 7 1>; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&spi0_pins &spi0_cs_pins>; + #address-cells = <1>; + #size-cells = <0>; + spidev@0 { + reg = <0>; // CE0 + spi-max-frequency = <500000>; + compatible = "spidev"; + }; + + spidev@1 { + reg = <1>; // CE1 + spi-max-frequency = <500000>; + compatible = "spidev"; + }; + }; + }; + fragment@1 { + target = <&alt0>; + __overlay__ { + // Drop GPIO 7, SPI 8-11 + brcm,pins = <4 5>; + }; + }; + + fragment@2 { + target = <&gpio>; + __overlay__ { + spi0_pins: spi0_pins { + brcm,pins = <9 10 11>; + brcm,function = <4>; // alt0 + }; + spi0_cs_pins: spi0_cs_pins { + brcm,pins = <8 7>; + brcm,function = <1>; // out + }; + }; + }; + }; + ''; + } + { + name = "spi1"; + dtsText = '' + /dts-v1/; + /plugin/; + + + / { + compatible = "raspberrypi"; + + fragment@0 { + target = <&gpio>; + __overlay__ { + spi1_pins: spi1_pins { + brcm,pins = <19 20 21>; + brcm,function = <3>; /* alt4 */ + }; + + spi1_cs_pins: spi1_cs_pins { + brcm,pins = <18>; + brcm,function = <1>; /* output */ + }; + }; + }; + + fragment@1 { + target = <&spi1>; + frag1: __overlay__ { + /* needed to avoid dtc warning */ + #address-cells = <1>; + #size-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&spi1_pins &spi1_cs_pins>; + cs-gpios = <&gpio 18 1>; + status = "okay"; + + spidev1_0: spidev@0 { + compatible = "spidev"; + reg = <0>; /* CE0 */ + #address-cells = <1>; + #size-cells = <0>; + spi-max-frequency = <500000>; + status = "okay"; + }; + }; + }; + + fragment@2 { + target = <&aux>; + __overlay__ { + status = "okay"; + }; + }; + + __overrides__ { + cs0_pin = <&spi1_cs_pins>,"brcm,pins:0", + <&frag1>,"cs-gpios:4"; + cs0_spidev = <&spidev1_0>,"status"; + }; + }; + ''; + } + ]; }; }; @@ -78,10 +158,11 @@ users.groups.gpio = { }; services.udev.extraRules = '' - SUBSYSTEM=="spidev", KERNEL=="spidev0.0", GROUP="spi", MODE="0660" - SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio",MODE="0660" - SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'" - SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add",RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'" + SUBSYSTEM=="spidev", KERNEL=="spidev0.0", GROUP="spi", MODE="0660" + SUBSYSTEM=="spidev", KERNEL=="spidev1.0", GROUP="spi", MODE="0660" + SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio",MODE="0660" + SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'" + SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add",RUN+="${pkgs.bash}/bin/bash -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'" ''; networking = { diff --git a/coprocessors/hosts/tangerine/default.nix b/coprocessors/hosts/tangerine/default.nix index b7c21f1..b05b01a 100644 --- a/coprocessors/hosts/tangerine/default.nix +++ b/coprocessors/hosts/tangerine/default.nix @@ -20,7 +20,14 @@ }; }; - services.photonvision.enable = true; + services.photonvision = { + enable = true; + }; + + services.pplib-coprocessor = { + enable = true; + server = "10.36.36.2"; + }; boot = { binfmt.emulatedSystems = [ "aarch64-linux" ]; diff --git a/coprocessors/modules/default.nix b/coprocessors/modules/default.nix index 7dfb285..2b3282b 100644 --- a/coprocessors/modules/default.nix +++ b/coprocessors/modules/default.nix @@ -5,6 +5,7 @@ ./networking.nix ./administration.nix ./services/photonvision.nix + ./services/pplib-coprocessor.nix ]; config = { diff --git a/coprocessors/modules/networking.nix b/coprocessors/modules/networking.nix index 569470e..35f213e 100644 --- a/coprocessors/modules/networking.nix +++ b/coprocessors/modules/networking.nix @@ -20,6 +20,8 @@ in config = { networking = { + firewall.enable = false; + nameservers = [ "1.1.1.1" "1.0.0.1" ]; interfaces."${robotNetworkConfig.interface}" = { diff --git a/coprocessors/modules/services/pplib-coprocessor.nix b/coprocessors/modules/services/pplib-coprocessor.nix new file mode 100644 index 0000000..8848e94 --- /dev/null +++ b/coprocessors/modules/services/pplib-coprocessor.nix @@ -0,0 +1,41 @@ +{ config, pkgs, lib, ... }: + +with lib; +let + cfg = config.services.pplib-coprocessor; +in +{ + options = { + services.pplib-coprocessor = { + enable = mkEnableOption (mdDoc "Offload PathPlannerLib's pathfinding to a coprocessor"); + package = mkPackageOption pkgs "pplib-coprocessor" {}; + server = mkOption { + type = types.str; + default = "localhost"; + description = "The hostname or address of the PPLib server."; + }; + }; + }; + + config = mkIf cfg.enable { + systemd.services.pplib-coprocessor = { + description = "Offload PathPlannerLib's pathfinding to a coprocessor"; + + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; + + serviceConfig = { + Type = "simple"; + ExecStart = "${cfg.package}/bin/pplib-coprocessor ${cfg.server}"; + + Restart = "on-failure"; + RestartSec = "1"; + }; + }; + + networking.firewall = { + allowedTCPPorts = [ 5800 ]; + allowedTCPPortRanges = [ { from = 1180; to = 1190; } ]; + }; + }; +} diff --git a/coprocessors/pkgs/photonvision.nix b/coprocessors/pkgs/photonvision/default.nix similarity index 100% rename from coprocessors/pkgs/photonvision.nix rename to coprocessors/pkgs/photonvision/default.nix diff --git a/coprocessors/pkgs/pplib-coprocessor/default.nix b/coprocessors/pkgs/pplib-coprocessor/default.nix new file mode 100644 index 0000000..7c6370f --- /dev/null +++ b/coprocessors/pkgs/pplib-coprocessor/default.nix @@ -0,0 +1,24 @@ +{ lib, fetchFromGitHub, buildDartApplication }: + +buildDartApplication rec { + pname = "pplib-coprocessor"; + version = "v2024.0.0-beta-1"; + + src = fetchFromGitHub { + owner = "mjansen4857"; + repo = "pplib_coprocessor"; + rev = version; + hash = "sha256-XYlWLvoV+VSuajgjkguBWUhE4brdLNP1oqHSB/6nr5c="; + }; + + dartEntryPoints."pplib_coprocessor" = "bin/pplib_coprocessor.dart"; + + pubspecLock = lib.importJSON ./pubspec.lock.json; + + meta = with lib; { + description = "Offload PathPlannerLib's pathfinding to a coprocessor"; + homepage = "https://github.com/mjansen4857/pplib_coprocessor"; + license = licenses.mit; + maintainers = with maintainers; [ max-niederman ]; + }; +} \ No newline at end of file diff --git a/coprocessors/pkgs/pplib-coprocessor/pubspec.lock.json b/coprocessors/pkgs/pplib-coprocessor/pubspec.lock.json new file mode 100644 index 0000000..542cb56 --- /dev/null +++ b/coprocessors/pkgs/pplib-coprocessor/pubspec.lock.json @@ -0,0 +1,607 @@ +{ + "packages": { + "_fe_analyzer_shared": { + "dependency": "transitive", + "description": { + "name": "_fe_analyzer_shared", + "sha256": "eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "64.0.0" + }, + "analyzer": { + "dependency": "transitive", + "description": { + "name": "analyzer", + "sha256": "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "6.2.0" + }, + "args": { + "dependency": "direct main", + "description": { + "name": "args", + "sha256": "eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.4.2" + }, + "async": { + "dependency": "transitive", + "description": { + "name": "async", + "sha256": "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.11.0" + }, + "boolean_selector": { + "dependency": "transitive", + "description": { + "name": "boolean_selector", + "sha256": "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.1" + }, + "change": { + "dependency": "transitive", + "description": { + "name": "change", + "sha256": "75b6e28073433946a987e6082d00f08676a8260a6aa68cac8594c10611e7e9b9", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.7.2" + }, + "checked_yaml": { + "dependency": "transitive", + "description": { + "name": "checked_yaml", + "sha256": "feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.0.3" + }, + "cider": { + "dependency": "direct dev", + "description": { + "name": "cider", + "sha256": "918ded9f4473d8042247b9e66a90101eb5ff72935c31df5d511a55f14e085ef0", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.2.4" + }, + "clock": { + "dependency": "transitive", + "description": { + "name": "clock", + "sha256": "cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.1.1" + }, + "collection": { + "dependency": "transitive", + "description": { + "name": "collection", + "sha256": "ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.18.0" + }, + "convert": { + "dependency": "transitive", + "description": { + "name": "convert", + "sha256": "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.1.1" + }, + "coverage": { + "dependency": "transitive", + "description": { + "name": "coverage", + "sha256": "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.6.4" + }, + "crypto": { + "dependency": "transitive", + "description": { + "name": "crypto", + "sha256": "ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.0.3" + }, + "file": { + "dependency": "transitive", + "description": { + "name": "file", + "sha256": "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "7.0.0" + }, + "frontend_server_client": { + "dependency": "transitive", + "description": { + "name": "frontend_server_client", + "sha256": "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.2.0" + }, + "glob": { + "dependency": "transitive", + "description": { + "name": "glob", + "sha256": "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.2" + }, + "http_multi_server": { + "dependency": "transitive", + "description": { + "name": "http_multi_server", + "sha256": "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.2.1" + }, + "http_parser": { + "dependency": "transitive", + "description": { + "name": "http_parser", + "sha256": "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "4.0.2" + }, + "intl": { + "dependency": "transitive", + "description": { + "name": "intl", + "sha256": "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.18.1" + }, + "io": { + "dependency": "transitive", + "description": { + "name": "io", + "sha256": "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.0.4" + }, + "js": { + "dependency": "transitive", + "description": { + "name": "js", + "sha256": "f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.6.7" + }, + "json_annotation": { + "dependency": "transitive", + "description": { + "name": "json_annotation", + "sha256": "b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "4.8.1" + }, + "lints": { + "dependency": "direct dev", + "description": { + "name": "lints", + "sha256": "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.1" + }, + "logging": { + "dependency": "transitive", + "description": { + "name": "logging", + "sha256": "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.0" + }, + "markdown": { + "dependency": "transitive", + "description": { + "name": "markdown", + "sha256": "acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "7.1.1" + }, + "marker": { + "dependency": "transitive", + "description": { + "name": "marker", + "sha256": "3dadd01f3b0ffae148ffb3b1bc04290a98e54a465cddbab59727bd2a9fe57750", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.6.0" + }, + "matcher": { + "dependency": "transitive", + "description": { + "name": "matcher", + "sha256": "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.12.16" + }, + "messagepack": { + "dependency": "transitive", + "description": { + "name": "messagepack", + "sha256": "11e69dd79ba84ba901261558881b42ac8b24155a7846a344875a32c8b0866d71", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.2.1" + }, + "meta": { + "dependency": "transitive", + "description": { + "name": "meta", + "sha256": "a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.10.0" + }, + "mime": { + "dependency": "transitive", + "description": { + "name": "mime", + "sha256": "e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.0.4" + }, + "msgpack_dart": { + "dependency": "transitive", + "description": { + "name": "msgpack_dart", + "sha256": "c2d235ed01f364719b5296aecf43ac330f0d7bc865fa134d0d7910a40454dffb", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.0.1" + }, + "node_preamble": { + "dependency": "transitive", + "description": { + "name": "node_preamble", + "sha256": "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.0.2" + }, + "nt4": { + "dependency": "direct main", + "description": { + "name": "nt4", + "sha256": "1edb547d220f68232378615cd1e320f7455202589e89d1ad33a4aed7839ffa6b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.0" + }, + "package_config": { + "dependency": "transitive", + "description": { + "name": "package_config", + "sha256": "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.0" + }, + "path": { + "dependency": "transitive", + "description": { + "name": "path", + "sha256": "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.8.3" + }, + "pool": { + "dependency": "transitive", + "description": { + "name": "pool", + "sha256": "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.5.1" + }, + "pub_semver": { + "dependency": "transitive", + "description": { + "name": "pub_semver", + "sha256": "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.4" + }, + "pubspec_parse": { + "dependency": "transitive", + "description": { + "name": "pubspec_parse", + "sha256": "c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.3" + }, + "rfc_6901": { + "dependency": "transitive", + "description": { + "name": "rfc_6901", + "sha256": "df1bbfa3d023009598f19636d6114c6ac1e0b7bb7bf6a260f0e6e6ce91416820", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.2.0" + }, + "shelf": { + "dependency": "transitive", + "description": { + "name": "shelf", + "sha256": "ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.4.1" + }, + "shelf_packages_handler": { + "dependency": "transitive", + "description": { + "name": "shelf_packages_handler", + "sha256": "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.0.2" + }, + "shelf_static": { + "dependency": "transitive", + "description": { + "name": "shelf_static", + "sha256": "a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.1.2" + }, + "shelf_web_socket": { + "dependency": "transitive", + "description": { + "name": "shelf_web_socket", + "sha256": "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.0.4" + }, + "source_map_stack_trace": { + "dependency": "transitive", + "description": { + "name": "source_map_stack_trace", + "sha256": "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.1" + }, + "source_maps": { + "dependency": "transitive", + "description": { + "name": "source_maps", + "sha256": "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.10.12" + }, + "source_span": { + "dependency": "transitive", + "description": { + "name": "source_span", + "sha256": "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.10.0" + }, + "stack_trace": { + "dependency": "transitive", + "description": { + "name": "stack_trace", + "sha256": "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.11.1" + }, + "stream_channel": { + "dependency": "transitive", + "description": { + "name": "stream_channel", + "sha256": "ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.1.2" + }, + "string_scanner": { + "dependency": "transitive", + "description": { + "name": "string_scanner", + "sha256": "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.0" + }, + "term_glyph": { + "dependency": "transitive", + "description": { + "name": "term_glyph", + "sha256": "a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.1" + }, + "test": { + "dependency": "direct dev", + "description": { + "name": "test", + "sha256": "a20ddc0723556dc6dd56094e58ec1529196d5d7774156604cb14e8445a5a82ff", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.24.7" + }, + "test_api": { + "dependency": "transitive", + "description": { + "name": "test_api", + "sha256": "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.6.1" + }, + "test_core": { + "dependency": "transitive", + "description": { + "name": "test_core", + "sha256": "96382d0bc826e260b077bb496259e58bc82e90b603ab16cd5ae95dfe1dfcba8b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.5.7" + }, + "typed_data": { + "dependency": "transitive", + "description": { + "name": "typed_data", + "sha256": "facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.3.2" + }, + "version_manipulation": { + "dependency": "transitive", + "description": { + "name": "version_manipulation", + "sha256": "9ef166939794d5bd80309cc6dbfe33c9f81674ba1c73ac117a866fd2dc746846", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "0.1.2" + }, + "vm_service": { + "dependency": "transitive", + "description": { + "name": "vm_service", + "sha256": "a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "12.0.0" + }, + "watcher": { + "dependency": "transitive", + "description": { + "name": "watcher", + "sha256": "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.1.0" + }, + "web_socket_channel": { + "dependency": "transitive", + "description": { + "name": "web_socket_channel", + "sha256": "d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "2.4.0" + }, + "webkit_inspection_protocol": { + "dependency": "transitive", + "description": { + "name": "webkit_inspection_protocol", + "sha256": "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "1.2.1" + }, + "yaml": { + "dependency": "transitive", + "description": { + "name": "yaml", + "sha256": "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5", + "url": "https://pub.dev" + }, + "source": "hosted", + "version": "3.1.2" + } + }, + "sdks": { + "dart": ">=3.1.3 <4.0.0" + } +}