From af6aa5b5b1fc89c2a09a57cfae65315386a79513 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:40:21 -0500 Subject: [PATCH 01/72] Stash --- config.txt | Bin 0 -> 1514536 bytes package-lock.json | 1643 ++++++++++++++++++++++++++++++++- package.json | 5 +- wled00/const.h | 5 +- wled00/data/settings_wifi.htm | 3 + wled00/wled.cpp | 25 +- 6 files changed, 1667 insertions(+), 14 deletions(-) create mode 100644 config.txt diff --git a/config.txt b/config.txt new file mode 100644 index 0000000000000000000000000000000000000000..d68a4f9a48430a10ace4cfc6124ca61592b0eca5 GIT binary patch literal 1514536 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

5+Lry1cXRYq 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.4.0" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -97,6 +126,30 @@ "node": ">=6" } }, + "node_modules/ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -110,12 +163,67 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -128,6 +236,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -166,6 +279,151 @@ "tslib": "^2.0.3" } }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cheerio": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", + "integrity": "sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==", + "dependencies": { + "css-select": "~1.0.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "lodash": "^3.2.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" + }, + "node_modules/cheerio/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/cheerio/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/cheerio/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -190,6 +448,17 @@ "fsevents": "~2.3.2" } }, + "node_modules/clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dependencies": { + "chalk": "^1.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -202,6 +471,46 @@ "node": ">= 10.0" } }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", + "dependencies": { + "q": "^1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -217,6 +526,101 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, + "node_modules/configstore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", + "integrity": "sha512-Zcx2SVdZC06IuRHd2MhkVYFNJBkZBj166LGdsJXRcqNC8Gs5Bwh8mosStNeCBBmtIm4wNii2uarD50qztjKOjw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.1", + "os-tmpdir": "^1.0.0", + "osenv": "^0.1.0", + "uuid": "^2.0.1", + "write-file-atomic": "^1.1.2", + "xdg-basedir": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/configstore/node_modules/uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/css-select": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", + "integrity": "sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "1.0", + "domutils": "1.4", + "nth-check": "~1.0.0" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/css-select/node_modules/domutils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", + "integrity": "sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/css-what": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", + "integrity": "sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==", + "engines": { + "node": "*" + } + }, + "node_modules/csso": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", + "integrity": "sha512-tckZA0LhyEnToPoQDmncCA+TUS3aoIVl/MsSaoipR52Sfa+H83fJvIHRVOHMFn9zW6kIV1L0D7tUDFFjvN28lg==", + "dependencies": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + }, + "bin": { + "csso": "bin/csso" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -234,6 +638,30 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -338,6 +766,34 @@ "tslib": "^2.0.3" } }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -350,6 +806,11 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es6-promise": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "integrity": "sha512-oyOjMhyKMLEjOOtvkwg0G4pAzLQ9WdbbeX7WdqKzvYXu+UFgD0Zo/Brq5Q49zNmnGPPzV5rmYvrr0jz1zWx8Iw==" + }, "node_modules/escape-goat": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", @@ -362,6 +823,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -374,6 +878,27 @@ "node": ">=8" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -388,6 +913,14 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -400,6 +933,71 @@ "node": ">= 6" } }, + "node_modules/got": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", + "integrity": "sha512-7chPlc0pWHjvq7B6dEEXz4GphoDupOvBSSl6AwRsAJX7GPTZ+bturaZiIigX4Dp6KrAP67nvzuKkNc0SLA0DKg==", + "dependencies": { + "duplexify": "^3.2.0", + "infinity-agent": "^2.0.0", + "is-redirect": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "nested-error-stacks": "^1.0.0", + "object-assign": "^3.0.0", + "prepend-http": "^1.0.0", + "read-all-stream": "^3.0.0", + "timed-out": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/got/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -454,16 +1052,117 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "license": "ISC" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/infinity-agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz", + "integrity": "sha512-CnfUJe5o2S9aAQWXGMhDZI4UL39MAJV3guOTfHHIdos4tuVHkl1j/J+1XLQn+CLIvqcpgQR/p+xXYXzcrhCe5w==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inliner": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/inliner/-/inliner-1.13.1.tgz", + "integrity": "sha512-yoS+56puOu+Ug8FBRtxtTFnEn2NHqFs8BNQgSOvzh3J0ommbwNw8VKiaVNYjWK6fgPuByq95KyV0LC+qV9IwLw==", + "dependencies": { + "ansi-escapes": "^1.4.0", + "ansi-styles": "^2.2.1", + "chalk": "^1.1.3", + "charset": "^1.0.0", + "cheerio": "^0.19.0", + "debug": "^2.2.0", + "es6-promise": "^2.3.0", + "iconv-lite": "^0.4.11", + "jschardet": "^1.3.0", + "lodash.assign": "^3.2.0", + "lodash.defaults": "^3.1.2", + "lodash.foreach": "^3.0.3", + "mime": "^1.3.4", + "minimist": "^1.1.3", + "request": "^2.74.0", + "svgo": "^0.6.6", + "then-fs": "^2.0.0", + "uglify-js": "^2.8.0", + "update-notifier": "^0.5.0" + }, + "bin": { + "inliner": "cli/index.js" + } + }, + "node_modules/inliner/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/inliner/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inliner/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -472,6 +1171,11 @@ "node": ">=8" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -481,6 +1185,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -493,6 +1208,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -502,6 +1225,244 @@ "node": ">=0.12.0" } }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jschardet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", + "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", + "integrity": "sha512-HERbxp4SBlmI380+eM0B0u4nxjfTaPeydIMzl9+9UQ4nSu3xMWKlX9WoT34e4wy7VWe67c53Nv9qPVjS8fHKgg==", + "dependencies": { + "package-json": "^1.0.0" + }, + "bin": { + "latest-version": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==" + }, + "node_modules/lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==" + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==" + }, + "node_modules/lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha512-IqUZ9MQo2UT1XPGuBntInqTOlc+oV+bCo0kMp+yuKGsfvRSNgUW0YjWVZUrG/gs+8z/Eyuc0jkJjOBESt9BXxg==", + "dependencies": { + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==" + }, + "node_modules/lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "dependencies": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==" + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==" + }, + "node_modules/lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha512-X7135IXFQt5JDFnYxOVAzVz+kFvwDn3N8DJYf+nrz/mMWEuSu7+OL6rWqsk3+VR1T4TejFCSu5isBJOLSID2bg==", + "dependencies": { + "lodash.assign": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "node_modules/lodash.foreach": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.3.tgz", + "integrity": "sha512-PA7Lp7pe2HMJBoB1vELegEIF3waUFnM0fWDKJVYolwZ4zHh6WTmnq0xmzfQksD66gx2quhDNyBdyaE2T8/DP3Q==", + "dependencies": { + "lodash._arrayeach": "^3.0.0", + "lodash._baseeach": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==" + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -511,6 +1472,14 @@ "tslib": "^2.0.3" } }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -523,6 +1492,25 @@ "node": ">=4.0.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -535,12 +1523,39 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/nested-error-stacks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", + "integrity": "sha512-o32anp9JA7oezPOFSfG2BBXSdHepOm5FpJvwxHWDtfJ3Bg3xdi68S6ijPlEOfUg6quxZWyvJM+8fHk1yMDKspA==", + "dependencies": { + "inherits": "~2.0.1" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -588,6 +1603,76 @@ "node": ">=0.10.0" } }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", + "integrity": "sha512-knDtirWWqKVJrLY3gEBLflVvueTMpyjbAwX/9j/EKi2DsjNemp5voS8cyKyGh57SNaMJNhNRZbIaWdneOcLU1g==", + "dependencies": { + "got": "^3.2.0", + "registry-url": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -608,6 +1693,11 @@ "tslib": "^2.0.3" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -620,12 +1710,134 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "license": "MIT" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "dependencies": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -638,6 +1850,17 @@ "node": ">=8.10.0" } }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -647,6 +1870,99 @@ "node": ">= 0.10" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", + "dependencies": { + "is-finite": "^1.0.0" + }, + "bin": { + "repeating": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/semver": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", @@ -659,6 +1975,25 @@ "node": ">=10" } }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -671,6 +2006,14 @@ "node": ">=10" } }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "engines": { + "node": "*" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -690,6 +2033,83 @@ "source-map": "^0.6.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==", + "dependencies": { + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -702,6 +2122,27 @@ "node": ">=4" } }, + "node_modules/svgo": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", + "integrity": "sha512-C5A1r5SjFesNoKsmc+kWBxmB04iBGH2D/nFy8HJaME9+SyZKcmqcN8QG+GwxIc7D2+JWhaaW7uaM9+XwfplTEQ==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.0.0", + "js-yaml": "~3.6.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/terser": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", @@ -726,6 +2167,22 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, + "node_modules/then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha512-5ffcBcU+vFUCYDNi/o507IqjqrTkuGsLVZ1Fp50hwgZRY7ufVFa9jFfTy5uZ2QnSKacKigWKeaXkOqLa4DsjLw==", + "dependencies": { + "promise": ">=3.2 <8" + } + }, + "node_modules/timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -747,18 +2204,117 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "license": "MIT" }, + "node_modules/update-notifier": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", + "integrity": "sha512-zOGOlUKDAgDlLHLv7Oiszz3pSj8fKlSJ3i0u49sEakjXUEVJ6DMjo/Mh/B6mg2eOALvRTJkd0kbChcipQoYCng==", + "dependencies": { + "chalk": "^1.0.0", + "configstore": "^1.0.0", + "is-npm": "^1.0.0", + "latest-version": "^1.0.0", + "repeating": "^1.1.2", + "semver-diff": "^2.0.0", + "string-length": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/valid-data-url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", @@ -768,6 +2324,24 @@ "node": ">=10" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/web-resource-inliner": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-7.0.0.tgz", @@ -783,6 +2357,67 @@ "engines": { "node": ">=10.0.0" } + }, + "node_modules/whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w==", + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } } } } diff --git a/package.json b/package.json index ce80af580e..2a2a748dd3 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,9 @@ "dependencies": { "clean-css": "^5.3.3", "html-minifier-terser": "^7.2.0", - "web-resource-inliner": "^7.0.0", - "nodemon": "^3.1.9" + "inliner": "^1.13.1", + "nodemon": "^3.1.9", + "web-resource-inliner": "^7.0.0" }, "engines": { "node": ">=20.0.0" diff --git a/wled00/const.h b/wled00/const.h index c81854dad0..d319f94942 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -309,7 +309,7 @@ #define BTN_TYPE_TOUCH_SWITCH 9 //WLEDMM not yet supported //Ethernet board types -#define WLED_NUM_ETH_TYPES 15 //WLEDMM +1 for Olimex ESP32-Gateway +#define WLED_NUM_ETH_TYPES 18 //WLEDMM +1 for Olimex ESP32-Gateway + 3 for W5500 #define WLED_ETH_NONE 0 #define WLED_ETH_WT32_ETH01 1 @@ -326,6 +326,9 @@ #define WLED_ETH_LILYGO_T_POE_PRO 12 #define WLED_ETH_GLEDOPTO 13 #define WLED_ETH_OLIMEX_GTW 14 +#define WLED_ETH_TTGO_T_ETH_LITE_S3 15 +#define WLED_ETH_WAVESHARE_ESP32_S3_ETH 16 +#define WLED_ETH_W5500_GENERIC 17 //Hue error codes #define HUE_ERROR_INACTIVE 0 diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index a0b8778a1e..66be574a0f 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -211,6 +211,9 @@

Ethernet Type

+ + +


diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 26696e569c..6a0f9df1ec 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1085,14 +1085,25 @@ bool WLED::initEthernet() } #endif + // if (!ETH.begin(ETH_PHY_W5500, ETH_ADDR, ETH_CS_PIN, ETH_INT_PIN, ETH_RST_PIN, SPI3_HOST, ETH_SCLK_PIN, ETH_MISO_PIN, ETH_MOSI_PIN)) { + // DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); + // // de-allocate the allocated pins + // for (managed_pin_type mpt : pinsToAllocate) { + // pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + // } + // return false; + // } else { + // Serial.println("ETH initialized W5500!"); + // } + if (!ETH.begin( - (uint8_t) es.eth_address, - (int) es.eth_power, - (int) es.eth_mdc, - (int) es.eth_mdio, - (eth_phy_type_t) es.eth_type, - (eth_clock_mode_t) es.eth_clk_mode - )) { + (uint8_t)es.eth_address, + (int)es.eth_power, + (int)es.eth_mdc, + (int)es.eth_mdio, + (eth_phy_type_t)es.eth_type, + (eth_clock_mode_t)es.eth_clk_mode + )) { DEBUG_PRINTLN(F("initC: ETH.begin() failed")); // de-allocate the allocated pins for (managed_pin_type mpt : pinsToAllocate) { From 2bb266420f56def7df50b5809c902f47e2b88bc4 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 15 Jan 2026 00:38:51 -0500 Subject: [PATCH 02/72] W5500 "onnected" but no IP yet. --- wled00/data/settings_wifi.htm | 6 +- wled00/network.cpp | 133 ++++++++++++++++++++- wled00/src/dependencies/network/Network.h | 3 +- wled00/wled.cpp | 135 ++++++++++++---------- wled00/wled.h | 5 +- wled00/wled_ethernet.h | 7 ++ 6 files changed, 220 insertions(+), 69 deletions(-) diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index 66be574a0f..a3a4206d23 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -211,9 +211,9 @@

Ethernet Type

- - - + + +


diff --git a/wled00/network.cpp b/wled00/network.cpp index a6b4da8cc1..c3e6752a9b 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -33,6 +33,12 @@ const ethernet_settings ethernetBoards[] = { 16, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -43,6 +49,12 @@ const ethernet_settings ethernetBoards[] = { 12, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -53,6 +65,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 16, // eth_mdc, 17, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -63,6 +81,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -73,6 +97,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -83,6 +113,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -93,6 +129,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_IP101, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -103,6 +145,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -113,6 +161,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 33, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -123,6 +177,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -133,6 +193,12 @@ const ethernet_settings ethernetBoards[] = { 12, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode }, @@ -144,6 +210,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode }, @@ -154,19 +226,76 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 33, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, - //WLEDMM: Olimex-ESP32-Gateway (like QuinLed-ESP32-Ethernet { 0, // eth_address, 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_rst_pin, + GPIO_NUM_NC, // eth_int_pin; + GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode + }, + + //WLEDMM: WaveShare ESP32-S3-ETH + { + 1, // eth_address, + GPIO_NUM_NC, // eth_power, + GPIO_NUM_NC, // eth_mdc, + GPIO_NUM_NC, // eth_mdio, + 12, // eth_miso_pin, + 11, // eth_mosi_pin, + 14, // eth_cs_pin, + 9, // eth_rst_pin, + 10, // eth_int_pin; + 13, // eth_sclk_pin; + ETH_PHY_W5500, // eth_type, + ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) + }, + + { + 1, // eth_address, + GPIO_NUM_NC, // eth_power, + GPIO_NUM_NC, // eth_mdc, + GPIO_NUM_NC, // eth_mdio, + 11, // eth_miso_pin, + 12, // eth_mosi_pin, + 9, // eth_cs_pin, + 14, // eth_rst_pin, + 13, // eth_int_pin; + 10, // eth_sclk_pin; + ETH_PHY_W5500, // eth_type, + ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) + }, + + { + 1, // eth_address, + GPIO_NUM_NC, // eth_power, + GPIO_NUM_NC, // eth_mdc, + GPIO_NUM_NC, // eth_mdio, + 12, // eth_miso_pin, + 13, // eth_mosi_pin, + 25, // eth_cs_pin, + 26, // eth_rst_pin, + 27, // eth_int_pin; + 14, // eth_sclk_pin; + ETH_PHY_W5500, // eth_type, + ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) } }; @@ -226,7 +355,7 @@ void WiFiEvent(WiFiEvent_t event) if (staticIP != (uint32_t)0x00000000 && staticGateway != (uint32_t)0x00000000) { ETH.config(staticIP, staticGateway, staticSubnet, IPAddress(8, 8, 8, 8)); } else { - ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); + // ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); } // convert the "serverDescription" into a valid DNS hostname (alphanumeric) char hostname[64]; diff --git a/wled00/src/dependencies/network/Network.h b/wled00/src/dependencies/network/Network.h index 9201d514ea..cb43fda072 100644 --- a/wled00/src/dependencies/network/Network.h +++ b/wled00/src/dependencies/network/Network.h @@ -2,7 +2,8 @@ #include #else // ESP32 #include - #include + // #include + #include "ETHClass2.h" #endif #ifndef Network_h diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 6a0f9df1ec..116ba8621a 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1029,43 +1029,6 @@ bool WLED::initEthernet() // Ethernet initialization should only succeed once -- else reboot required ethernet_settings es = ethernetBoards[ethernetType]; - managed_pin_type pinsToAllocate[10] = { - // first six pins are non-configurable - esp32_nonconfigurable_ethernet_pins[0], - esp32_nonconfigurable_ethernet_pins[1], - esp32_nonconfigurable_ethernet_pins[2], - esp32_nonconfigurable_ethernet_pins[3], - esp32_nonconfigurable_ethernet_pins[4], - esp32_nonconfigurable_ethernet_pins[5], - { (int8_t)es.eth_mdc, true }, // [6] = MDC is output and mandatory - { (int8_t)es.eth_mdio, true }, // [7] = MDIO is bidirectional and mandatory - { (int8_t)es.eth_power, true }, // [8] = optional pin, not all boards use - { ((int8_t)0xFE), false }, // [9] = replaced with eth_clk_mode, mandatory - }; - // update the clock pin.... - if (es.eth_clk_mode == ETH_CLOCK_GPIO0_IN) { - pinsToAllocate[9].pin = 0; - pinsToAllocate[9].isOutput = false; - } else if (es.eth_clk_mode == ETH_CLOCK_GPIO0_OUT) { - pinsToAllocate[9].pin = 0; - pinsToAllocate[9].isOutput = true; - } else if (es.eth_clk_mode == ETH_CLOCK_GPIO16_OUT) { - pinsToAllocate[9].pin = 16; - pinsToAllocate[9].isOutput = true; - } else if (es.eth_clk_mode == ETH_CLOCK_GPIO17_OUT) { - pinsToAllocate[9].pin = 17; - pinsToAllocate[9].isOutput = true; - } else { - DEBUG_PRINT(F("initE: Failing due to invalid eth_clk_mode (")); - DEBUG_PRINT(es.eth_clk_mode); - DEBUG_PRINTLN(")"); - return false; - } - - if (!pinManager.allocateMultiplePins(pinsToAllocate, 10, PinOwner::Ethernet)) { - DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); - return false; - } /* For LAN8720 the most correct way is to perform clean reset each time before init @@ -1085,31 +1048,81 @@ bool WLED::initEthernet() } #endif - // if (!ETH.begin(ETH_PHY_W5500, ETH_ADDR, ETH_CS_PIN, ETH_INT_PIN, ETH_RST_PIN, SPI3_HOST, ETH_SCLK_PIN, ETH_MISO_PIN, ETH_MOSI_PIN)) { - // DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); - // // de-allocate the allocated pins - // for (managed_pin_type mpt : pinsToAllocate) { - // pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); - // } - // return false; - // } else { - // Serial.println("ETH initialized W5500!"); - // } - - if (!ETH.begin( - (uint8_t)es.eth_address, - (int)es.eth_power, - (int)es.eth_mdc, - (int)es.eth_mdio, - (eth_phy_type_t)es.eth_type, - (eth_clock_mode_t)es.eth_clk_mode - )) { - DEBUG_PRINTLN(F("initC: ETH.begin() failed")); - // de-allocate the allocated pins - for (managed_pin_type mpt : pinsToAllocate) { - pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + if (es.eth_type == ETH_PHY_W5500) { + managed_pin_type pinsToAllocate[6] = { + { (int8_t)es.eth_miso_pin, false }, // MISO is input + { (int8_t)es.eth_mosi_pin, true }, // MOSI is output + { (int8_t)es.eth_cs_pin, true }, // CS is output + { (int8_t)es.eth_rst_pin, true }, // RST is output + { (int8_t)es.eth_int_pin, false }, // INT is input + { (int8_t)es.eth_sclk_pin, true }, // SCLK is output + }; + if (!pinManager.allocateMultiplePins(pinsToAllocate, 6, PinOwner::Ethernet)) { + DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); + return false; + } + if (!ETH.begin(ETH_PHY_W5500, es.eth_address, es.eth_cs_pin, es.eth_int_pin, es.eth_rst_pin, SPI3_HOST, es.eth_sclk_pin, es.eth_miso_pin, es.eth_mosi_pin)) { + DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); + // de-allocate the allocated pins + for (managed_pin_type mpt : pinsToAllocate) { + pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + } + return false; + } else { + Serial.println("ETH initialized W5500!"); + } + } else { + managed_pin_type pinsToAllocate[10] = { + // first six pins are non-configurable + esp32_nonconfigurable_ethernet_pins[0], + esp32_nonconfigurable_ethernet_pins[1], + esp32_nonconfigurable_ethernet_pins[2], + esp32_nonconfigurable_ethernet_pins[3], + esp32_nonconfigurable_ethernet_pins[4], + esp32_nonconfigurable_ethernet_pins[5], + { (int8_t)es.eth_mdc, true }, // [6] = MDC is output and mandatory + { (int8_t)es.eth_mdio, true }, // [7] = MDIO is bidirectional and mandatory + { (int8_t)es.eth_power, true }, // [8] = optional pin, not all boards use + { ((int8_t)0xFE), false }, // [9] = replaced with eth_clk_mode, mandatory + }; + // update the clock pin.... + if (es.eth_clk_mode == ETH_CLOCK_GPIO0_IN) { + pinsToAllocate[9].pin = 0; + pinsToAllocate[9].isOutput = false; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO0_OUT) { + pinsToAllocate[9].pin = 0; + pinsToAllocate[9].isOutput = true; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO16_OUT) { + pinsToAllocate[9].pin = 16; + pinsToAllocate[9].isOutput = true; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO17_OUT) { + pinsToAllocate[9].pin = 17; + pinsToAllocate[9].isOutput = true; + } else { + DEBUG_PRINT(F("initE: Failing due to invalid eth_clk_mode (")); + DEBUG_PRINT(es.eth_clk_mode); + DEBUG_PRINTLN(")"); + return false; + } + if (!pinManager.allocateMultiplePins(pinsToAllocate, 10, PinOwner::Ethernet)) { + DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); + return false; + } + if (!ETH.begin( + (eth_phy_type_t)es.eth_type, + (uint8_t)es.eth_address, + (int)es.eth_power, + (int)es.eth_mdc, + (int)es.eth_mdio, + (eth_clock_mode_t)es.eth_clk_mode + )) { + DEBUG_PRINTLN(F("initC: ETH.begin() failed")); + // de-allocate the allocated pins + for (managed_pin_type mpt : pinsToAllocate) { + pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + } + return false; } - return false; } successfullyConfiguredEthernet = true; diff --git a/wled00/wled.h b/wled00/wled.h index 751411d000..0f862220b9 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -108,7 +108,8 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - #include + // #include + #include "ETHClass2.h" #include "esp_wifi.h" #include #include @@ -352,7 +353,7 @@ WLED_GLOBAL int8_t irPin _INIT(IRPIN); #endif //WLED_GLOBAL byte presetToApply _INIT(0); - +WLED_GLOBAL ETHClass2 ETH; WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server to use // WiFi CONFIG (all these can be changed via web UI, no need to set them here) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 6b8f0ba56f..d9122c81ac 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -17,11 +17,18 @@ // ETH_CLOCK_GPIO0_OUT == ESP32 provides 50MHz clock output via GPIO0 // ETH_CLOCK_GPIO16_OUT == ESP32 provides 50MHz clock output via GPIO16 // ETH_CLOCK_GPIO17_OUT == ESP32 provides 50MHz clock output via GPIO17 + typedef struct EthernetSettings { uint8_t eth_address; int eth_power; int eth_mdc; int eth_mdio; + int eth_miso_pin; + int eth_mosi_pin; + int eth_cs_pin; + int eth_rst_pin; + int eth_int_pin; + int eth_sclk_pin; eth_phy_type_t eth_type; eth_clock_mode_t eth_clk_mode; } ethernet_settings; From dc41ebb72ea642ad366c687717fd9a7ccc01b57d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 15 Jan 2026 01:30:06 -0500 Subject: [PATCH 03/72] W5500 working oin ESP32 for Quindor --- wled00/network.cpp | 9 ++++++++- wled00/src/dependencies/network/Network.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index c3e6752a9b..f934899e78 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -355,13 +355,19 @@ void WiFiEvent(WiFiEvent_t event) if (staticIP != (uint32_t)0x00000000 && staticGateway != (uint32_t)0x00000000) { ETH.config(staticIP, staticGateway, staticSubnet, IPAddress(8, 8, 8, 8)); } else { - // ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); + ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); } // convert the "serverDescription" into a valid DNS hostname (alphanumeric) char hostname[64]; prepareHostname(hostname); ETH.setHostname(hostname); showWelcomePage = false; + USER_PRINTF("Ethernet link is up. Speed is %u mbit and link is %sfull duplex! (MAC: ", ETH.linkSpeed(), ETH.fullDuplex() ? "" : "not "); + USER_PRINT(ETH.macAddress()); + USER_PRINTLN(")"); + escapedMac = ETH.macAddress(); + escapedMac.replace(":", ""); + escapedMac.toLowerCase(); break; } case SYSTEM_EVENT_ETH_DISCONNECTED: @@ -375,6 +381,7 @@ void WiFiEvent(WiFiEvent_t event) break; #endif default: + DEBUG_PRINTF("Unhandled Network event: %d\n", (int)event); break; } } diff --git a/wled00/src/dependencies/network/Network.h b/wled00/src/dependencies/network/Network.h index cb43fda072..570e0858ef 100644 --- a/wled00/src/dependencies/network/Network.h +++ b/wled00/src/dependencies/network/Network.h @@ -4,6 +4,7 @@ #include // #include #include "ETHClass2.h" + extern ETHClass2 ETH; #endif #ifndef Network_h From 7037edd8c7dba00c33a4d59ecd2e2c42c60c8123 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 15 Jan 2026 10:54:13 -0500 Subject: [PATCH 04/72] Fix for non-W5500 Ethernet (wrrong ETH.begin() order) --- wled00/wled.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 116ba8621a..87827e2b44 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1047,7 +1047,7 @@ bool WLED::initEthernet() delayMicroseconds(10); } #endif - + if (es.eth_type == ETH_PHY_W5500) { managed_pin_type pinsToAllocate[6] = { { (int8_t)es.eth_miso_pin, false }, // MISO is input @@ -1111,9 +1111,9 @@ bool WLED::initEthernet() if (!ETH.begin( (eth_phy_type_t)es.eth_type, (uint8_t)es.eth_address, - (int)es.eth_power, (int)es.eth_mdc, (int)es.eth_mdio, + (int)es.eth_power, (eth_clock_mode_t)es.eth_clk_mode )) { DEBUG_PRINTLN(F("initC: ETH.begin() failed")); From 8a114b2e77c05d930faf89338336f3abde7c2963 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:41:30 -0500 Subject: [PATCH 05/72] W5500 addition should work for S3 and others now too --- config.txt | Bin 1514536 -> 0 bytes wled00/network.cpp | 37 ++++++++++++++++++++++--------------- wled00/wled.cpp | 5 +++++ wled00/wled_ethernet.h | 24 ++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 15 deletions(-) delete mode 100644 config.txt diff --git a/config.txt b/config.txt deleted file mode 100644 index d68a4f9a48430a10ace4cfc6124ca61592b0eca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514536 zcmeFaSyNm~(k+M2@1?V7^l~o#Ikobf^7tmA>=cjk~ zTH)!6Vb2*mQ%J`ROZJdEBVv1aczC!k_xS(*-{ryO;KShK;M3q{a56X^%;5YA_x=Z0 zN4PhG|CfV{!Rg>^@D@*94GwYl%-x&8-Amk=87vQe8~l6la&V1bUE%+~@eE7(=FYeA z`;)jjNg++q#|iE zUP(jz`plJ+wry|h661H=Lp#^dN6!Y21`m2F)0a0K@xmw2VO$DmdpFV26HxM9c1hB^ zeDi+F+ZpT)b_Yw~mm$u^eb0r#!-)I(D`{Ll9uCqr@eRq{Z!oIfj`^m07;B!J$9+pF z>t~4@W9zWIxu%DfKa^{}6ve9A$1Chx)!0eZziA z$$2BuXhIp+t+Yc(!6VS+3-k->NHX7FjC7oHclQc+KSP(G#M4=)%ltsi;hobWhL}M= zK~teNzAP`;?^ z{yQlB2=z(Xtn~za#XchyLcQGUx>9RdsYCQJweKtZouS<)gF84MX{}acl09lqz(1$ zl~%-KWZLaLMO!&uxMDj2Wv+342>P5jTBrOG$~IElucr7GU3;=vI#)(VgZHBrcy9Hj zr@!HRHitG};_n>4eTUzYTW8$};0o^=cV-4p@%eMaMU)ix@R@gfbr;8n_(r%Z?u~X= z^=(pq(KeDN+LaqW)vcC~SW~km_LAu4TzOH3yah$#lKqwR;4IeHGx)4v4ft~K0{yyx zYq_iI?_u!$xNpP~eJw-Ow}%z~5NrJP!74sdXW0{LgMIw**=5)R*73_NT(^1tC4TiB zE3^Np8oa`B z2b5YK{0@rn?jGLgUpQy$=P_FEXVu1DT?UnQag2Fr5j9nPH^g{YL92H0%pQ6yhwtN( z_&2??_y)3SQfZzu7p=M#6;}?TJJC`nO6*RcE0VRmq&HpB9HcL_D*lsz-jkakfPwQTn4OB~tj z>`AT`_i@GbO)<=>4O#QRrdXa$UIUsQCitc{KEOsb0&~5XT|W8$%p7@m{PW)NG4d zDtjS(E7MZBYK^T2IXxAZWOj(Y?OLX#hNHLYT;x-1K`|{=s3o+y4O%MOGYjo)e0g&K zO^_a%W7v?t!1@#7;m$AiqS5_xRikC-0u+-=?u@y3c5 z-Ft=1`=MMT^eL_qi{20Z!n6)gH-9FQs96Uvt%Ei|k09tn=NV7yAP(>vx-F4)A7S;R zo$&)ccY$_$AK5wB%c6DAZu-_~#&DsA8oHM6f7w(% zTjIIWpVhaY<@1+yrQaVtq=)N5K&paOn+8iy8g1R^v7uXLwtOh{;a-q z{bgP0#OjlNd{1AloYj{e{?gaLl~2f-*Wk?<;V1Z>5bIfX&T>NZX*>zJL;TnJ_-F{0K+$}vG>fI33G%?$6@Mgr% zlEVGgs&pfolW6U(rC*|TH$cf&^~UjoG$c|jEPCAjbmEt(s( zX$kcBhEaM1{~@u!d-#7flB;*1S&(P`j%&77koKg0k-ly2P#)Z%jziS<9wpAf;>5@S zi6J33z5wM`fyVw1s4w+Ba=qQA^x`u))Omq+ox(=M_+^pAS7?#agONP<@E)gV=VSPS z-(bFdgYy%Nm4~>#kN*$c*{S>HKHl~*xat(&zrpbde)|~T%;U~u{E9TKpBIa7Cmh{0 zi>buVnJJ5PH`VH;)X>Q*FDr{>wYk$&-(+UfV#}J^q0}C4el4qS8Z+)V^{PDni206w z+41J!vYPvyl{wRe=$BY4<+zJ^wFx^ZEtat-D{OD2h_S>X%hDRW54-s8;T>N?Ja>#Q zeOWqN+$WAlT0D!nLva7oK=Wvw-Ow{a#Ytm&#%tT;kv+a$lfw7-8YYGE@ij~X>l4;C zImAy`iN^!9~H0k`^^!?Z)@E%3DoK=Vxs> znypB}E_%O@uI;+&Vq2vr(ptsmEh{1F`m7^oCB&N2I*9+<$yh(IOs-AdLx;VLn=$7Ju;{R!Vnj|*oJ z1F{Q_xB*UN-SJhZJ9^D7wr!+!m}Zw!B)+DO+65OaePf#4ub|m^9fqKI=fSN<8{1YzVnM>*wR9`LgTEFqDjx8T7-6 zABtWfJr7rjl$P{BP2MAPjTOQv#vifh%r`{;=Oe8CQtHmSXSkN2N0ga_m@mmoKdv2V zC#Oek{GJ$h1*%f5+p+D+(>$c?Ro~aD`7*vjN)UyhGqzYLz2BH)zY4=a9gjH^Jq}1}m3lNQ*fpe&m&M*1;d6B^V1>lE z21av)zjOE1m z5qXCY|H2;dIzO-S^m?{iYH6oIGm8Csga)AoUnnzY7I( z(A!eZc&h{X?KuCb^|sNgMMLwWm2?`XK7C8(-J7ni&6?Zl_>FfI=8kV?SJaW z&2eR2r7>&kOCocQxqyz{JO{8=`Dlcgbg8q%~&^;!fL8x;?FZ2KXlx z+J-wW}aj2xuw6UnHvz@M3 zj@F$%9<}Srh;NvV<+iIMO2`n~-bRO%x>r|WEKdR5XgaoV05#%#2GMnZBo?XSC z0e;ry?ch!2( zb5lQSLSLTjazR}@UG2oHH2$La*QFoh^4hP+Zr`deeiNZ(83nm_1$7SUA4S^99igDi z_vw1~sq=@?gH-Mz)$(J%SX^Vwv0=`4#tbpy?6b?>rE6{(DU8J6yfQ!dU!(Q(0^Z^- zRzDmaH~7`N5wa)c8n&tGUG;wbJ2Uq@*X>-v%SbJ&Lv*>S{P!w*(_e~bIL}Kc?GlR& zrAb}ia2F7L>*BE;9jbkzRsA24sjR;z<98CtlW+A&wY(r!IZ>_*f2#Fhj@mZT?kO+A0fiUvi?WuOXEaZT$>Y z?^k7omU{ZJKucNP`W$PL*CWfHX^qUg!qt5aE=je<@$x3oX8Pmw#~-27wb3H?MjYBS zhnIg(-6ggZsy&c;+b%3avXi5?T(Cafjk3JVrn|*DZ-aHRtrpp*WwLFZO*%Al7SZ<2 z(a}Wx^6%TWq+EyYr~Z`NRfp!zgXKBFWd&9BJKD8h!Uj;DOT3&8O?Q=d^C(@_V%Z~y z`=yF6$Mp1Kf0&+bx#H42;LBGrrlM)p?OdVdvLcB~^` zn~v;o8P`B$^k+Z*nRH}tIqi2Qrwys!j4`QIs;q{+DeKm(?^o5WRd3pKF)xC|+=IP+ z7noe`yG@OH$z_hoCwg5^=Y9%M04hTO}_!nF1x#YK!n#P+>sS&Y-tX!_*+krx)qrJP9#`) zO=+Bx|5f=}C=J8tIn9p#bQGDS`xm9<=R}by9x#ll`-*r1W_DoqGm%q&I_$;*Jd5+t zsra9fQjC&%i2pfOp!8khtfv~!r>z`cm+4lI<`wl^5k@l09(v(EciOMoljZw27I!EN z(ah~E_N*zjob|OwiL~BlyJTF6M3%6f_#HdRYj?9z3Dk&};m2nj8ute$R)o~zuHe<*4UzL>#UWVs@Ra1M>h`YsG~YQc zi@TDtOx8i$^g3EKK398fS>BL)GC#xnzCiih|BTs|H}I~42+&q_J4zjW?0!wo)l91W z^VSUBnfTZt-gyhOedZ`IL=UV0%drHiY@pwVpaxL@=ip`8qpKS=^l72Wr1rqpF&>xC ztOd(xKgZ;!-dn%tur9ABSUxj;@1Y;Iz@L+Pi;Z5(Cg0FUBYO!BM-h+l-MrDO>v*4= zqPQP+UJYVHQe7gitbX^I^3q^BdrWc6-o{-By0&W?drPrRliPiOrB7~8DV9E+{iLL( zN$w>jHFzm8y?vybYwmLoskF8_Z?Mjeo+{LSD5EK@sp)b4-^AG>K6@DR!)U+2@vK!+ zl8+fiD6?oLPDJ<+nuk!m>Ij%|^Zxw{+vnh{WpjF45d@@Ai2(;OR&>J4q9 zaf(@K>iJ04oN*Q`>L^t!Z=YwlDL-)f)<6IL*tVN+H7_;o;%mDJ(}F`Q7PEa^L*A&3 ztD2^D-!NAQ_d)m#<o7-g@ifNnbZ1b*-g00W;}#M=5F4UMxnL1{G3mPIdRMK z%%}8JYhhIj>g6E!k@^TbKwPSnDJ_@mUh-eFu6y)@&t?^u5MG%@P^^V!5e&IPS3Ta^ zNKOr(Xn*c)0A>-ar_ocJ&dpken3{kyANK3Y3@7ueJZ0P*H+_o)uV>uPhhSle)3DNg99DKou zV=lxGI48Q3C8oIC>aygUutdX3U&7C#*yvviD@~4k01pgxg>&TN7Vh)j3qwm2NxVMz zmqWQ2TDnPY@O!ZiGcSgrr423JhGXOz;hWg=Vrc1*enO!b7j0;1Lrd?$XYf1b@Vjou znT5d<=zZMPS8~6F9Mt}tyw=5MV`%Am+RE4!>w25rHmQl#mss_!)MUPq+wL3DwV7Ft z&k;rT305MBg5_F-(fWpy_9HweCspcWXx=GevX*1RF0)@3@b>^SHgSWL^(qBuQ~UsX z4RKmA_S$m;&%{Eb=+7fO%~A}z98)R0YO-0IHP@`UU9Gtxs-e!RtKa!CN*nR9oAW{* zEjw3RY`sm{V=Cet3f!N?5X@zCt-ePMx;k%xOo$L=3?k(nY8e+qu?UOy%0d z;`J@3LD&OoqmKK)5X>Qs$fbs0R*H}sU94e3Ir=}Chh`m_QRqi9E8WIO&gEIRET@6; zW!+Kc8ISC>oCfXr-%4t9=U8v=IJ-d$f{yWv)4Vz(k?5===YmZ=_J~l&bP=;YP zOSG3@@tIkoEsI9X5oU>w>Ct>;mguT%7MCsqD)TK^77b<&slyc$

5+Lry1cXRYq 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 Date: Thu, 15 Jan 2026 17:48:22 -0500 Subject: [PATCH 06/72] Allow SPI2_HOST if no SPI3_HOST --- wled00/wled.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 10ff61e510..e7c9f5cc75 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1048,6 +1048,10 @@ bool WLED::initEthernet() } #endif + #if !defined(SPI3_HOST) + #define SPI3_HOST SPI2_HOST // at a minimum thgere's 2 SPI Hosts + #endif + if (es.eth_type == ETH_PHY_W5500) { managed_pin_type pinsToAllocate[6] = { { (int8_t)es.eth_miso_pin, false }, // MISO is input From 830861a67a8f4baf4b99e6b7a92f880313a335ac Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Mon, 19 Jan 2026 16:29:05 -0500 Subject: [PATCH 07/72] Adding a line to reconfigure interfaces just in case - and worst case just to print the new IP to the console. --- wled00/network.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/network.cpp b/wled00/network.cpp index ea7b7c83ce..b6949686f5 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -355,6 +355,7 @@ void WiFiEvent(WiFiEvent_t event) } else { DEBUG_PRINTLN(F("WiFi Connected. No ETH")); } + interfacesInited = false; break; case SYSTEM_EVENT_ETH_CONNECTED: { From 6ccb0577cf284adecc3493b0aac2d3fcf0629d18 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 15:26:33 -0500 Subject: [PATCH 08/72] First attempt, new libs --- platformio.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 2a5a707aa7..c159273efe 100644 --- a/platformio.ini +++ b/platformio.ini @@ -458,8 +458,8 @@ lib_depsV4 = ;; platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4. Warning: all kernel error asserts removed -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} +platform = espressif32@6.12.0 ;; ${esp32.platformTasmota} +platform_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; ${esp32.platform_packagesTasmota} build_unflags = ${common.build_unflags} build_flags = -g @@ -477,6 +477,7 @@ lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental ${env.lib_deps} + https://github.com/troyhacks/ETHClass2 board_build.partitions = ${esp32.default_partitions} ;; default partioning for 4MB Flash - can be overridden in build envs monitor_filters = esp32_exception_decoder board_build.f_flash = 80000000L From b745f8c05056d413bf597f893a302f8e72196c6d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 15:29:34 -0500 Subject: [PATCH 09/72] Moving ETHClass2 to top env. --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index c159273efe..b1726855b9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -262,6 +262,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e + https://github.com/troyhacks/ETHClass2 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following @@ -477,7 +478,6 @@ lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental ${env.lib_deps} - https://github.com/troyhacks/ETHClass2 board_build.partitions = ${esp32.default_partitions} ;; default partioning for 4MB Flash - can be overridden in build envs monitor_filters = esp32_exception_decoder board_build.f_flash = 80000000L From f4b2dd827751ef85263288b7d5009ba78d9a9214 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 15:39:39 -0500 Subject: [PATCH 10/72] More platform changes --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index b1726855b9..7d6b624c10 100644 --- a/platformio.ini +++ b/platformio.ini @@ -421,11 +421,11 @@ platformV4_pre = espressif32@5.2.0 platformV4_packages_pre = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 ;;; standard V4 platform -platformV4 = espressif32@ ~6.3.2 -platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) +platformV4 = espressif32@6.12.0 +platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;;; experimental: latest V4 platform with latest arduino-esp32 2.0.14 + ESP-IDF 4.4.6 (may or may not work) -platformV4_xp = espressif32@ ~6.5.0 +platformV4_xp = espressif32@6.12.0 platformV4_packages_xp = platformio/framework-arduinoespressif32 @ 3.20014.231204 ;; arduino-esp32 2.0.14 build_flagsV4 = -g From 25eaa8f06bc1770b740cb1f637218c29a83eab86 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 15:47:37 -0500 Subject: [PATCH 11/72] Fixes for ESP8266 --- wled00/wled.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wled00/wled.h b/wled00/wled.h index 0f862220b9..f0eaed6792 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -353,7 +353,9 @@ WLED_GLOBAL int8_t irPin _INIT(IRPIN); #endif //WLED_GLOBAL byte presetToApply _INIT(0); +#ifndef ESP8266 WLED_GLOBAL ETHClass2 ETH; +#endif WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server to use // WiFi CONFIG (all these can be changed via web UI, no need to set them here) From 28bd5125cb9b9afd1b6818a90b4f3ac4f5d8ebce Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 15:56:30 -0500 Subject: [PATCH 12/72] Let's try needing min 4.4.5 --- wled00/wled.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wled00/wled.h b/wled00/wled.h index f0eaed6792..159ed6f345 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -108,8 +108,11 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - // #include - #include "ETHClass2.h" + #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) + #include "ETHClass2.h" + #else + #include + #endif #include "esp_wifi.h" #include #include From 52c3eb9e15e520ca20eecb07256361ae6f3a0738 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:02:51 -0500 Subject: [PATCH 13/72] More guards for older IDF versions --- wled00/wled.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wled00/wled.h b/wled00/wled.h index 159ed6f345..e6ee7c2f0a 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -357,7 +357,9 @@ WLED_GLOBAL int8_t irPin _INIT(IRPIN); //WLED_GLOBAL byte presetToApply _INIT(0); #ifndef ESP8266 -WLED_GLOBAL ETHClass2 ETH; + #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) + WLED_GLOBAL ETHClass2 ETH; + #endif #endif WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server to use From 164614b44bc6181976ac3b75d80561e11d6e2ca2 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:10:02 -0500 Subject: [PATCH 14/72] More guards for old IDF versions --- wled00/wled.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled.h b/wled00/wled.h index e6ee7c2f0a..a5c8c88f92 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -108,7 +108,7 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) + #if defined(ESP_IDF_VERSION) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) #include "ETHClass2.h" #else #include From 42d2f1cd41baa12a418ebecdb84eeae68bb68ef4 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:16:50 -0500 Subject: [PATCH 15/72] Check for platform W5500 support --- wled00/src/dependencies/network/Network.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/wled00/src/dependencies/network/Network.h b/wled00/src/dependencies/network/Network.h index 570e0858ef..ac9ae24081 100644 --- a/wled00/src/dependencies/network/Network.h +++ b/wled00/src/dependencies/network/Network.h @@ -2,11 +2,16 @@ #include #else // ESP32 #include - // #include - #include "ETHClass2.h" - extern ETHClass2 ETH; + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) + #include "ETHClass2.h" + extern ETHClass2 ETH; + #else + #include + #endif #endif + + #ifndef Network_h #define Network_h From ff28c9ce817bdf5713e72d834c4199d835959006 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:25:09 -0500 Subject: [PATCH 16/72] Comfort for the elderly --- wled00/wled_ethernet.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index e0f886f144..1ed8d2981e 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -18,6 +18,10 @@ // ETH_CLOCK_GPIO16_OUT == ESP32 provides 50MHz clock output via GPIO16 // ETH_CLOCK_GPIO17_OUT == ESP32 provides 50MHz clock output via GPIO17 +#ifndef GPIO_NUM_NC + #define GPIO_NUM_NC -1 +#endif + #ifdef CONFIG_ETH_PHY_INTERFACE_RMII typedef struct EthernetSettings { uint8_t eth_address; From 199d505880c60a176ce670a16f28a2f84819a7a6 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:39:11 -0500 Subject: [PATCH 17/72] Comfort anything without ETH_PHY_W5500 defined --- wled00/wled_ethernet.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 1ed8d2981e..0ec98fcab9 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -22,6 +22,10 @@ #define GPIO_NUM_NC -1 #endif +#ifndef ETH_PHY_W5500 + #define ETH_PHY_W5500 69 +#endif + #ifdef CONFIG_ETH_PHY_INTERFACE_RMII typedef struct EthernetSettings { uint8_t eth_address; From 84da8cbbc7e2faeb406ffb263f23a0a340477708 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:46:34 -0500 Subject: [PATCH 18/72] Retest --- wled00/wled_ethernet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 0ec98fcab9..431f60a1f3 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -23,7 +23,7 @@ #endif #ifndef ETH_PHY_W5500 - #define ETH_PHY_W5500 69 + #define ETH_PHY_W5500 1 #endif #ifdef CONFIG_ETH_PHY_INTERFACE_RMII From 6079b4814127c581d8a921b26b63ead056d69e32 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:51:47 -0500 Subject: [PATCH 19/72] Try this again --- wled00/wled_ethernet.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 431f60a1f3..58eb6ad4a9 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -42,12 +42,12 @@ typedef struct EthernetSettings { eth_clock_mode_t eth_clk_mode; } ethernet_settings; #else -#define ETH_PHY_LAN8720 1 -#define ETH_CLOCK_GPIO0_IN 2 -#define ETH_CLOCK_GPIO0_OUT 3 -#define ETH_CLOCK_GPIO17_OUT 4 -#define ETH_CLOCK_GPIO16_OUT 5 -#define ETH_PHY_IP101 6 +#define ETH_PHY_LAN8720 0 +#define ETH_CLOCK_GPIO0_IN 0 +#define ETH_CLOCK_GPIO0_OUT 1 +#define ETH_CLOCK_GPIO17_OUT 3 +#define ETH_CLOCK_GPIO16_OUT 2 +#define ETH_PHY_IP101 1 typedef struct EthernetSettings { uint8_t eth_address; From ac1a4cafc07065fa7129bec2de7c22408b7f7b9e Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:52:47 -0500 Subject: [PATCH 20/72] Changing of the guard --- wled00/wled.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled.h b/wled00/wled.h index a5c8c88f92..a6afcdbc34 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -108,7 +108,7 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - #if defined(ESP_IDF_VERSION) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) #include "ETHClass2.h" #else #include From e11e1f3e83c6c7024be31fd32cf8383da554b72f Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:00:41 -0500 Subject: [PATCH 21/72] Ignore ETHClass2 where not supported --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index 7d6b624c10..af9e07072a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -326,6 +326,7 @@ lib_deps = ${esp8266.lib8266_deps} ;; use proven library versions for 8266 lib_ignore = NeoESP32RmtHI + ETHClass2 ;; compatibilty flags - same as 0.14.0 which seems to work better on some 8266 boards. Not using PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48 build_flags_compat = @@ -690,6 +691,7 @@ build_flags = ${common.build_flags} ${esp32_legacy.build_flags} -D WLED_RELEAS ;;-D WLED_ENABLE_FULL_FONTS ;; 10KB flash lib_deps = ${esp32_legacy.lib_deps} ${esp32.AR_lib_deps} +lib_ignore = ETHClass2 board_build.partitions = ${esp32_legacy.default_partitions} monitor_filters = esp32_exception_decoder ;; RAM: [== ] 23.2% (used 75944 bytes from 327680 bytes) From 6091344b99316fc2650245bc874bd56b1f518f4f Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:21:10 -0500 Subject: [PATCH 22/72] More comforts --- wled00/wled_ethernet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 58eb6ad4a9..6f2738eff5 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -23,7 +23,7 @@ #endif #ifndef ETH_PHY_W5500 - #define ETH_PHY_W5500 1 + #define ETH_PHY_W5500 ETH_PHY_MAX #endif #ifdef CONFIG_ETH_PHY_INTERFACE_RMII From 7db76e020c2fad8ead059032aed3efe4f72ce92d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:37:31 -0500 Subject: [PATCH 23/72] Put back in the original code for IDFv3 --- wled00/wled.cpp | 122 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 33 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index e7c9f5cc75..06a05b84b0 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1048,35 +1048,94 @@ bool WLED::initEthernet() } #endif - #if !defined(SPI3_HOST) - #define SPI3_HOST SPI2_HOST // at a minimum thgere's 2 SPI Hosts - #endif - - if (es.eth_type == ETH_PHY_W5500) { - managed_pin_type pinsToAllocate[6] = { - { (int8_t)es.eth_miso_pin, false }, // MISO is input - { (int8_t)es.eth_mosi_pin, true }, // MOSI is output - { (int8_t)es.eth_cs_pin, true }, // CS is output - { (int8_t)es.eth_rst_pin, true }, // RST is output - { (int8_t)es.eth_int_pin, false }, // INT is input - { (int8_t)es.eth_sclk_pin, true }, // SCLK is output - }; - if (!pinManager.allocateMultiplePins(pinsToAllocate, 6, PinOwner::Ethernet)) { - DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); - return false; - } - if (!ETH.begin(ETH_PHY_W5500, es.eth_address, es.eth_cs_pin, es.eth_int_pin, es.eth_rst_pin, SPI3_HOST, es.eth_sclk_pin, es.eth_miso_pin, es.eth_mosi_pin)) { - DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); - // de-allocate the allocated pins - for (managed_pin_type mpt : pinsToAllocate) { - pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + #if !defined(SPI3_HOST) + #define SPI3_HOST SPI2_HOST // at a minimum there are 2 SPI Hosts + #endif + if (es.eth_type == ETH_PHY_W5500) { + managed_pin_type pinsToAllocate[6] = { + { (int8_t)es.eth_miso_pin, false }, // MISO is input + { (int8_t)es.eth_mosi_pin, true }, // MOSI is output + { (int8_t)es.eth_cs_pin, true }, // CS is output + { (int8_t)es.eth_rst_pin, true }, // RST is output + { (int8_t)es.eth_int_pin, false }, // INT is input + { (int8_t)es.eth_sclk_pin, true }, // SCLK is output + }; + if (!pinManager.allocateMultiplePins(pinsToAllocate, 6, PinOwner::Ethernet)) { + DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); + return false; + } + if (!ETH.begin(ETH_PHY_W5500, es.eth_address, es.eth_cs_pin, es.eth_int_pin, es.eth_rst_pin, SPI3_HOST, es.eth_sclk_pin, es.eth_miso_pin, es.eth_mosi_pin)) { + DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); + // de-allocate the allocated pins + for (managed_pin_type mpt : pinsToAllocate) { + pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + } + return false; + } else { + Serial.println("ETH initialized W5500!"); } - return false; } else { - Serial.println("ETH initialized W5500!"); + #ifdef CONFIG_ETH_PHY_INTERFACE_RMII + managed_pin_type pinsToAllocate[10] = { + // first six pins are non-configurable + esp32_nonconfigurable_ethernet_pins[0], + esp32_nonconfigurable_ethernet_pins[1], + esp32_nonconfigurable_ethernet_pins[2], + esp32_nonconfigurable_ethernet_pins[3], + esp32_nonconfigurable_ethernet_pins[4], + esp32_nonconfigurable_ethernet_pins[5], + { (int8_t)es.eth_mdc, true }, // [6] = MDC is output and mandatory + { (int8_t)es.eth_mdio, true }, // [7] = MDIO is bidirectional and mandatory + { (int8_t)es.eth_power, true }, // [8] = optional pin, not all boards use + { ((int8_t)0xFE), false }, // [9] = replaced with eth_clk_mode, mandatory + }; + // update the clock pin.... + if (es.eth_clk_mode == ETH_CLOCK_GPIO0_IN) { + pinsToAllocate[9].pin = 0; + pinsToAllocate[9].isOutput = false; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO0_OUT) { + pinsToAllocate[9].pin = 0; + pinsToAllocate[9].isOutput = true; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO16_OUT) { + pinsToAllocate[9].pin = 16; + pinsToAllocate[9].isOutput = true; + } else if (es.eth_clk_mode == ETH_CLOCK_GPIO17_OUT) { + pinsToAllocate[9].pin = 17; + pinsToAllocate[9].isOutput = true; + } else { + DEBUG_PRINT(F("initE: Failing due to invalid eth_clk_mode (")); + DEBUG_PRINT(es.eth_clk_mode); + DEBUG_PRINTLN(")"); + return false; + } + if (!pinManager.allocateMultiplePins(pinsToAllocate, 10, PinOwner::Ethernet)) { + DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); + return false; + } + + if (!ETH.begin( + (eth_phy_type_t)es.eth_type, + (uint8_t)es.eth_address, + (int)es.eth_mdc, + (int)es.eth_mdio, + (int)es.eth_power, + (eth_clock_mode_t)es.eth_clk_mode + )) { + DEBUG_PRINTLN(F("initC: ETH.begin() failed")); + // de-allocate the allocated pins + for (managed_pin_type mpt : pinsToAllocate) { + pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + } + return false; + } + #else + return false; + #endif } - } else { - #ifdef CONFIG_ETH_PHY_INTERFACE_RMII + #else + // Ethernet initialization should only succeed once -- else reboot required + ethernet_settings es = ethernetBoards[ethernetType]; managed_pin_type pinsToAllocate[10] = { // first six pins are non-configurable esp32_nonconfigurable_ethernet_pins[0], @@ -1109,17 +1168,18 @@ bool WLED::initEthernet() DEBUG_PRINTLN(")"); return false; } + if (!pinManager.allocateMultiplePins(pinsToAllocate, 10, PinOwner::Ethernet)) { DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); return false; } if (!ETH.begin( - (eth_phy_type_t)es.eth_type, (uint8_t)es.eth_address, + (int)es.eth_power, (int)es.eth_mdc, (int)es.eth_mdio, - (int)es.eth_power, + (eth_phy_type_t)es.eth_type, (eth_clock_mode_t)es.eth_clk_mode )) { DEBUG_PRINTLN(F("initC: ETH.begin() failed")); @@ -1129,11 +1189,7 @@ bool WLED::initEthernet() } return false; } - #else - return false; - #endif - } - + #endif successfullyConfiguredEthernet = true; USER_PRINTLN(F("initC: *** Ethernet successfully configured! ***")); // WLEDMM return true; From f698f06393d84dd77c2e8188fd3911a5afe6783d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:41:25 -0500 Subject: [PATCH 24/72] Duped definition --- wled00/wled.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 06a05b84b0..69aa48d8d2 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1135,7 +1135,6 @@ bool WLED::initEthernet() } #else // Ethernet initialization should only succeed once -- else reboot required - ethernet_settings es = ethernetBoards[ethernetType]; managed_pin_type pinsToAllocate[10] = { // first six pins are non-configurable esp32_nonconfigurable_ethernet_pins[0], From e0c8b47dc13f3385bc1217b1369821ff5c7c552c Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:47:53 -0500 Subject: [PATCH 25/72] Ignore ETHClass2 on esp32_4MB_M_eth --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index af9e07072a..3219dd4f86 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1483,6 +1483,7 @@ build_flags = ${esp32_4MB_M_base.build_flags} -D WLED_DISABLE_INFRARED ;; Over the limit -D WLED_DISABLE_PARTICLESYSTEM1D ;; exceeds flash size limit -D WLED_DISABLE_PARTICLESYSTEM2D ;; exceeds flash size limit +lib_ignore = ETHClass2 ; RAM: [== ] 24.1% (used 78904 bytes from 327680 bytes) ; Flash: [==========] 98.5% (used 1548489 bytes from 1572864 bytes From 7cd1b2f1492ff7bf3fc283a016cffbc6531b3be5 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:51:28 -0500 Subject: [PATCH 26/72] Try making one Tasmota that was oversized. --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index 3219dd4f86..1664c1c943 100644 --- a/platformio.ini +++ b/platformio.ini @@ -2722,6 +2722,8 @@ monitor_filters = esp32_exception_decoder [env:esp32s2_PSRAM_S] extends = env:esp32s2_PSRAM_M +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} board_build.partitions = ${esp32.default_partitions} ;; 1.55MB firmware, 1MB filesystem build_unflags = ${env:esp32s2_PSRAM_M.build_unflags} -DWLED_DISABLE_ADALIGHT From a430386481a01222e276faf093bd96a795631e9a Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:56:04 -0500 Subject: [PATCH 27/72] Try that again but ignore the lib too --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 1664c1c943..8f83bcf561 100644 --- a/platformio.ini +++ b/platformio.ini @@ -2737,6 +2737,7 @@ build_flags = ${env:esp32s2_PSRAM_M.build_flags} -D WLED_RELEASE_NAME=esp32s2_4MB_S lib_deps = ${env:esp32s2_PSRAM_M.lib_deps} lib_ignore = ${env:esp32s2_PSRAM_M.lib_ignore} + EthClass2 U8g2 ${common_mm.animartrix_lib_ignore} ; RAM: [== ] 18.1% (used 59176 bytes from 327680 bytes) From cfcd2ddf5b3468d52c83f3e3f0893a8eefaf7828 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:02:05 -0500 Subject: [PATCH 28/72] Ignore the right lib this time. Case matters. --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 8f83bcf561..5d21c95b40 100644 --- a/platformio.ini +++ b/platformio.ini @@ -2737,7 +2737,7 @@ build_flags = ${env:esp32s2_PSRAM_M.build_flags} -D WLED_RELEASE_NAME=esp32s2_4MB_S lib_deps = ${env:esp32s2_PSRAM_M.lib_deps} lib_ignore = ${env:esp32s2_PSRAM_M.lib_ignore} - EthClass2 + ETHClass2 U8g2 ${common_mm.animartrix_lib_ignore} ; RAM: [== ] 18.1% (used 59176 bytes from 327680 bytes) From b1f44d46287d7e916e95c445074d2ca29a60b1b9 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 18:57:20 -0500 Subject: [PATCH 29/72] Moved some back to Tasmota and ignored ETHClass2 --- platformio.ini | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/platformio.ini b/platformio.ini index 5d21c95b40..80f5ce5eaa 100644 --- a/platformio.ini +++ b/platformio.ini @@ -691,7 +691,8 @@ build_flags = ${common.build_flags} ${esp32_legacy.build_flags} -D WLED_RELEAS ;;-D WLED_ENABLE_FULL_FONTS ;; 10KB flash lib_deps = ${esp32_legacy.lib_deps} ${esp32.AR_lib_deps} -lib_ignore = ETHClass2 +lib_ignore = ${esp32_legacy.lib_ignore} + ETHClass2 board_build.partitions = ${esp32_legacy.default_partitions} monitor_filters = esp32_exception_decoder ;; RAM: [== ] 23.2% (used 75944 bytes from 327680 bytes) @@ -1483,7 +1484,8 @@ build_flags = ${esp32_4MB_M_base.build_flags} -D WLED_DISABLE_INFRARED ;; Over the limit -D WLED_DISABLE_PARTICLESYSTEM1D ;; exceeds flash size limit -D WLED_DISABLE_PARTICLESYSTEM2D ;; exceeds flash size limit -lib_ignore = ETHClass2 +lib_ignore = ${esp32_4MB_M_base.lib_ignore} + ETHClass2 ; RAM: [== ] 24.1% (used 78904 bytes from 327680 bytes) ; Flash: [==========] 98.5% (used 1548489 bytes from 1572864 bytes @@ -2551,8 +2553,8 @@ lib_ignore = ;; MM for esp32-s3 zero/supermini and lolin S3 mini boards - standard [env:esp32S3_4MB_PSRAM_M] extends = env:esp32S3_8MB_M -platform = ${esp32s3.platform} -platform_packages = ${esp32s3.platform_packages} +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} board = lolin_s3_mini ;; -S3 mini: 4MB flash 2MB PSRAM board_build.partitions = ${esp32.extended_partitions} ;; 1.65MB firmware, 700KB filesystem build_unflags = ${common.build_unflags} @@ -2591,6 +2593,7 @@ lib_ignore = ;; IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation ${common_mm.HUB75_lib_ignore} ${common_mm.DMXin_lib_ignore} + ETHClass2 ;; ${common_mm.animartrix_lib_ignore} ; RAM: [== ] 16.7% (used 54676 bytes from 327680 bytes) ; Flash: [======== ] 83.2% (used 1416997 bytes from 1703936 bytes) @@ -2665,8 +2668,8 @@ monitor_filters = esp32_exception_decoder [env:esp32s2_PSRAM_M] extends = esp32_4MB_V4_M_base ;; default tasmota platform -platform = ${esp32s2.platform} -platform_packages = ${esp32s2.platform_packages} +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} ;; standard espressif platform (optional) ;; platform = ${esp32.platformV4} ;; platform_packages = ${esp32.platformV4_packages} @@ -2714,6 +2717,7 @@ lib_deps = ${esp32s2.lib_deps} ${common_mm.lib_deps_S} ${common_mm.lib_deps_V4_M lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation OneWire ; not needed as we don't include USERMOD_DALLASTEMPERATURE + ETHClass2 ${common_mm.HUB75_lib_ignore} ${common_mm.DMXin_lib_ignore} monitor_filters = esp32_exception_decoder @@ -2828,6 +2832,8 @@ build_flags = ${env:esp32c3dev_4MB_M.build_flags} [env:esp32c3dev_2MB_M] extends = env:esp32c3dev_4MB_M +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} board = lolin_c3_mini ;;; replace WLED_RELEASE_NAME, disable CDC_ON_BOOT build_unflags = ${env:esp32c3dev_4MB_M.build_unflags} @@ -2840,7 +2846,8 @@ board_build.partitions = tools/WLED_ESP32_2MB_noOTA.csv board_build.flash_mode = dio board_upload.flash_size = 2MB board_upload.maximum_size = 2097152 - +lib_ignore = ${env:esp32c3dev_4MB_M.lib_ignore} + ETHClass2 build_flags = ${env:esp32c3dev_4MB_M.build_flags} -D WLED_WATCHDOG_TIMEOUT=0 -D WLED_DISABLE_OTA @@ -3080,8 +3087,8 @@ lib_ignore = ${esp32_4MB_M_base.lib_ignore} ;; "V4" build environment (tasmota core) [env:athom_music_esp32_4MB_V4_M] extends = esp32_4MB_V4_M_base -platform = ${esp32.platform} ;; "V4" tasmota -platform_packages = ${esp32.platform_packages} +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} build_unflags = ${esp32_4MB_V4_M_base.build_unflags} ;; ${common_mm.build_disable_sync_interfaces} ${common_mm.animartrix_build_flags} ;; exceeds flash limits, no pins for HUB75 ; -D USERMOD_ARTIFX ;; disabled to save some program space in flash @@ -3115,6 +3122,7 @@ build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} lib_deps = ${esp32_4MB_V4_M_base.esp32_lib_deps} lib_ignore = ${common_mm.DMXin_lib_ignore} + ETHClass2 ; RAM: [== ] 24.0% (used 78568 bytes from 327680 bytes) ; Flash: [======== ] 82.3% (used 1402341 bytes from 1703936 bytes) From 4917c133666f01de9f7bb3d29e3e3342eca21ca1 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 19:04:14 -0500 Subject: [PATCH 30/72] Missed one. --- platformio.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 80f5ce5eaa..0e84e01367 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1862,8 +1862,8 @@ extends = env:esp32_4MB_V4_S_HUB75 [env:esp32_4MB_V4_M] extends = esp32_4MB_V4_M_base ;; needs tasmota framework; will exceed flash limits with default framework -platform = ${esp32.platform} ;; "V4" tasmota -platform_packages = ${esp32.platform_packages} +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} -D WLED_RELEASE_NAME=esp32_4MB_V4_M -D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET @@ -1875,6 +1875,7 @@ build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} lib_deps = ${esp32_4MB_V4_M_base.esp32_lib_deps} lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation + ETHClass2 ${common_mm.HUB75_lib_ignore} ;; over the flash size limit ;;${common_mm.animartrix_lib_ignore} build_unflags = ${esp32_4MB_V4_M_base.build_unflags} From 83bff2dff005fea32529cbad3021c05122874cf0 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 19:11:22 -0500 Subject: [PATCH 31/72] Pinning ETHClass2 to a commit to make the rabbit shut up. --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 0e84e01367..d7a7cab603 100644 --- a/platformio.ini +++ b/platformio.ini @@ -262,7 +262,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2 + https://github.com/troyhacks/ETHClass2.git#3744ef20fdaa8d8c15597701fc3b5267757bee90 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following From a540b9675d8d5549f36608991ca7af1d91338274 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 20:04:57 -0500 Subject: [PATCH 32/72] This is not in the right place. What place should it be in? I dunno! --- wled00/wled_ethernet.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 6f2738eff5..73f376f14a 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -22,9 +22,9 @@ #define GPIO_NUM_NC -1 #endif -#ifndef ETH_PHY_W5500 - #define ETH_PHY_W5500 ETH_PHY_MAX -#endif +// #ifndef ETH_PHY_W5500 +// #define ETH_PHY_W5500 ETH_PHY_MAX +// #endif #ifdef CONFIG_ETH_PHY_INTERFACE_RMII typedef struct EthernetSettings { From 33feac91fc8b612e6888875097a40524fb836e56 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 20:18:04 -0500 Subject: [PATCH 33/72] Testing this one --- wled00/network.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wled00/network.cpp b/wled00/network.cpp index b6949686f5..b3590ff08e 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -23,6 +23,10 @@ const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_CO const managed_pin_type esp32_nonconfigurable_ethernet_pins[] = {}; #endif +#ifndef CONFIG_ETH_SPI_ETHERNET_W5500 + #define ETH_PHY_W5500 ETH_PHY_MAX +#endif + const ethernet_settings ethernetBoards[] = { // None { From 84b35afd7ec31e30eed4a532b48aacdb38e6d4fd Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 20:33:04 -0500 Subject: [PATCH 34/72] Tidy --- wled00/wled_ethernet.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 73f376f14a..0caee6a031 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -22,10 +22,6 @@ #define GPIO_NUM_NC -1 #endif -// #ifndef ETH_PHY_W5500 -// #define ETH_PHY_W5500 ETH_PHY_MAX -// #endif - #ifdef CONFIG_ETH_PHY_INTERFACE_RMII typedef struct EthernetSettings { uint8_t eth_address; From 286d95e7a8a6636c65fdadca456951a4720b4722 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 22:07:12 -0500 Subject: [PATCH 35/72] Added WaveShare_ESP32-S3-ETH --- platformio.ini | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/platformio.ini b/platformio.ini index d7a7cab603..efef6f7ff2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,6 +115,7 @@ default_envs = abc_wled_controller_v43_V4_S athom_music_esp32_4MB_V4_M adafruit_matrixportal_esp32s3 ;; HUB75 supported, uses standard bootloader + WaveShare_ESP32-S3-ETH ;; Easiest ESP32-S3 with W5500 Ethernet and USB-C for programming ; adafruit_matrixportal_esp32s3_tinyUF2 ;; supports the adafruit "tinyUF2" bootloader ; Go to MoonModules environments for environments @@ -3325,3 +3326,12 @@ build_flags = ${env:adafruit_matrixportal_esp32s3_wled.build_flags} [env:adafruit_matrixportal_esp32s3] ;; this buildenv is just an alias for the matrixportal UF2 build, to keep 3rd party build tools happy. extends = env:adafruit_matrixportal_esp32s3_wled + +[env:WaveShare_ESP32-S3-ETH] +;; This is the easiest-to-use W5500 board as it has USB-C for programming +extends = env:esp32S3_16MB_PSRAM_M_HUB75 +build_unflags = -D LEDPIN -D BTNPIN -D RLYPIN -D I2S_SDPIN -D I2S_CKPIN -D I2S_WSPIN -D ARDUINO_TTGO_T7_S3 +build_flags = ${env:esp32S3_16MB_PSRAM_M_HUB75.build_flags} + -D WLED_USE_ETHERNET + -D WLED_ETH_DEFAULT=16 + -D LEDPIN=-1 -D BTNPIN=-1 -D RLYPIN=-1 -D I2S_SDPIN=-1 -D I2S_CKPIN=-1 -D I2S_WSPIN=-1 From a4d082223ae5a946743f550bae0a8af82e06e25d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 22:08:07 -0500 Subject: [PATCH 36/72] Fixing places that deal with pins, like reserved pins and saviing pins to cfg.json --- wled00/cfg.cpp | 38 +++++++++++++++++++++++--------------- wled00/wled_ethernet.h | 2 +- wled00/xml.cpp | 40 ++++++++++++++++++++++++---------------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 069b303aa0..c87a95eda2 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -746,21 +746,29 @@ void serializeConfig() { ethernet["type"] = ethernetType; if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { JsonArray pins = ethernet.createNestedArray("pin"); - for (uint8_t p=0; p=0) pins.add(ethernetBoards[ethernetType].eth_power); - if (ethernetBoards[ethernetType].eth_mdc>=0) pins.add(ethernetBoards[ethernetType].eth_mdc); - if (ethernetBoards[ethernetType].eth_mdio>=0) pins.add(ethernetBoards[ethernetType].eth_mdio); - switch (ethernetBoards[ethernetType].eth_clk_mode) { - case ETH_CLOCK_GPIO0_IN: - case ETH_CLOCK_GPIO0_OUT: - pins.add(0); - break; - case ETH_CLOCK_GPIO16_OUT: - pins.add(16); - break; - case ETH_CLOCK_GPIO17_OUT: - pins.add(17); - break; + for (uint8_t p = 0; p < WLED_ETH_RSVD_PINS_COUNT; p++) pins.add(esp32_nonconfigurable_ethernet_pins[p].pin); + if (ethernetBoards[ethernetType].eth_power >= 0) pins.add(ethernetBoards[ethernetType].eth_power); + if (ethernetBoards[ethernetType].eth_mdc >= 0) pins.add(ethernetBoards[ethernetType].eth_mdc); + if (ethernetBoards[ethernetType].eth_mdio >= 0) pins.add(ethernetBoards[ethernetType].eth_mdio); + if (ethernetBoards[ethernetType].eth_miso_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_miso_pin); + if (ethernetBoards[ethernetType].eth_mosi_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_mosi_pin); + if (ethernetBoards[ethernetType].eth_cs_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_cs_pin); + if (ethernetBoards[ethernetType].eth_rst_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_rst_pin); + if (ethernetBoards[ethernetType].eth_int_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_int_pin); + if (ethernetBoards[ethernetType].eth_sclk_pin >= 0) pins.add(ethernetBoards[ethernetType].eth_sclk_pin); + if (ethernetBoards[ethernetType].eth_type != ETH_PHY_W5500) { + switch (ethernetBoards[ethernetType].eth_clk_mode) { + case ETH_CLOCK_GPIO0_IN: + case ETH_CLOCK_GPIO0_OUT: + pins.add(0); + break; + case ETH_CLOCK_GPIO16_OUT: + pins.add(16); + break; + case ETH_CLOCK_GPIO17_OUT: + pins.add(17); + break; + } } } #endif diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 0caee6a031..cde28a26a9 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -63,7 +63,7 @@ typedef struct EthernetSettings { extern const ethernet_settings ethernetBoards[]; -#define WLED_ETH_RSVD_PINS_COUNT 6 +#define WLED_ETH_RSVD_PINS_COUNT 0 extern const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; #endif diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 71f3340f93..e3d886e84b 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -240,22 +240,30 @@ void appendGPIOinfo() { #endif #ifdef WLED_USE_ETHERNET - if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { - for (uint8_t p=0; p=0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_power,nS,10)); } - if (ethernetBoards[ethernetType].eth_mdc>=0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_mdc,nS,10)); } - if (ethernetBoards[ethernetType].eth_mdio>=0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_mdio,nS,10)); } - switch (ethernetBoards[ethernetType].eth_clk_mode) { - case ETH_CLOCK_GPIO0_IN: - case ETH_CLOCK_GPIO0_OUT: - oappend(SET_F(",0")); - break; - case ETH_CLOCK_GPIO16_OUT: - oappend(SET_F(",16")); - break; - case ETH_CLOCK_GPIO17_OUT: - oappend(SET_F(",17")); - break; + if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { + for (uint8_t p = 0; p < WLED_ETH_RSVD_PINS_COUNT; p++) { oappend(","); oappend(itoa(esp32_nonconfigurable_ethernet_pins[p].pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_power >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_power, nS, 10)); } + if (ethernetBoards[ethernetType].eth_mdc >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_mdc, nS, 10)); } + if (ethernetBoards[ethernetType].eth_mdio >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_mdio, nS, 10)); } + if (ethernetBoards[ethernetType].eth_miso_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_miso_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_mosi_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_mosi_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_cs_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_cs_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_rst_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_rst_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_int_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_int_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_sclk_pin >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_sclk_pin, nS, 10)); } + if (ethernetBoards[ethernetType].eth_type != ETH_PHY_W5500) { + switch (ethernetBoards[ethernetType].eth_clk_mode) { + case ETH_CLOCK_GPIO0_IN: + case ETH_CLOCK_GPIO0_OUT: + oappend(SET_F(",0")); + break; + case ETH_CLOCK_GPIO16_OUT: + oappend(SET_F(",16")); + break; + case ETH_CLOCK_GPIO17_OUT: + oappend(SET_F(",17")); + break; + } } } #endif From 68e1790e959c24acd29b2ced8a06587e5f34430b Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 22:18:19 -0500 Subject: [PATCH 37/72] Build fixes --- wled00/cfg.cpp | 5 +++++ wled00/network.cpp | 2 +- wled00/xml.cpp | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index c87a95eda2..d88eab0989 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -742,6 +742,11 @@ void serializeConfig() { wifi[F("phy")] = force802_3g; #ifdef WLED_USE_ETHERNET + + #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 + #define ETH_PHY_W5500 ETH_PHY_MAX + #endif + JsonObject ethernet = doc.createNestedObject("eth"); ethernet["type"] = ethernetType; if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { diff --git a/wled00/network.cpp b/wled00/network.cpp index b3590ff08e..f6ab07dc18 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -20,7 +20,7 @@ const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_CO { 27, true }, // RMII EMAC CRS_DV == Carrier Sense and RX Data Valid }; #else -const managed_pin_type esp32_nonconfigurable_ethernet_pins[] = {}; +const managed_pin_type esp32_nonconfigurable_ethernet_pins[]; #endif #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 diff --git a/wled00/xml.cpp b/wled00/xml.cpp index e3d886e84b..3a6267a3f4 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -240,6 +240,11 @@ void appendGPIOinfo() { #endif #ifdef WLED_USE_ETHERNET + + #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 + #define ETH_PHY_W5500 ETH_PHY_MAX + #endif + if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { for (uint8_t p = 0; p < WLED_ETH_RSVD_PINS_COUNT; p++) { oappend(","); oappend(itoa(esp32_nonconfigurable_ethernet_pins[p].pin, nS, 10)); } if (ethernetBoards[ethernetType].eth_power >= 0) { oappend(","); oappend(itoa(ethernetBoards[ethernetType].eth_power, nS, 10)); } From 41512dd077c5785248d53499a7ddc6269dac5903 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:16:24 -0500 Subject: [PATCH 38/72] Fix esp32_nonconfigurable_ethernet_pins --- wled00/network.cpp | 2 +- wled00/wled_ethernet.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index f6ab07dc18..35f65846dd 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -20,7 +20,7 @@ const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_CO { 27, true }, // RMII EMAC CRS_DV == Carrier Sense and RX Data Valid }; #else -const managed_pin_type esp32_nonconfigurable_ethernet_pins[]; +managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; #endif #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index cde28a26a9..54e5bc6e85 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -64,7 +64,7 @@ typedef struct EthernetSettings { extern const ethernet_settings ethernetBoards[]; #define WLED_ETH_RSVD_PINS_COUNT 0 -extern const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; #endif #endif \ No newline at end of file From 43fe29daeebf43ba6fda33c68b62437a55b08bf7 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:23:26 -0500 Subject: [PATCH 39/72] managed_pin_type fixes --- wled00/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index 35f65846dd..f1422b634d 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -11,7 +11,7 @@ // See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-ethernet-kit-v1.1.html#ip101gri-phy-interface #ifdef CONFIG_ETH_PHY_INTERFACE_RMII -const managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT] = { +managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT] = { { 21, true }, // RMII EMAC TX EN == When high, clocks the data on TXD0 and TXD1 to transmitter { 19, true }, // RMII EMAC TXD0 == First bit of transmitted data { 22, true }, // RMII EMAC TXD1 == Second bit of transmitted data From 214be9a22ea63f6f78af71d600cac2019ae49ccc Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:32:28 -0500 Subject: [PATCH 40/72] Juggling initializers --- wled00/wled_ethernet.h | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 54e5bc6e85..b83caf1d9e 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -23,6 +23,7 @@ #endif #ifdef CONFIG_ETH_PHY_INTERFACE_RMII +#define WLED_ETH_RSVD_PINS_COUNT 6 typedef struct EthernetSettings { uint8_t eth_address; int eth_power; From 32a0c7b255f27de82b91c3f49bfb6e19fb01c124 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:47:55 -0500 Subject: [PATCH 41/72] Testing intializers --- wled00/network.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index f1422b634d..e20c536503 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -11,7 +11,7 @@ // See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-ethernet-kit-v1.1.html#ip101gri-phy-interface #ifdef CONFIG_ETH_PHY_INTERFACE_RMII -managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT] = { +managed_pin_type esp32_nonconfigurable_ethernet_pins[6] = { { 21, true }, // RMII EMAC TX EN == When high, clocks the data on TXD0 and TXD1 to transmitter { 19, true }, // RMII EMAC TXD0 == First bit of transmitted data { 22, true }, // RMII EMAC TXD1 == Second bit of transmitted data @@ -20,7 +20,7 @@ managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT] = { 27, true }, // RMII EMAC CRS_DV == Carrier Sense and RX Data Valid }; #else -managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; +managed_pin_type esp32_nonconfigurable_ethernet_pins;; #endif #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 From f67613439f2eacfa07f0cf331f546a69309b3ec1 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:55:39 -0500 Subject: [PATCH 42/72] Another initializer --- wled00/wled_ethernet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index b83caf1d9e..23735816c7 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -65,7 +65,7 @@ typedef struct EthernetSettings { extern const ethernet_settings ethernetBoards[]; #define WLED_ETH_RSVD_PINS_COUNT 0 -extern managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; +extern managed_pin_type esp32_nonconfigurable_ethernet_pins; #endif #endif \ No newline at end of file From 10d70c7a45f4cdaa7b59ed57c38fb8b6cc266df8 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:58:59 -0500 Subject: [PATCH 43/72] Initializers --- wled00/network.cpp | 2 -- wled00/wled_ethernet.h | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index e20c536503..effaf1eb99 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -19,8 +19,6 @@ managed_pin_type esp32_nonconfigurable_ethernet_pins[6] = { { 26, false }, // RMII EMAC RXD1 == Second bit of received data { 27, true }, // RMII EMAC CRS_DV == Carrier Sense and RX Data Valid }; -#else -managed_pin_type esp32_nonconfigurable_ethernet_pins;; #endif #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 23735816c7..7c37cf6d9f 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -65,7 +65,7 @@ typedef struct EthernetSettings { extern const ethernet_settings ethernetBoards[]; #define WLED_ETH_RSVD_PINS_COUNT 0 -extern managed_pin_type esp32_nonconfigurable_ethernet_pins; +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[]; #endif #endif \ No newline at end of file From 9772e364c2a6d70f227f8dffedaeb5429271b338 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:22:09 -0500 Subject: [PATCH 44/72] Hopefully this is it. --- wled00/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index effaf1eb99..ae37147beb 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -10,7 +10,7 @@ // can they be re-assigned through IOMUX / GPIO matrix. // See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-ethernet-kit-v1.1.html#ip101gri-phy-interface -#ifdef CONFIG_ETH_PHY_INTERFACE_RMII +#if defined(CONFIG_ETH_PHY_INTERFACE_RMII) || (defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR == 3) managed_pin_type esp32_nonconfigurable_ethernet_pins[6] = { { 21, true }, // RMII EMAC TX EN == When high, clocks the data on TXD0 and TXD1 to transmitter { 19, true }, // RMII EMAC TXD0 == First bit of transmitted data From d7564ca23e5a9d8abf19c5f976cb69ba11d83626 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Wed, 21 Jan 2026 17:59:34 -0500 Subject: [PATCH 45/72] Added -Wno-parentheses so HUB75 is easier to debug without a billion warnings. --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index efef6f7ff2..b126ec683c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -185,6 +185,7 @@ debug_flags = -D DEBUG=1 -D WLED_DEBUG # ------------------------------------------------------------------------------ build_flags = -Wno-attributes + -Wno-parentheses -DMQTT_MAX_PACKET_SIZE=1024 -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL -DBEARSSL_SSL_BASIC From 30f21e42cce0046d313be41a468e71a2a9bc045b Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 08:54:20 -0500 Subject: [PATCH 46/72] Adding back package json files from mdev --- package-lock.json | 1635 --------------------------------------------- package.json | 7 +- 2 files changed, 3 insertions(+), 1639 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5775479b0..789f77d8ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "clean-css": "^5.3.3", "html-minifier-terser": "^7.2.0", - "inliner": "^1.13.1", "nodemon": "^3.1.9", "web-resource-inliner": "^7.0.0" }, @@ -89,34 +88,6 @@ "node": ">=0.4.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -126,30 +97,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -163,67 +110,12 @@ "node": ">= 8" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -236,11 +128,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -279,151 +166,6 @@ "tslib": "^2.0.3" } }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/cheerio": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==", - "dependencies": { - "css-select": "~1.0.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "~3.8.1", - "lodash": "^3.2.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/cheerio/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "node_modules/cheerio/node_modules/htmlparser2/node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" - }, - "node_modules/cheerio/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/cheerio/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/cheerio/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -448,17 +190,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dependencies": { - "chalk": "^1.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -471,46 +202,6 @@ "node": ">= 10.0" } }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", - "dependencies": { - "q": "^1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -526,101 +217,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/configstore": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", - "integrity": "sha512-Zcx2SVdZC06IuRHd2MhkVYFNJBkZBj166LGdsJXRcqNC8Gs5Bwh8mosStNeCBBmtIm4wNii2uarD50qztjKOjw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.1", - "os-tmpdir": "^1.0.0", - "osenv": "^0.1.0", - "uuid": "^2.0.1", - "write-file-atomic": "^1.1.2", - "xdg-basedir": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/configstore/node_modules/uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/css-select": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "1.0", - "domutils": "1.4", - "nth-check": "~1.0.0" - } - }, - "node_modules/css-select/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/css-select/node_modules/domutils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/css-what": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==", - "engines": { - "node": "*" - } - }, - "node_modules/csso": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", - "integrity": "sha512-tckZA0LhyEnToPoQDmncCA+TUS3aoIVl/MsSaoipR52Sfa+H83fJvIHRVOHMFn9zW6kIV1L0D7tUDFFjvN28lg==", - "dependencies": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "bin": { - "csso": "bin/csso" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -638,30 +234,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -766,34 +338,6 @@ "tslib": "^2.0.3" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -806,11 +350,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha512-oyOjMhyKMLEjOOtvkwg0G4pAzLQ9WdbbeX7WdqKzvYXu+UFgD0Zo/Brq5Q49zNmnGPPzV5rmYvrr0jz1zWx8Iw==" - }, "node_modules/escape-goat": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", @@ -823,49 +362,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -878,27 +374,6 @@ "node": ">=8" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -913,14 +388,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -933,71 +400,6 @@ "node": ">= 6" } }, - "node_modules/got": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", - "integrity": "sha512-7chPlc0pWHjvq7B6dEEXz4GphoDupOvBSSl6AwRsAJX7GPTZ+bturaZiIigX4Dp6KrAP67nvzuKkNc0SLA0DKg==", - "dependencies": { - "duplexify": "^3.2.0", - "infinity-agent": "^2.0.0", - "is-redirect": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "nested-error-stacks": "^1.0.0", - "object-assign": "^3.0.0", - "prepend-http": "^1.0.0", - "read-all-stream": "^3.0.0", - "timed-out": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/got/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1052,113 +454,12 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "license": "ISC" }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/infinity-agent": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz", - "integrity": "sha512-CnfUJe5o2S9aAQWXGMhDZI4UL39MAJV3guOTfHHIdos4tuVHkl1j/J+1XLQn+CLIvqcpgQR/p+xXYXzcrhCe5w==" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inliner": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inliner/-/inliner-1.13.1.tgz", - "integrity": "sha512-yoS+56puOu+Ug8FBRtxtTFnEn2NHqFs8BNQgSOvzh3J0ommbwNw8VKiaVNYjWK6fgPuByq95KyV0LC+qV9IwLw==", - "dependencies": { - "ansi-escapes": "^1.4.0", - "ansi-styles": "^2.2.1", - "chalk": "^1.1.3", - "charset": "^1.0.0", - "cheerio": "^0.19.0", - "debug": "^2.2.0", - "es6-promise": "^2.3.0", - "iconv-lite": "^0.4.11", - "jschardet": "^1.3.0", - "lodash.assign": "^3.2.0", - "lodash.defaults": "^3.1.2", - "lodash.foreach": "^3.0.3", - "mime": "^1.3.4", - "minimist": "^1.1.3", - "request": "^2.74.0", - "svgo": "^0.6.6", - "then-fs": "^2.0.0", - "uglify-js": "^2.8.0", - "update-notifier": "^0.5.0" - }, - "bin": { - "inliner": "cli/index.js" - } - }, - "node_modules/inliner/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/inliner/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inliner/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1171,11 +472,6 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1185,17 +481,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1208,14 +493,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1225,244 +502,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jschardet": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", - "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/latest-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", - "integrity": "sha512-HERbxp4SBlmI380+eM0B0u4nxjfTaPeydIMzl9+9UQ4nSu3xMWKlX9WoT34e4wy7VWe67c53Nv9qPVjS8fHKgg==", - "dependencies": { - "package-json": "^1.0.0" - }, - "bin": { - "latest-version": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==" - }, - "node_modules/lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==" - }, - "node_modules/lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==" - }, - "node_modules/lodash._baseeach": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha512-IqUZ9MQo2UT1XPGuBntInqTOlc+oV+bCo0kMp+yuKGsfvRSNgUW0YjWVZUrG/gs+8z/Eyuc0jkJjOBESt9BXxg==", - "dependencies": { - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==" - }, - "node_modules/lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", - "dependencies": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==" - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==" - }, - "node_modules/lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", - "dependencies": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha512-X7135IXFQt5JDFnYxOVAzVz+kFvwDn3N8DJYf+nrz/mMWEuSu7+OL6rWqsk3+VR1T4TejFCSu5isBJOLSID2bg==", - "dependencies": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "node_modules/lodash.foreach": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.3.tgz", - "integrity": "sha512-PA7Lp7pe2HMJBoB1vELegEIF3waUFnM0fWDKJVYolwZ4zHh6WTmnq0xmzfQksD66gx2quhDNyBdyaE2T8/DP3Q==", - "dependencies": { - "lodash._arrayeach": "^3.0.0", - "lodash._baseeach": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==" - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -1472,14 +511,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -1492,25 +523,6 @@ "node": ">=4.0.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1523,39 +535,12 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/nested-error-stacks": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", - "integrity": "sha512-o32anp9JA7oezPOFSfG2BBXSdHepOm5FpJvwxHWDtfJ3Bg3xdi68S6ijPlEOfUg6quxZWyvJM+8fHk1yMDKspA==", - "dependencies": { - "inherits": "~2.0.1" - } - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -1603,76 +588,6 @@ "node": ">=0.10.0" } }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "deprecated": "This package is no longer supported.", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", - "integrity": "sha512-knDtirWWqKVJrLY3gEBLflVvueTMpyjbAwX/9j/EKi2DsjNemp5voS8cyKyGh57SNaMJNhNRZbIaWdneOcLU1g==", - "dependencies": { - "got": "^3.2.0", - "registry-url": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -1693,11 +608,6 @@ "tslib": "^2.0.3" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1710,134 +620,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", - "dependencies": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1850,17 +638,6 @@ "node": ">=8.10.0" } }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -1870,99 +647,6 @@ "node": ">= 0.10" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", - "dependencies": { - "is-finite": "^1.0.0" - }, - "bin": { - "repeating": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, "node_modules/semver": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", @@ -1975,25 +659,6 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", - "dependencies": { - "semver": "^5.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -2006,14 +671,6 @@ "node": ">=10" } }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "engines": { - "node": "*" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2033,83 +690,6 @@ "source-map": "^0.6.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==", - "dependencies": { - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2122,27 +702,6 @@ "node": ">=4" } }, - "node_modules/svgo": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", - "integrity": "sha512-C5A1r5SjFesNoKsmc+kWBxmB04iBGH2D/nFy8HJaME9+SyZKcmqcN8QG+GwxIc7D2+JWhaaW7uaM9+XwfplTEQ==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dependencies": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.0.0", - "js-yaml": "~3.6.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/terser": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", @@ -2167,22 +726,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/then-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha512-5ffcBcU+vFUCYDNi/o507IqjqrTkuGsLVZ1Fp50hwgZRY7ufVFa9jFfTy5uZ2QnSKacKigWKeaXkOqLa4DsjLw==", - "dependencies": { - "promise": ">=3.2 <8" - } - }, - "node_modules/timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2204,117 +747,18 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "optional": true - }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "license": "MIT" }, - "node_modules/update-notifier": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", - "integrity": "sha512-zOGOlUKDAgDlLHLv7Oiszz3pSj8fKlSJ3i0u49sEakjXUEVJ6DMjo/Mh/B6mg2eOALvRTJkd0kbChcipQoYCng==", - "dependencies": { - "chalk": "^1.0.0", - "configstore": "^1.0.0", - "is-npm": "^1.0.0", - "latest-version": "^1.0.0", - "repeating": "^1.1.2", - "semver-diff": "^2.0.0", - "string-length": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/valid-data-url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", @@ -2324,24 +768,6 @@ "node": ">=10" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, "node_modules/web-resource-inliner": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-7.0.0.tgz", @@ -2357,67 +783,6 @@ "engines": { "node": ">=10.0.0" } - }, - "node_modules/whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w==", - "dependencies": { - "os-homedir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } } } diff --git a/package.json b/package.json index d64285f623..c5f2a314c4 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,10 @@ "dependencies": { "clean-css": "^5.3.3", "html-minifier-terser": "^7.2.0", - "inliner": "^1.13.1", - "nodemon": "^3.1.9", - "web-resource-inliner": "^7.0.0" + "web-resource-inliner": "^7.0.0", + "nodemon": "^3.1.9" }, "engines": { "node": ">=20.0.0" } -} +} \ No newline at end of file From 48cce64549706663409fa91f9961b19a726c3f33 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:36:07 -0500 Subject: [PATCH 47/72] Hide W5500 from Ethernet UI when not available. --- wled00/xml.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 3a6267a3f4..a194c3af84 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -383,6 +383,13 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W oappend(SET_F("document.getElementById('ethd').style.display='none';")); #endif + #ifdef WLED_USE_ETHERNET + #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 + // Remove W5500 ethernet board options when W5500 support is not compiled + oappend(SET_F("var s=gId('ETH');for(var i=s.options.length-1;i>=0;i--){if(s.options[i].text.indexOf('W5500')>=0)s.remove(i);}")); + #endif + #endif + if (Network.isConnected()) //is connected { char s[32]; @@ -850,7 +857,12 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W oappend(SET_F("d.getElementsByName(\"if:MOSI:pin\")[1].value=")); oappendi(spi_mosi); oappend(";"); oappend(SET_F("d.getElementsByName(\"if:MISO:pin\")[1].value=")); oappendi(spi_miso); oappend(";"); oappend(SET_F("d.getElementsByName(\"if:SCLK:pin\")[1].value=")); oappendi(spi_sclk); oappend(";"); + oappend(SET_F("d.getElementsByName(\"if:CS:pin\")[1].value=")); oappendi(spi_cs); oappend(";"); + oappend(SET_F("d.getElementsByName(\"if:INT:pin\")[1].value=")); oappendi(spi_int); oappend(";"); + oappend(SET_F("d.getElementsByName(\"if:RST:pin\")[1].value=")); oappendi(spi_rst); oappend(";"); + //WLEDMM: add help info showing defaults + oappend(SET_F("addInfo('if:use_for_w5500:use',0,'','SPI for W5500 Ethernet');")); oappend(SET_F("addInfo('if:SDA:pin',0,'', 'SDA');")); oappend(SET_F("xOpt('if:SDA:pin',1,' ⍼',")); oappendi(SDA); oappend(");"); #ifdef HW_PIN_SDA @@ -877,6 +889,23 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W oappend(SET_F("dRO('if:SCLK:pin',1);")); // disable read only pins #ifdef HW_PIN_CLOCKSPI oappend(SET_F("xOpt('if:SCLK:pin',1,' ⎌',")); oappendi(HW_PIN_CLOCKSPI); oappend(");"); + #endif + oappend(SET_F("addInfo('if:CS:pin',0,'', 'CS');")); + oappend(SET_F("xOpt('if:CS:pin',1,' ⍼',")); oappendi(HW_PIN_CSSPI); oappend(");"); + oappend(SET_F("dRO('if:CS:pin',1);")); // disable read only pins + #ifdef HW_PIN_CSSPI + oappend(SET_F("xOpt('if:CS:pin',1,' ⎌',")); oappendi(HW_PIN_CSSPI); oappend(");"); + #endif + oappend(SET_F("addInfo('if:INT:pin',0,'', 'INT');")); + oappend(SET_F("xOpt('if:INT:pin',1,' ⍼',")); oappendi(HW_PIN_INTSPI); oappend(");"); + #ifdef HW_PIN_INTSPI + oappend(SET_F("xOpt('if:INT:pin',1,' ⎌',")); oappendi(HW_PIN_INTSPI); oappend(");"); + #endif + oappend(SET_F("addInfo('if:RST:pin',0,'', 'RST');")); + oappend(SET_F("xOpt('if:RST:pin',1,' ⍼',")); oappendi(HW_PIN_RSTSPI); oappend(");"); + oappend(SET_F("dRO('if:RST:pin',1);")); // disable read only pins + #ifdef HW_PIN_RSTSPI + oappend(SET_F("xOpt('if:RST:pin',1,' ⎌',")); oappendi(HW_PIN_RSTSPI); oappend(");"); #endif } else { From cebfccfef6bbc6a65776d82d99f5afe7665176a7 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:49:04 -0500 Subject: [PATCH 48/72] Re-order to make more logical sense --- wled00/network.cpp | 102 ++++++++++++++++++++--------------------- wled00/wled_ethernet.h | 23 +++++----- 2 files changed, 63 insertions(+), 62 deletions(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index ae37147beb..84f6dcf73e 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -40,12 +40,12 @@ const ethernet_settings ethernetBoards[] = { 16, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -56,12 +56,12 @@ const ethernet_settings ethernetBoards[] = { 12, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -72,12 +72,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 16, // eth_mdc, 17, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -88,12 +88,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -104,12 +104,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -120,12 +120,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -136,12 +136,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_IP101, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -152,12 +152,12 @@ const ethernet_settings ethernetBoards[] = { -1, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -168,12 +168,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 33, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -184,12 +184,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -200,12 +200,12 @@ const ethernet_settings ethernetBoards[] = { 12, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode }, @@ -217,12 +217,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode }, @@ -233,12 +233,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 33, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO0_IN // eth_clk_mode }, @@ -249,12 +249,12 @@ const ethernet_settings ethernetBoards[] = { 5, // eth_power, 23, // eth_mdc, 18, // eth_mdio, - GPIO_NUM_NC, // eth_miso_pin, GPIO_NUM_NC, // eth_mosi_pin, + GPIO_NUM_NC, // eth_miso_pin, + GPIO_NUM_NC, // eth_sclk_pin, GPIO_NUM_NC, // eth_cs_pin, + GPIO_NUM_NC, // eth_int_pin, GPIO_NUM_NC, // eth_rst_pin, - GPIO_NUM_NC, // eth_int_pin; - GPIO_NUM_NC, // eth_sclk_pin; ETH_PHY_LAN8720, // eth_type, ETH_CLOCK_GPIO17_OUT // eth_clk_mode }, @@ -265,12 +265,12 @@ const ethernet_settings ethernetBoards[] = { GPIO_NUM_NC, // eth_power, GPIO_NUM_NC, // eth_mdc, GPIO_NUM_NC, // eth_mdio, - 11, // eth_miso_pin, 12, // eth_mosi_pin, + 11, // eth_miso_pin, + 10, // eth_sclk_pin, 9, // eth_cs_pin, + 13, // eth_int_pin, 14, // eth_rst_pin, - 13, // eth_int_pin; - 10, // eth_sclk_pin; ETH_PHY_W5500, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) }, @@ -281,12 +281,12 @@ const ethernet_settings ethernetBoards[] = { GPIO_NUM_NC, // eth_power, GPIO_NUM_NC, // eth_mdc, GPIO_NUM_NC, // eth_mdio, - 12, // eth_miso_pin, 11, // eth_mosi_pin, + 12, // eth_miso_pin, + 13, // eth_sclk_pin, 14, // eth_cs_pin, + 10, // eth_int_pin, 9, // eth_rst_pin, - 10, // eth_int_pin; - 13, // eth_sclk_pin; ETH_PHY_W5500, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) }, @@ -297,12 +297,12 @@ const ethernet_settings ethernetBoards[] = { GPIO_NUM_NC, // eth_power, GPIO_NUM_NC, // eth_mdc, GPIO_NUM_NC, // eth_mdio, - 12, // eth_miso_pin, 13, // eth_mosi_pin, + 12, // eth_miso_pin, + 14, // eth_sclk_pin, 25, // eth_cs_pin, + 27, // eth_int_pin, 26, // eth_rst_pin, - 27, // eth_int_pin; - 14, // eth_sclk_pin; ETH_PHY_W5500, // eth_type, ETH_CLOCK_GPIO0_OUT // eth_clk_mode (ignored for W5500) } diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 7c37cf6d9f..9e00b798fe 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -22,19 +22,20 @@ #define GPIO_NUM_NC -1 #endif -#ifdef CONFIG_ETH_PHY_INTERFACE_RMII +#if defined(CONFIG_ETH_PHY_INTERFACE_RMII) || ESP_IDF_VERSION_MAJOR == 3 #define WLED_ETH_RSVD_PINS_COUNT 6 +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; typedef struct EthernetSettings { uint8_t eth_address; int eth_power; int eth_mdc; int eth_mdio; - int eth_miso_pin; int eth_mosi_pin; + int eth_miso_pin; + int eth_sclk_pin; int eth_cs_pin; - int eth_rst_pin; int eth_int_pin; - int eth_sclk_pin; + int eth_rst_pin; eth_phy_type_t eth_type; eth_clock_mode_t eth_clk_mode; } ethernet_settings; @@ -51,21 +52,21 @@ typedef struct EthernetSettings { int eth_power; int eth_mdc; int eth_mdio; - int eth_miso_pin; int eth_mosi_pin; + int eth_miso_pin; + int eth_sclk_pin; int eth_cs_pin; - int eth_rst_pin; int eth_int_pin; - int eth_sclk_pin; + int eth_rst_pin; int eth_type; int eth_clk_mode; } ethernet_settings; +#define WLED_ETH_RSVD_PINS_COUNT 0 +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[]; #endif extern const ethernet_settings ethernetBoards[]; -#define WLED_ETH_RSVD_PINS_COUNT 0 -extern managed_pin_type esp32_nonconfigurable_ethernet_pins[]; -#endif +#endif // WLED_USE_ETHERNET -#endif \ No newline at end of file +#endif // WLED_ETHERNET_H From a33219839c97a26dec7df632c72455f1471f37f2 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:49:52 -0500 Subject: [PATCH 49/72] User can modify SPI pins and specify them for W5500 Ethernet - if available. --- wled00/cfg.cpp | 52 +++++++++++++- wled00/const.h | 9 +++ wled00/data/settings_um.htm | 7 ++ wled00/data/settings_wifi.htm | 2 +- wled00/pin_manager.cpp | 21 ++++-- wled00/set.cpp | 66 ++++++++++++++++-- wled00/wled.cpp | 123 ++++++++++++++++++++++------------ wled00/wled.h | 28 ++++++++ wled00/xml.cpp | 44 ++++++------ 9 files changed, 273 insertions(+), 79 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index d88eab0989..5b40f4607b 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -351,6 +351,35 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(spi_mosi, hw_if_spi[0]); CJSON(spi_sclk, hw_if_spi[1]); CJSON(spi_miso, hw_if_spi[2]); + + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + CJSON(spi_cs, hw_if_spi[3]); + CJSON(spi_int, hw_if_spi[4]); + CJSON(spi_rst, hw_if_spi[5]); + + JsonObject hw_if_spi_use = hw[F("if")][F("spi-use")]; + if (!hw_if_spi_use[F("use-for-w5500")].isNull()) { + spi_use_for_w5500 = hw_if_spi_use[F("use-for-w5500")].as(); + if (spi_use_for_w5500) USER_PRINTLN("use-for-w5500 is TRUE"); + if (!spi_use_for_w5500) USER_PRINTLN("use-for-w5500 is FALSE"); + } else { + USER_PRINTLN("use-for-w5500 was not found"); + } + + PinManagerPinType spi[6] = { { spi_mosi, true }, { spi_miso, true }, { spi_sclk, true } , { spi_cs, true } , { spi_int, true } , { spi_rst, true } }; + if (spi_mosi >= 0 && spi_sclk >= 0 && pinManager.allocateMultiplePins(spi, 6, PinOwner::HW_SPI)) { + if (!spi_use_for_w5500) { + #ifdef ESP32 + SPI.begin(spi_sclk, spi_miso, spi_mosi); // SPI global uses VSPI on ESP32 and FSPI on C3, S3 + #else + SPI.begin(); + #endif + } + DEBUG_PRINTF("pinmgr success for global spi %d %d %d %d %d %d\n", spi_mosi, spi_miso, spi_sclk, spi_cs, spi_int, spi_rst); + } else { + DEBUG_PRINTF("pinmgr not success for global spi %d %d %d %d %d %d\n", spi_mosi, spi_miso, spi_sclk, spi_cs, spi_int, spi_rst); + } + #else PinManagerPinType spi[3] = { { spi_mosi, true }, { spi_miso, true }, { spi_sclk, true } }; if (spi_mosi >= 0 && spi_sclk >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { #ifdef ESP32 @@ -362,7 +391,12 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { } else { DEBUG_PRINTF("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); } + #endif + // NOTE: Ethernet initialization must be deferred until after deserializeConfigFromFS() releases the JSON buffer lock + // and completes. Calling initEthernet() here can trigger async events that may try to serialize config while + // the lock is held, potentially corrupting cfg.json. The fromFS parameter signals this case. + //int hw_status_pin = hw[F("status")]["pin"]; // -1 JsonObject light = doc[F("light")]; @@ -682,6 +716,14 @@ void deserializeConfigFromFS() { bool needsSave = deserializeConfig(doc.as(), true); releaseJSONBufferLock(); + // Initialize Ethernet AFTER releasing the JSON buffer lock to prevent race conditions. + // Ethernet events can trigger async operations that may try to serialize config. + #if defined(WLED_USE_ETHERNET) && defined(CONFIG_ETH_SPI_ETHERNET_W5500) + if (spi_use_for_w5500 && spi_mosi >= 0 && spi_sclk >= 0) { + WLED::instance().initEthernet(); + } + #endif + if (needsSave) serializeConfig(); // usermods required new parameters } @@ -746,7 +788,7 @@ void serializeConfig() { #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 #define ETH_PHY_W5500 ETH_PHY_MAX #endif - + JsonObject ethernet = doc.createNestedObject("eth"); ethernet["type"] = ethernetType; if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) { @@ -902,6 +944,14 @@ void serializeConfig() { hw_if_spi.add(spi_mosi); hw_if_spi.add(spi_sclk); hw_if_spi.add(spi_miso); + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + hw_if_spi.add(spi_cs); + hw_if_spi.add(spi_int); + hw_if_spi.add(spi_rst); + + JsonObject spi_use = hw_if.createNestedObject(F("spi-use")); + spi_use[F("use-for-w5500")] = (spi_use_for_w5500) ? spi_use_for_w5500 : false; + #endif //JsonObject hw_status = hw.createNestedObject("status"); //hw_status["pin"] = -1; diff --git a/wled00/const.h b/wled00/const.h index d319f94942..989d9422fa 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -611,6 +611,15 @@ #ifndef HW_PIN_MISOSPI #define HW_PIN_MISOSPI -1 //WLEDMM if not defined -1 will be used (not MISO/19) #endif +#ifndef HW_PIN_CSSPI + #define HW_PIN_CSSPI -1 //WLEDMM if not defined -1 will be used (not MISO/19) +#endif +#ifndef HW_PIN_INTSPI + #define HW_PIN_INTSPI -1 //WLEDMM if not defined -1 will be used (not MISO/19) +#endif +#ifndef HW_PIN_RSTSPI + #define HW_PIN_RSTSPI -1 //WLEDMM if not defined -1 will be used (not MISO/19) +#endif // WLEDMM: IRAM_ATTR for 8266 causes error: section `.text1' will not fit in region `iram1_0_seg' // error only in MM, not in upstream... tbd: find out why diff --git a/wled00/data/settings_um.htm b/wled00/data/settings_um.htm index d0dd98f3d2..c5703a5898 100644 --- a/wled00/data/settings_um.htm +++ b/wled00/data/settings_um.htm @@ -333,6 +333,13 @@ addField("if:MOSI", "pin", -1, false); addField("if:MISO", "pin", -1, false); addField("if:SCLK", "pin", -1, false); + // W5500-specific fields - only show if server supports W5500 (detected by checking if spi-use object exists) + if (json.hw?.if?.["spi-use"]) { + addField("if:CS", "pin", -1, false); + addField("if:INT", "pin", -1, false); + addField("if:RST", "pin", -1, false); + addField("if:use_for_w5500", "use", json.hw.if["spi-use"]["use-for-w5500"] ?? false); + } } if (isO(umCfg)) { //WLEDMM: read url parameter. e.g. um=AudioReactive and if set only add the usermod with the same name diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index a3a4206d23..7635c0a549 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -195,7 +195,7 @@

Wireless Remote

Ethernet Type

- diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index 9ccdf1e02c..47d2132dd6 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -105,9 +105,18 @@ String PinManagerClass::getPinSpecialText(int gpio) { // special purpose PIN in if (isPinAllocated(gpio)) { if ((gpio == i2c_sda) && (getPinOwner(gpio) == PinOwner::HW_I2C)) return(F("I2C SDA")); if ((gpio == i2c_scl) && (getPinOwner(gpio) == PinOwner::HW_I2C)) return(F("I2C SCL")); - if ((gpio == spi_sclk) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return(F("SPI SLK / SCK")); - if ((gpio == spi_mosi) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return(F("SPI PICO / MOSI")); - if ((gpio == spi_miso) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return(F("SPI POCI / MISO")); + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) + if ((gpio == spi_mosi) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet MOSI / PICO") : F("SPI MOSI / PICO"); + if ((gpio == spi_miso) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet MISO / POCI") : F("SPI MISO / POCI"); + if ((gpio == spi_sclk) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet SCLK / SCK") : F("SPI SCLK / SCK"); + if ((gpio == spi_cs) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet CS / SS") : F("SPI CS / SS"); + if ((gpio == spi_int) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet INT / IRQ") : F("SPI INT / IRQ"); + if ((gpio == spi_rst) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return spi_use_for_w5500 ? F("SPI Ethernet RST / RSET") : F("SPI RST / RSET"); + #else + if ((gpio == spi_mosi) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return F("SPI MOSI / PICO"); + if ((gpio == spi_miso) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return F("SPI MISO / POCI"); + if ((gpio == spi_sclk) && (getPinOwner(gpio) == PinOwner::HW_SPI)) return F("SPI SCLK / SCK"); + #endif } // MCU special PINS #ifdef ARDUINO_ARCH_ESP32 @@ -167,9 +176,9 @@ String PinManagerClass::getPinSpecialText(int gpio) { // special purpose PIN in // hardware special purpose PINS. part2 - default pins if (gpio == i2c_sda) return(F("(default) I2C SDA")); if (gpio == i2c_scl) return(F("(default) I2C SCL")); - if (gpio == spi_sclk) return(F("(default) SPI SLK / SCK")); - if (gpio == spi_mosi) return(F("(default) SPI PICO / MOSI")); - if (gpio == spi_miso) return(F("(default) SPI POCI / MISO")); + if (gpio == spi_mosi) return(F("(default) SPI MOSI / PICO")); + if (gpio == spi_miso) return(F("(default) SPI MISO / POCI")); + if (gpio == spi_sclk) return(F("(default) SPI SCLK / SCK")); //if ((gpio == spi_cs) || ((gpio == HW_PIN_CS) && (spi_cs < 0))) return(F("(default) SPI CS / SS")); #if defined(WLED_USE_SD_MMC) || defined(WLED_USE_SD_SPI) || defined(SD_ADAPTER) if ((gpio == HW_PIN_CSSPI)) return(F("(default) SPI CS / SS")); // no part of usermod default settings, currently only needed by SD_CARD usermod diff --git a/wled00/set.cpp b/wled00/set.cpp index 560de9b653..c574f030b6 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -59,6 +59,9 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) #ifdef WLED_USE_ETHERNET ethernetType = request->arg(F("ETH")).toInt(); + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + DEBUG_PRINTF("spi_use_for_w5500 is %s\n", spi_use_for_w5500 ? "true" : "false"); + #endif WLED::instance().initEthernet(); #endif @@ -593,21 +596,39 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) int8_t hw_miso_pin = -2;//!request->arg(F("MISOpin")).length() ? -1 : (int)request->arg(F("MISOpin")).toInt(); int8_t hw_sclk_pin = -2;//!request->arg(F("SCLKpin")).length() ? -1 : (int)request->arg(F("SCLKpin")).toInt(); + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + int8_t hw_cs_pin = -2; + int8_t hw_int_pin = -2; + int8_t hw_rst_pin = -2; + bool use_spi_for_w5500 = false; + #endif + //WLEDMM: :pin values have 2 occurrences: the type and the value, we need the value int paramsNr = request->params(); AsyncWebParameter* p_prev = nullptr; - for (int i=0;igetParam(i); - if (p_prev != nullptr && p->name() == p_prev->name()) - { + if (p_prev != nullptr && p->name() == p_prev->name()) { + USER_PRINT(p->name()); + USER_PRINT("="); + USER_PRINTLN(p->value()); if (p->name() == "if:SDA:pin") hw_sda_pin = p->value().toInt(); if (p->name() == "if:SCL:pin") hw_scl_pin = p->value().toInt(); if (p->name() == "if:MOSI:pin") hw_mosi_pin = p->value().toInt(); if (p->name() == "if:MISO:pin") hw_miso_pin = p->value().toInt(); if (p->name() == "if:SCLK:pin") hw_sclk_pin = p->value().toInt(); + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + if (p->name() == "if:CS:pin") hw_cs_pin = p->value().toInt(); + if (p->name() == "if:INT:pin") hw_int_pin = p->value().toInt(); + if (p->name() == "if:RST:pin") hw_rst_pin = p->value().toInt(); + if (p->name() == "if:use_for_w5500:use") { + use_spi_for_w5500 = p->value(); + USER_PRINTF("**** use_spi_for_w5500 == %d\n", use_spi_for_w5500); + } + #endif } p_prev = p; - } + } #ifdef ESP8266 // cannot change pins on ESP8266 --> actually we can @@ -643,11 +664,41 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (hw_miso_pin >= 0 && hw_miso_pin != HW_PIN_MISOSPI) hw_mosi_pin = HW_PIN_MISOSPI; if (hw_sclk_pin >= 0 && hw_sclk_pin != HW_PIN_CLOCKSPI) hw_sclk_pin = HW_PIN_CLOCKSPI; #endif + + spi_mosi = hw_mosi_pin; + spi_miso = hw_miso_pin; + spi_sclk = hw_sclk_pin; + + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + PinManagerPinType spi[6] = { { hw_mosi_pin, true }, { hw_miso_pin, true }, { hw_sclk_pin, true }, { hw_cs_pin, true }, { hw_int_pin, false }, { hw_rst_pin, true } }; + + USER_PRINTF("spi_use_for_w5500 = %d use_spi_for_w5500 = %d\n", spi_use_for_w5500, use_spi_for_w5500); + + spi_cs = hw_cs_pin; + spi_int = hw_int_pin; + spi_rst = hw_rst_pin; + + if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && use_spi_for_w5500 == true) { + spi_use_for_w5500 = use_spi_for_w5500; + USER_PRINTLN("Trying to start W5500 SPI Ethernet"); + WLED::instance().initEthernet(); + } else if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && use_spi_for_w5500 == false) { + pinManager.allocateMultiplePins(spi, 6, PinOwner::HW_SPI); + spi_use_for_w5500 = false; + } else { + //SPI.end(); + if (hw_mosi_pin == -1 || hw_sclk_pin == -1) { // WLEDMM bugfix allow pin = -1 + spi_use_for_w5500 = false; + } + DEBUG_PRINTLN(F("Could not allocate SPI pins.")); + uint8_t spi[6] = { static_cast(spi_mosi), static_cast(spi_miso), static_cast(spi_sclk), static_cast(spi_cs), static_cast(spi_int), static_cast(spi_rst) }; + pinManager.deallocateMultiplePins(spi, 6, PinOwner::HW_SPI); // just in case deallocation of old pins + DEBUG_PRINTF("pinmgr not success for global spi %d %d %d %d %d %d\n", spi_mosi, spi_miso, spi_sclk, spi_cs, spi_int, spi_rst); + spi_use_for_w5500 = false; + } + #else PinManagerPinType spi[3] = { { hw_mosi_pin, true }, { hw_miso_pin, true }, { hw_sclk_pin, true } }; if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { - spi_mosi = hw_mosi_pin; - spi_miso = hw_miso_pin; - spi_sclk = hw_sclk_pin; // no bus re-initialisation as usermods do not get any notification //SPI.end(); #ifdef ESP32 @@ -667,6 +718,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins DEBUG_PRINTF("pinmgr not success for global spi %d %d %d\n", spi_mosi, spi_miso, spi_sclk); } + #endif JsonObject um = doc.createNestedObject("um"); diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 4caf7860ec..2c016f2cec 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1009,49 +1009,70 @@ void WLED::initAP(bool resetAP) bool WLED::initEthernet() { -#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET) - + #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET) + static bool successfullyConfiguredEthernet = false; + ethernet_settings es = {}; - if (successfullyConfiguredEthernet) { - // DEBUG_PRINTLN(F("initE: ETH already successfully configured, ignoring")); - return false; - } - if (ethernetType == WLED_ETH_NONE) { - return false; - } - if (ethernetType >= WLED_NUM_ETH_TYPES) { - DEBUG_PRINT(F("initE: Ignoring attempt for invalid ethernetType ")); DEBUG_PRINTLN(ethernetType); - return false; + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + if (!spi_use_for_w5500 || ethernetType > 0) { + #endif + + if (successfullyConfiguredEthernet) { + // DEBUG_PRINTLN(F("initE: ETH already successfully configured, ignoring")); + return false; + } + if (ethernetType == WLED_ETH_NONE) { + return false; + } + if (ethernetType >= WLED_NUM_ETH_TYPES) { + DEBUG_PRINT(F("initE: Ignoring attempt for invalid ethernetType ")); DEBUG_PRINTLN(ethernetType); + return false; + } + + DEBUG_PRINT(F("initE: Attempting ETH config: ")); DEBUG_PRINTLN(ethernetType); + + // Ethernet initialization should only succeed once -- else reboot required + es = ethernetBoards[ethernetType]; + + /* + For LAN8720 the most correct way is to perform clean reset each time before init + applying LOW to power or nRST pin for at least 100 us (please refer to datasheet, page 59) + ESP_IDF > V4 implements it (150 us, lan87xx_reset_hw(esp_eth_phy_t *phy) function in + /components/esp_eth/src/esp_eth_phy_lan87xx.c, line 280) + but ESP_IDF < V4 does not. Lets do it: + [not always needed, might be relevant in some EMI situations at startup and for hot resets] + */ + #if ESP_IDF_VERSION_MAJOR==3 + if (es.eth_power > 0 && es.eth_type == ETH_PHY_LAN8720) { + pinMode(es.eth_power, OUTPUT); + digitalWrite(es.eth_power, 0); + delayMicroseconds(150); + digitalWrite(es.eth_power, 1); + delayMicroseconds(10); + } + #endif + + #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 } - DEBUG_PRINT(F("initE: Attempting ETH config: ")); DEBUG_PRINTLN(ethernetType); - - // Ethernet initialization should only succeed once -- else reboot required - ethernet_settings es = ethernetBoards[ethernetType]; - - /* - For LAN8720 the most correct way is to perform clean reset each time before init - applying LOW to power or nRST pin for at least 100 us (please refer to datasheet, page 59) - ESP_IDF > V4 implements it (150 us, lan87xx_reset_hw(esp_eth_phy_t *phy) function in - /components/esp_eth/src/esp_eth_phy_lan87xx.c, line 280) - but ESP_IDF < V4 does not. Lets do it: - [not always needed, might be relevant in some EMI situations at startup and for hot resets] - */ - #if ESP_IDF_VERSION_MAJOR==3 - if(es.eth_power>0 && es.eth_type==ETH_PHY_LAN8720) { - pinMode(es.eth_power, OUTPUT); - digitalWrite(es.eth_power, 0); - delayMicroseconds(150); - digitalWrite(es.eth_power, 1); - delayMicroseconds(10); + if (spi_use_for_w5500 && ethernetType == WLED_ETH_NONE) { + es.eth_type = ETH_PHY_W5500; + es.eth_address = 1; + es.eth_miso_pin = spi_miso; + es.eth_mosi_pin = spi_mosi; + es.eth_cs_pin = spi_cs; + es.eth_rst_pin = spi_rst; + es.eth_int_pin = spi_int; + es.eth_sclk_pin = spi_sclk; + } else { + spi_use_for_w5500 = false; } - #endif - - #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + #if !defined(SPI3_HOST) #define SPI3_HOST SPI2_HOST // at a minimum there are 2 SPI Hosts #endif + if (es.eth_type == ETH_PHY_W5500) { managed_pin_type pinsToAllocate[6] = { { (int8_t)es.eth_miso_pin, false }, // MISO is input @@ -1061,15 +1082,31 @@ bool WLED::initEthernet() { (int8_t)es.eth_int_pin, false }, // INT is input { (int8_t)es.eth_sclk_pin, true }, // SCLK is output }; - if (!pinManager.allocateMultiplePins(pinsToAllocate, 6, PinOwner::Ethernet)) { - DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); - return false; + + if (spi_use_for_w5500 == false) { + if (!pinManager.allocateMultiplePins(pinsToAllocate, 6, PinOwner::Ethernet)) { + DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); + return false; + } + } else { + for (int i = 0; i < 6; i++) { + int8_t pin = pinsToAllocate[i].pin; + if (pinManager.getPinOwner(pin) == PinOwner::Ethernet || pinManager.getPinOwner(pin) == PinOwner::HW_SPI) { + // noop + } else { + USER_PRINTF("initEthernet: FAIL: pin %d is not owned by Ethernet or SPI\n", pin); + return false; + } + } } + if (!ETH.begin(ETH_PHY_W5500, es.eth_address, es.eth_cs_pin, es.eth_int_pin, es.eth_rst_pin, SPI3_HOST, es.eth_sclk_pin, es.eth_miso_pin, es.eth_mosi_pin)) { - DEBUG_PRINTLN(F("initC: ETH.begin() [SPI Ethernet] failed")); + DEBUG_PRINTLN(F("initC: ETHClass2 SPI ETH.begin() failed")); // de-allocate the allocated pins - for (managed_pin_type mpt : pinsToAllocate) { - pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + if (!spi_use_for_w5500) { + for (managed_pin_type mpt : pinsToAllocate) { + pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); + } } return false; } else { @@ -1122,7 +1159,7 @@ bool WLED::initEthernet() (int)es.eth_power, (eth_clock_mode_t)es.eth_clk_mode )) { - DEBUG_PRINTLN(F("initC: ETH.begin() failed")); + DEBUG_PRINTLN(F("initC: ETHClass2 RMII ETH.begin() failed")); // de-allocate the allocated pins for (managed_pin_type mpt : pinsToAllocate) { pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); @@ -1181,7 +1218,7 @@ bool WLED::initEthernet() (eth_phy_type_t)es.eth_type, (eth_clock_mode_t)es.eth_clk_mode )) { - DEBUG_PRINTLN(F("initC: ETH.begin() failed")); + DEBUG_PRINTLN(F("initC: original ETH.begin() failed")); // de-allocate the allocated pins for (managed_pin_type mpt : pinsToAllocate) { pinManager.deallocatePin(mpt.pin, PinOwner::Ethernet); diff --git a/wled00/wled.h b/wled00/wled.h index b492bc126c..e4ad9e3555 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -847,12 +847,14 @@ WLED_GLOBAL int8_t spi_mosi _INIT(-1); #else WLED_GLOBAL int8_t spi_mosi _INIT(HW_PIN_MOSISPI); #endif + // global SPI DATA/MISO pin (used for usermods) #ifndef HW_PIN_MISOSPI //WLEDMM not SPIMISOPIN WLED_GLOBAL int8_t spi_miso _INIT(-1); #else WLED_GLOBAL int8_t spi_miso _INIT(HW_PIN_MISOSPI); #endif + // global SPI CLOCK/SCLK pin (used for usermods) #ifndef HW_PIN_CLOCKSPI //WLEDMM not SPISCLKPIN WLED_GLOBAL int8_t spi_sclk _INIT(-1); @@ -860,6 +862,32 @@ WLED_GLOBAL int8_t spi_sclk _INIT(-1); WLED_GLOBAL int8_t spi_sclk _INIT(HW_PIN_CLOCKSPI); #endif +#ifdef CONFIG_ETH_SPI_ETHERNET_W5500 +#ifndef HW_PIN_CSSPI +WLED_GLOBAL int8_t spi_cs _INIT(-1); +#else +WLED_GLOBAL int8_t spi_cs _INIT(HW_PIN_CSSPI); +#endif + +#ifndef HW_PIN_INTSPI +WLED_GLOBAL int8_t spi_int _INIT(-1); +#else +WLED_GLOBAL int8_t spi_int _INIT(HW_PIN_INTSPI); +#endif + +#ifndef HW_PIN_RSTSPI +WLED_GLOBAL int8_t spi_rst _INIT(-1); +#else +WLED_GLOBAL int8_t spi_rst _INIT(HW_PIN_RSTSPI); +#endif + +#ifndef USE_HW_SPI_FOR_W5500 +WLED_GLOBAL bool spi_use_for_w5500 _INIT(0); +#else +WLED_GLOBAL BOOL spi_use_for_w5500 _INIT(USE_HW_SPI_FOR_W5500); +#endif +#endif // CONFIG_ETH_SPI_ETHERNET_W5500 + // global ArduinoJson buffer #if defined(ALL_JSON_TO_PSRAM) && (defined(WLED_USE_PSRAM_JSON) || defined(WLED_USE_PSRAM)) // WLEDMM experimental : always use dynamic JSON diff --git a/wled00/xml.cpp b/wled00/xml.cpp index a194c3af84..5ee6c2ae1e 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -386,7 +386,7 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W #ifdef WLED_USE_ETHERNET #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 // Remove W5500 ethernet board options when W5500 support is not compiled - oappend(SET_F("var s=gId('ETH');for(var i=s.options.length-1;i>=0;i--){if(s.options[i].text.indexOf('W5500')>=0)s.remove(i);}")); + oappend(SET_F("var s=gId('eth_boards');for(var i=s.options.length-1;i>=0;i--){if(s.options[i].text.indexOf('W5500')>=0)s.remove(i);}")); #endif #endif @@ -857,12 +857,8 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W oappend(SET_F("d.getElementsByName(\"if:MOSI:pin\")[1].value=")); oappendi(spi_mosi); oappend(";"); oappend(SET_F("d.getElementsByName(\"if:MISO:pin\")[1].value=")); oappendi(spi_miso); oappend(";"); oappend(SET_F("d.getElementsByName(\"if:SCLK:pin\")[1].value=")); oappendi(spi_sclk); oappend(";"); - oappend(SET_F("d.getElementsByName(\"if:CS:pin\")[1].value=")); oappendi(spi_cs); oappend(";"); - oappend(SET_F("d.getElementsByName(\"if:INT:pin\")[1].value=")); oappendi(spi_int); oappend(";"); - oappend(SET_F("d.getElementsByName(\"if:RST:pin\")[1].value=")); oappendi(spi_rst); oappend(";"); //WLEDMM: add help info showing defaults - oappend(SET_F("addInfo('if:use_for_w5500:use',0,'','SPI for W5500 Ethernet');")); oappend(SET_F("addInfo('if:SDA:pin',0,'', 'SDA');")); oappend(SET_F("xOpt('if:SDA:pin',1,' ⍼',")); oappendi(SDA); oappend(");"); #ifdef HW_PIN_SDA @@ -890,22 +886,28 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W #ifdef HW_PIN_CLOCKSPI oappend(SET_F("xOpt('if:SCLK:pin',1,' ⎌',")); oappendi(HW_PIN_CLOCKSPI); oappend(");"); #endif - oappend(SET_F("addInfo('if:CS:pin',0,'', 'CS');")); - oappend(SET_F("xOpt('if:CS:pin',1,' ⍼',")); oappendi(HW_PIN_CSSPI); oappend(");"); - oappend(SET_F("dRO('if:CS:pin',1);")); // disable read only pins - #ifdef HW_PIN_CSSPI - oappend(SET_F("xOpt('if:CS:pin',1,' ⎌',")); oappendi(HW_PIN_CSSPI); oappend(");"); - #endif - oappend(SET_F("addInfo('if:INT:pin',0,'', 'INT');")); - oappend(SET_F("xOpt('if:INT:pin',1,' ⍼',")); oappendi(HW_PIN_INTSPI); oappend(");"); - #ifdef HW_PIN_INTSPI - oappend(SET_F("xOpt('if:INT:pin',1,' ⎌',")); oappendi(HW_PIN_INTSPI); oappend(");"); - #endif - oappend(SET_F("addInfo('if:RST:pin',0,'', 'RST');")); - oappend(SET_F("xOpt('if:RST:pin',1,' ⍼',")); oappendi(HW_PIN_RSTSPI); oappend(");"); - oappend(SET_F("dRO('if:RST:pin',1);")); // disable read only pins - #ifdef HW_PIN_RSTSPI - oappend(SET_F("xOpt('if:RST:pin',1,' ⎌',")); oappendi(HW_PIN_RSTSPI); oappend(");"); + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) + oappend(SET_F("d.getElementsByName(\"if:CS:pin\")[1].value=")); oappendi(spi_cs); oappend(";"); + oappend(SET_F("d.getElementsByName(\"if:INT:pin\")[1].value=")); oappendi(spi_int); oappend(";"); + oappend(SET_F("d.getElementsByName(\"if:RST:pin\")[1].value=")); oappendi(spi_rst); oappend(";"); + oappend(SET_F("addInfo('if:use_for_w5500:use',0,'','SPI for W5500 Ethernet');")); + oappend(SET_F("addInfo('if:CS:pin',0,'', 'CS');")); + oappend(SET_F("xOpt('if:CS:pin',1,' ⍼',")); oappendi(HW_PIN_CSSPI); oappend(");"); + oappend(SET_F("dRO('if:CS:pin',1);")); // disable read only pins + #ifdef HW_PIN_CSSPI + oappend(SET_F("xOpt('if:CS:pin',1,' ⎌',")); oappendi(HW_PIN_CSSPI); oappend(");"); + #endif + oappend(SET_F("addInfo('if:INT:pin',0,'', 'INT');")); + oappend(SET_F("xOpt('if:INT:pin',1,' ⍼',")); oappendi(HW_PIN_INTSPI); oappend(");"); + #ifdef HW_PIN_INTSPI + oappend(SET_F("xOpt('if:INT:pin',1,' ⎌',")); oappendi(HW_PIN_INTSPI); oappend(");"); + #endif + oappend(SET_F("addInfo('if:RST:pin',0,'', 'RST');")); + oappend(SET_F("xOpt('if:RST:pin',1,' ⍼',")); oappendi(HW_PIN_RSTSPI); oappend(");"); + oappend(SET_F("dRO('if:RST:pin',1);")); // disable read only pins + #ifdef HW_PIN_RSTSPI + oappend(SET_F("xOpt('if:RST:pin',1,' ⎌',")); oappendi(HW_PIN_RSTSPI); oappend(");"); + #endif #endif } else { From 742d8a23b18c685bb4fa6225f0163e6f2a21754f Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:15:41 -0500 Subject: [PATCH 50/72] @TroyHacks to @softhack007: This is just to make my builds go green with your new code. :) --- platformio.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platformio.ini b/platformio.ini index 25c4338e4e..684601cd97 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1195,6 +1195,9 @@ AR_build_flags = -D USERMOD_AUDIOREACTIVE -D UM_AUDIOREACTIVE_USE_NEW_FFT ;; WLE AR_lib_deps = https://github.com/softhack007/arduinoFFT.git#develop @ 1.9.2 ;; used for USERMOD_AUDIOREACTIVE - optimized version, 10% faster on -S2/-C3 animartrix_build_flags = -D USERMOD_ANIMARTRIX ;; WLEDMM usermod: CC BY-NC 3.0 licensed effects by Stefan Petrick + -fexceptions ; Enable (needed for try/catch) + -fno-rtti ; Keep disabled (not needed, saves memory) + ;; @TroyHacks to @softhack007: This is just to make my builds go green with your new code. :) animartrix_lib_deps = https://github.com/netmindz/animartrix.git#af02653aaabdce08929389ca16d0d86071573dd4 ;; custom PSRAM allocator animartrix_lib_ignore = animartrix ;; to remove the animartrix lib dependancy (saves a few bytes) From b44a4608f8d2e44b8d7e3db70e7ef66e78ff89e3 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:33:41 -0500 Subject: [PATCH 51/72] Removed -fno-rtti from animartrix_build_flags which is just a temp hack to stop my builds from failing. --- platformio.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 684601cd97..b6b9c18d3d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1196,7 +1196,6 @@ AR_lib_deps = https://github.com/softhack007/arduinoFFT.git#develop @ 1.9.2 animartrix_build_flags = -D USERMOD_ANIMARTRIX ;; WLEDMM usermod: CC BY-NC 3.0 licensed effects by Stefan Petrick -fexceptions ; Enable (needed for try/catch) - -fno-rtti ; Keep disabled (not needed, saves memory) ;; @TroyHacks to @softhack007: This is just to make my builds go green with your new code. :) animartrix_lib_deps = https://github.com/netmindz/animartrix.git#af02653aaabdce08929389ca16d0d86071573dd4 ;; custom PSRAM allocator animartrix_lib_ignore = animartrix ;; to remove the animartrix lib dependancy (saves a few bytes) From d3cad9bbba2d5be0abcf93d754c80205a9ef766a Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 18:05:40 -0500 Subject: [PATCH 52/72] Testing --- platformio.ini | 44 +++++++++++++++----------------------------- wled00/wled.h | 3 ++- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/platformio.ini b/platformio.ini index b6b9c18d3d..f85c27ec31 100644 --- a/platformio.ini +++ b/platformio.ini @@ -265,7 +265,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#3744ef20fdaa8d8c15597701fc3b5267757bee90 + https://github.com/troyhacks/ETHClass2.git#3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following @@ -425,11 +425,11 @@ platformV4_pre = espressif32@5.2.0 platformV4_packages_pre = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 ;;; standard V4 platform -platformV4 = espressif32@6.12.0 -platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) +platformV4 = espressif32@ ~6.3.2 +platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;;; experimental: latest V4 platform with latest arduino-esp32 2.0.14 + ESP-IDF 4.4.6 (may or may not work) -platformV4_xp = espressif32@6.12.0 +platformV4_xp = espressif32@ ~6.5.0 platformV4_packages_xp = platformio/framework-arduinoespressif32 @ 3.20014.231204 ;; arduino-esp32 2.0.14 build_flagsV4 = -g @@ -463,8 +463,8 @@ lib_depsV4 = ;; platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4. Warning: all kernel error asserts removed -platform = espressif32@6.12.0 ;; ${esp32.platformTasmota} -platform_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; ${esp32.platform_packagesTasmota} +platform = ${esp32.platformTasmota} +platform_packages = ${esp32.platform_packagesTasmota} build_unflags = ${common.build_unflags} build_flags = -g @@ -694,8 +694,6 @@ build_flags = ${common.build_flags} ${esp32_legacy.build_flags} -D WLED_RELEAS ;;-D WLED_ENABLE_FULL_FONTS ;; 10KB flash lib_deps = ${esp32_legacy.lib_deps} ${esp32.AR_lib_deps} -lib_ignore = ${esp32_legacy.lib_ignore} - ETHClass2 board_build.partitions = ${esp32_legacy.default_partitions} monitor_filters = esp32_exception_decoder ;; RAM: [== ] 23.2% (used 75944 bytes from 327680 bytes) @@ -1489,8 +1487,6 @@ build_flags = ${esp32_4MB_M_base.build_flags} -D WLED_DISABLE_INFRARED ;; Over the limit -D WLED_DISABLE_PARTICLESYSTEM1D ;; exceeds flash size limit -D WLED_DISABLE_PARTICLESYSTEM2D ;; exceeds flash size limit -lib_ignore = ${esp32_4MB_M_base.lib_ignore} - ETHClass2 ; RAM: [== ] 24.1% (used 78904 bytes from 327680 bytes) ; Flash: [==========] 98.5% (used 1548489 bytes from 1572864 bytes @@ -1867,8 +1863,8 @@ extends = env:esp32_4MB_V4_S_HUB75 [env:esp32_4MB_V4_M] extends = esp32_4MB_V4_M_base ;; needs tasmota framework; will exceed flash limits with default framework -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} +platform = ${esp32.platform} ;; "V4" tasmota +platform_packages = ${esp32.platform_packages} build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} -D WLED_RELEASE_NAME=esp32_4MB_V4_M -D WLED_WATCHDOG_TIMEOUT=0 #-D WLED_DISABLE_BROWNOUT_DET @@ -1880,7 +1876,6 @@ build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} lib_deps = ${esp32_4MB_V4_M_base.esp32_lib_deps} lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation - ETHClass2 ${common_mm.HUB75_lib_ignore} ;; over the flash size limit ;;${common_mm.animartrix_lib_ignore} build_unflags = ${esp32_4MB_V4_M_base.build_unflags} @@ -2559,8 +2554,8 @@ lib_ignore = ;; MM for esp32-s3 zero/supermini and lolin S3 mini boards - standard [env:esp32S3_4MB_PSRAM_M] extends = env:esp32S3_8MB_M -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} +platform = ${esp32s3.platform} +platform_packages = ${esp32s3.platform_packages} board = lolin_s3_mini ;; -S3 mini: 4MB flash 2MB PSRAM board_build.partitions = ${esp32.extended_partitions} ;; 1.65MB firmware, 700KB filesystem build_unflags = ${common.build_unflags} @@ -2599,7 +2594,6 @@ lib_ignore = ;; IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation ${common_mm.HUB75_lib_ignore} ${common_mm.DMXin_lib_ignore} - ETHClass2 ;; ${common_mm.animartrix_lib_ignore} ; RAM: [== ] 16.7% (used 54676 bytes from 327680 bytes) ; Flash: [======== ] 83.2% (used 1416997 bytes from 1703936 bytes) @@ -2674,8 +2668,8 @@ monitor_filters = esp32_exception_decoder [env:esp32s2_PSRAM_M] extends = esp32_4MB_V4_M_base ;; default tasmota platform -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} +platform = ${esp32s2.platform} +platform_packages = ${esp32s2.platform_packages} ;; standard espressif platform (optional) ;; platform = ${esp32.platformV4} ;; platform_packages = ${esp32.platformV4_packages} @@ -2723,7 +2717,6 @@ lib_deps = ${esp32s2.lib_deps} ${common_mm.lib_deps_S} ${common_mm.lib_deps_V4_M lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation OneWire ; not needed as we don't include USERMOD_DALLASTEMPERATURE - ETHClass2 ${common_mm.HUB75_lib_ignore} ${common_mm.DMXin_lib_ignore} monitor_filters = esp32_exception_decoder @@ -2732,8 +2725,6 @@ monitor_filters = esp32_exception_decoder [env:esp32s2_PSRAM_S] extends = env:esp32s2_PSRAM_M -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} board_build.partitions = ${esp32.default_partitions} ;; 1.55MB firmware, 1MB filesystem build_unflags = ${env:esp32s2_PSRAM_M.build_unflags} -DWLED_DISABLE_ADALIGHT @@ -2747,7 +2738,6 @@ build_flags = ${env:esp32s2_PSRAM_M.build_flags} -D WLED_RELEASE_NAME=esp32s2_4MB_S lib_deps = ${env:esp32s2_PSRAM_M.lib_deps} lib_ignore = ${env:esp32s2_PSRAM_M.lib_ignore} - ETHClass2 U8g2 ${common_mm.animartrix_lib_ignore} ; RAM: [== ] 18.1% (used 59176 bytes from 327680 bytes) @@ -2838,8 +2828,6 @@ build_flags = ${env:esp32c3dev_4MB_M.build_flags} [env:esp32c3dev_2MB_M] extends = env:esp32c3dev_4MB_M -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} board = lolin_c3_mini ;;; replace WLED_RELEASE_NAME, disable CDC_ON_BOOT build_unflags = ${env:esp32c3dev_4MB_M.build_unflags} @@ -2852,8 +2840,7 @@ board_build.partitions = tools/WLED_ESP32_2MB_noOTA.csv board_build.flash_mode = dio board_upload.flash_size = 2MB board_upload.maximum_size = 2097152 -lib_ignore = ${env:esp32c3dev_4MB_M.lib_ignore} - ETHClass2 + build_flags = ${env:esp32c3dev_4MB_M.build_flags} -D WLED_WATCHDOG_TIMEOUT=0 -D WLED_DISABLE_OTA @@ -3093,8 +3080,8 @@ lib_ignore = ${esp32_4MB_M_base.lib_ignore} ;; "V4" build environment (tasmota core) [env:athom_music_esp32_4MB_V4_M] extends = esp32_4MB_V4_M_base -platform = ${esp32.platformTasmota} -platform_packages = ${esp32.platform_packagesTasmota} +platform = ${esp32.platform} ;; "V4" tasmota +platform_packages = ${esp32.platform_packages} build_unflags = ${esp32_4MB_V4_M_base.build_unflags} ;; ${common_mm.build_disable_sync_interfaces} ${common_mm.animartrix_build_flags} ;; exceeds flash limits, no pins for HUB75 ; -D USERMOD_ARTIFX ;; disabled to save some program space in flash @@ -3129,7 +3116,6 @@ build_flags = ${esp32_4MB_V4_M_base.esp32_build_flags} lib_deps = ${esp32_4MB_V4_M_base.esp32_lib_deps} lib_ignore = ${common_mm.DMXin_lib_ignore} - ETHClass2 ; RAM: [== ] 24.0% (used 78568 bytes from 327680 bytes) ; Flash: [======== ] 82.3% (used 1402341 bytes from 1703936 bytes) diff --git a/wled00/wled.h b/wled00/wled.h index e4ad9e3555..ed3f481e6b 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -114,7 +114,8 @@ #include #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) #include "ETHClass2.h" - #else + #warning Using the new ETHClass2 for this build as W5500 is available. + #else #include #endif #include "esp_wifi.h" From 3fbc4d1afd45f2da8daa7e38e4310ef01ff16f5b Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 18:39:16 -0500 Subject: [PATCH 53/72] Testing --- platformio.ini | 2 +- wled00/wled.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index f85c27ec31..24794c5fc0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -265,7 +265,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 + https://github.com/troyhacks/ETHClass2.git#7ee9aea1b7434a334034683a69f960550e39553b ;; 3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following diff --git a/wled00/wled.h b/wled00/wled.h index ed3f481e6b..3d19c4087c 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -112,7 +112,8 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) && !defined(ETHCLASS_WARNING_DONE) + #define ETHCLASS_WARNING_DONE #include "ETHClass2.h" #warning Using the new ETHClass2 for this build as W5500 is available. #else From d9ffac60fe3b0aa591b2f953b9f91ec2dc224e0b Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:00:16 -0500 Subject: [PATCH 54/72] Testing with fixes --- platformio.ini | 2 +- wled00/wled.h | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 24794c5fc0..0f60b159ea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -265,7 +265,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#7ee9aea1b7434a334034683a69f960550e39553b ;; 3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 + https://github.com/troyhacks/ETHClass2.git#e61e6b0bd0976e345d58b55649953df69301cd6a ;; 7ee9aea1b7434a334034683a69f960550e39553b ;; 3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following diff --git a/wled00/wled.h b/wled00/wled.h index 3d19c4087c..6d08dec680 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -112,10 +112,8 @@ #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include - #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) && !defined(ETHCLASS_WARNING_DONE) - #define ETHCLASS_WARNING_DONE + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) #include "ETHClass2.h" - #warning Using the new ETHClass2 for this build as W5500 is available. #else #include #endif From fdd1217244c9bc0e8aed985527658deca716c2cb Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:36:00 -0500 Subject: [PATCH 55/72] External ETHClass2 fixes to enable ETH_PHY_IP101 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 0f60b159ea..53696aab6d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -265,7 +265,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#e61e6b0bd0976e345d58b55649953df69301cd6a ;; 7ee9aea1b7434a334034683a69f960550e39553b ;; 3699df3dd4be27eeeeac098ea0fb1c9d6e1a2345 ;; 3744ef20fdaa8d8c15597701fc3b5267757bee90 + https://github.com/troyhacks/ETHClass2.git#efcbb58c6bdfcf057ec8f36f1704f34bcd722a81 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following From f4e17cbdd98a262ec22b7229a278329dc64d3c8c Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:19:44 -0500 Subject: [PATCH 56/72] Testing v4.4.7 Tasmota and v4.4.7 regular libs --- platformio.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 53696aab6d..e8d43acec8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -265,7 +265,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#efcbb58c6bdfcf057ec8f36f1704f34bcd722a81 + https://github.com/troyhacks/ETHClass2.git#3be52a82595a96bd923df27f1ef9faada3ed4513 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following @@ -416,7 +416,7 @@ board_build.flash_mode = dio ;; WLEDMM begin ;; tasmota platform - reduces firmaware size by ~280KB -platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.02/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4 +platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2024.04.00/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4 platform_packagesTasmota = ;; ** For compiling with latest Frameworks (IDF4.4.x and arduino-esp32 v2.0.x) ** @@ -425,8 +425,8 @@ platformV4_pre = espressif32@5.2.0 platformV4_packages_pre = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 ;;; standard V4 platform -platformV4 = espressif32@ ~6.3.2 -platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) +platformV4 = espressif32@ ~6.12.0 +platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;;; experimental: latest V4 platform with latest arduino-esp32 2.0.14 + ESP-IDF 4.4.6 (may or may not work) platformV4_xp = espressif32@ ~6.5.0 From 85a699297b5edd1fa3f81030b54f892d4d68cf3d Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:24:49 -0500 Subject: [PATCH 57/72] Guard for CONFIG_ETH_SPI_ETHERNET_W5500 --- wled00/wled.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/wled.h b/wled00/wled.h index 6d08dec680..648de53c43 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -361,7 +361,7 @@ WLED_GLOBAL int8_t irPin _INIT(IRPIN); //WLED_GLOBAL byte presetToApply _INIT(0); #ifndef ESP8266 - #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) + #if defined(CONFIG_ETH_SPI_ETHERNET_W5500) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 5) WLED_GLOBAL ETHClass2 ETH; #endif #endif From 7ada26bc17cefb1c1b716940595c0ac81cfa03cf Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:33:31 -0500 Subject: [PATCH 58/72] Quiet down HUB75 build output for testing --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index e8d43acec8..d845121d97 100644 --- a/platformio.ini +++ b/platformio.ini @@ -185,7 +185,6 @@ debug_flags = -D DEBUG=1 -D WLED_DEBUG # ------------------------------------------------------------------------------ build_flags = -Wno-attributes - -Wno-parentheses -DMQTT_MAX_PACKET_SIZE=1024 -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL -DBEARSSL_SSL_BASIC @@ -1203,6 +1202,8 @@ DMXin_lib_deps = https://github.com/someweisguy/esp_dmx.git#47db25d8c515e76fabcf DMXin_lib_ignore = esp_dmx ;; to remove the esp-dmx lib dependancy (saves a few bytes) HUB75_build_flags = + -Wno-shadow // Shush, you. + -Wno-parentheses // Shush, you. -D WLED_ENABLE_HUB75MATRIX ;; - requires ESP-IDF v4.4.x ;-D SPIRAM_FRAMEBUFFER ;; ONLY SUPPORTED ON ESP32-S3 VARIANTS WITH OCTAL (not quad) SPIRAM/PSRAM -D NO_GFX ;; Disable the use of Adafruit_GFX by the HUB75 driver From 3ee6d3496214acc0cc3e18f3a2635fa03cb49cb3 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:38:33 -0500 Subject: [PATCH 59/72] Fixes --- platformio.ini | 4 ++-- wled00/wled.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index d845121d97..5de35bfe54 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1202,8 +1202,8 @@ DMXin_lib_deps = https://github.com/someweisguy/esp_dmx.git#47db25d8c515e76fabcf DMXin_lib_ignore = esp_dmx ;; to remove the esp-dmx lib dependancy (saves a few bytes) HUB75_build_flags = - -Wno-shadow // Shush, you. - -Wno-parentheses // Shush, you. + -Wno-shadow ;; Shush, you. + -Wno-parentheses ;; Shush, you. -D WLED_ENABLE_HUB75MATRIX ;; - requires ESP-IDF v4.4.x ;-D SPIRAM_FRAMEBUFFER ;; ONLY SUPPORTED ON ESP32-S3 VARIANTS WITH OCTAL (not quad) SPIRAM/PSRAM -D NO_GFX ;; Disable the use of Adafruit_GFX by the HUB75 driver diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 2c016f2cec..a775fffbe1 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1015,6 +1015,7 @@ bool WLED::initEthernet() ethernet_settings es = {}; #ifdef CONFIG_ETH_SPI_ETHERNET_W5500 + #pragma message "ETHClass2 in use?" if (!spi_use_for_w5500 || ethernetType > 0) { #endif From 13e823d7204866f2a94da6135443a0b2d3ba220a Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 12:50:03 -0500 Subject: [PATCH 60/72] More testing --- platformio.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 5de35bfe54..804871389b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -264,7 +264,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#3be52a82595a96bd923df27f1ef9faada3ed4513 + https://github.com/troyhacks/ETHClass2.git#227ed2048e232a8a373ee345e22514626a159e0a #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following @@ -467,7 +467,8 @@ platform_packages = ${esp32.platform_packagesTasmota} build_unflags = ${common.build_unflags} build_flags = -g - -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one + ; -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one + -Wno-shadow ;; quiet, HUB75 -DARDUINO_ARCH_ESP32 -DESP32 #-DCONFIG_LITTLEFS_FOR_IDF_3_2 -D CONFIG_ASYNC_TCP_USE_WDT=0 From d3dbec7308a0317eb484dbd85af21e34dc5e43a7 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:05:04 -0500 Subject: [PATCH 61/72] What happens if all boards have Ethernet enabled and PSRAM? Testing! --- platformio.ini | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 804871389b..59b98a9ac8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -441,7 +441,8 @@ build_flagsV4 = -g ; -D WLEDMM_SLOWPATH ;; don't use I2S for LED bus ; -DARDUINO_USB_CDC_ON_BOOT=0 ;; mandatory for "classic ESP32" when building with arduino-esp32 >=2.0.3 -D NO_GFX ; Disable the use of Adafruit_GFX by the HUB75 driver - + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET ;;; V4.4.x libraries (without LOROL_LITTLEFS; with newer NeoPixelBus) lib_depsV4 = esp32async/AsyncTCP @ 3.4.7 @@ -467,8 +468,9 @@ platform_packages = ${esp32.platform_packagesTasmota} build_unflags = ${common.build_unflags} build_flags = -g - ; -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one - -Wno-shadow ;; quiet, HUB75 + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET + -Wshadow=compatible-local ;; emit warning in case a local variable "shadows" another local one -DARDUINO_ARCH_ESP32 -DESP32 #-DCONFIG_LITTLEFS_FOR_IDF_3_2 -D CONFIG_ASYNC_TCP_USE_WDT=0 From 042735e83750b21b021c06dbe092cc83823eede8 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:15:13 -0500 Subject: [PATCH 62/72] Testing minimal required versiona --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 59b98a9ac8..0af6170f10 100644 --- a/platformio.ini +++ b/platformio.ini @@ -424,8 +424,8 @@ platformV4_pre = espressif32@5.2.0 platformV4_packages_pre = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 ;;; standard V4 platform -platformV4 = espressif32@ ~6.12.0 -platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) +platformV4 = espressif32@ ~6.3.2 +platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20011.230801b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;;; experimental: latest V4 platform with latest arduino-esp32 2.0.14 + ESP-IDF 4.4.6 (may or may not work) platformV4_xp = espressif32@ ~6.5.0 @@ -462,7 +462,7 @@ lib_depsV4 = ;; platform = espressif32@ ~6.3.2 ;; platform_packages = platformio/framework-arduinoespressif32 @ 3.20009.0 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) -;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4. Warning: all kernel error asserts removed +;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.7. Warning: all kernel error asserts removed platform = ${esp32.platformTasmota} platform_packages = ${esp32.platform_packagesTasmota} From 374c9e53cc0468279829ddeb406ac350349db15f Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:17:34 -0500 Subject: [PATCH 63/72] Typo --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 0af6170f10..f08e691aab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -425,7 +425,7 @@ platformV4_packages_pre = toolchain-riscv32-esp @ 8.4.0+2021r2-patch5 ; required for platform version < 5.3.0, remove this line when upgrading to platform >=5.3.0 ;;; standard V4 platform platformV4 = espressif32@ ~6.3.2 -platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20011.230801b ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) +platformV4_packages = platformio/framework-arduinoespressif32 @ 3.20011.230801 ;; select arduino-esp32 v2.0.9 (arduino-esp32 2.0.10 thru 2.0.14 are buggy so avoid them) ;;; experimental: latest V4 platform with latest arduino-esp32 2.0.14 + ESP-IDF 4.4.6 (may or may not work) platformV4_xp = espressif32@ ~6.5.0 From e968e14cafbcccd920a9ccdd528e64182d926335 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:19:29 -0500 Subject: [PATCH 64/72] Trying the lowest required Tasmota --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index f08e691aab..592921f632 100644 --- a/platformio.ini +++ b/platformio.ini @@ -415,7 +415,7 @@ board_build.flash_mode = dio ;; WLEDMM begin ;; tasmota platform - reduces firmaware size by ~280KB -platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2024.04.00/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.9 with IPv6 support, based on IDF 4.4.4 +platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.10 with IPv6 support, based on IDF 4.4.4 platform_packagesTasmota = ;; ** For compiling with latest Frameworks (IDF4.4.x and arduino-esp32 v2.0.x) ** From 33124b9dff0bd3c8c889d20ee189ab197b4389f9 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:21:09 -0500 Subject: [PATCH 65/72] Testing a bold hack. --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 592921f632..ac48eff027 100644 --- a/platformio.ini +++ b/platformio.ini @@ -443,6 +443,7 @@ build_flagsV4 = -g -D NO_GFX ; Disable the use of Adafruit_GFX by the HUB75 driver -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET + -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. ;;; V4.4.x libraries (without LOROL_LITTLEFS; with newer NeoPixelBus) lib_depsV4 = esp32async/AsyncTCP @ 3.4.7 From 0a5b8b377cc5857719e75c686cd87daaf059f6f7 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:26:29 -0500 Subject: [PATCH 66/72] Moving Tasmota up to the latest 4.4.7 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index ac48eff027..1ca5b7973a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -415,7 +415,7 @@ board_build.flash_mode = dio ;; WLEDMM begin ;; tasmota platform - reduces firmaware size by ~280KB -platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.10 with IPv6 support, based on IDF 4.4.4 +platformTasmota = https://github.com/tasmota/platform-espressif32/releases/download/2024.04.00/platform-espressif32.zip ;; Tasmota Arduino Core 2.0.15 with IPv6 support, based on IDF 4.4.4 platform_packagesTasmota = ;; ** For compiling with latest Frameworks (IDF4.4.x and arduino-esp32 v2.0.x) ** From a920eed1a7029662a88856eed61aec5241fd35be Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:31:37 -0500 Subject: [PATCH 67/72] Even bolder --- .vscode/extensions.json | 3 +-- platformio.ini | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 080e70d08b..8057bc70a7 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,6 @@ { - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format "recommendations": [ + "pioarduino.pioarduino-ide", "platformio.platformio-ide" ], "unwantedRecommendations": [ diff --git a/platformio.ini b/platformio.ini index 1ca5b7973a..78ccbc06b6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -480,6 +480,9 @@ build_flags = -g -DARDUINO_USB_CDC_ON_BOOT=0 ;; this flag is mandatory for "classic ESP32" when building with arduino-esp32 >=2.0.3 ; -D WLEDMM_TWOPATH ;; use I2S1 as the second bus --> slightly faster on some setups ; -D WLEDMM_SLOWPATH ;; don't use I2S for LED bus + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET + -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv lib_deps = esp32async/AsyncTCP @ 3.4.7 @@ -518,7 +521,9 @@ build_flags = -g ;; please make sure that the following flags are properly set (to 0 or 1) by your board.json, or included in your custom platformio_override.ini entry: ;; ARDUINO_USB_CDC_ON_BOOT ; -D WLED_USE_SHARED_RMT ;; un-comment to use the standard RMT driver instead of RMTHI - + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET + -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental - reduces LED glitches on -S2 @@ -545,7 +550,9 @@ build_flags = -g ;; please make sure that the following flags are properly set (to 0 or 1) by your board.json, or included in your custom platformio_override.ini entry: ;; ARDUINO_USB_CDC_ON_BOOT -D WLED_USE_SHARED_RMT ;; don't use the RMTHI driver (not compatible with -C3) - + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET + -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental @@ -576,6 +583,9 @@ build_flags = -g ;; please make sure that the following flags are properly set (to 0 or 1) by your board.json, or included in your custom platformio_override.ini entry: ;; ARDUINO_USB_MODE, ARDUINO_USB_CDC_ON_BOOT ;-D WLED_USE_SHARED_RMT ;; un-comment to use the standard RMT driver instead of RMTHI + -D BOARD_HAS_PSRAM + -D WLED_USE_ETHERNET + -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental From 350119214da5814fca786807d3643db08ef89c67 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:38:32 -0500 Subject: [PATCH 68/72] Less forcing W5500 support suggestion --- platformio.ini | 5 ----- 1 file changed, 5 deletions(-) diff --git a/platformio.ini b/platformio.ini index 78ccbc06b6..04d5067d50 100644 --- a/platformio.ini +++ b/platformio.ini @@ -443,7 +443,6 @@ build_flagsV4 = -g -D NO_GFX ; Disable the use of Adafruit_GFX by the HUB75 driver -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET - -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. ;;; V4.4.x libraries (without LOROL_LITTLEFS; with newer NeoPixelBus) lib_depsV4 = esp32async/AsyncTCP @ 3.4.7 @@ -482,7 +481,6 @@ build_flags = -g ; -D WLEDMM_SLOWPATH ;; don't use I2S for LED bus -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET - -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv lib_deps = esp32async/AsyncTCP @ 3.4.7 @@ -523,7 +521,6 @@ build_flags = -g ; -D WLED_USE_SHARED_RMT ;; un-comment to use the standard RMT driver instead of RMTHI -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET - -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental - reduces LED glitches on -S2 @@ -552,7 +549,6 @@ build_flags = -g -D WLED_USE_SHARED_RMT ;; don't use the RMTHI driver (not compatible with -C3) -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET - -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental @@ -585,7 +581,6 @@ build_flags = -g ;-D WLED_USE_SHARED_RMT ;; un-comment to use the standard RMT driver instead of RMTHI -D BOARD_HAS_PSRAM -D WLED_USE_ETHERNET - -D CONFIG_ETH_SPI_ETHERNET_W5500 ;; this is a bold move. lib_deps = esp32async/AsyncTCP @ 3.4.7 makuna/NeoPixelBus @ 2.7.9 ;; experimental From 040c1a59b416f1a1308feaa1100e2af3d88a3adb Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 13:42:40 -0500 Subject: [PATCH 69/72] W5500 Support message --- wled00/network.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wled00/network.cpp b/wled00/network.cpp index 84f6dcf73e..101bb22647 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -5,6 +5,9 @@ #ifdef WLED_USE_ETHERNET #pragma message "Ethernet support enabled" +#ifdef CONFIG_ETH_SPI_ETHERNET_W5500 +#pragma message "W5500 support should be enabled" +#endif // The following six pins are neither configurable nor // can they be re-assigned through IOMUX / GPIO matrix. From 37620e4b4d9da82ac370a5ad89fb3b33d53c37bf Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:12:34 -0500 Subject: [PATCH 70/72] Testing --- platformio.ini | 2 +- wled00/wled_ethernet.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 04d5067d50..21e077707b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -264,7 +264,7 @@ lib_deps = https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 bitbank2/AnimatedGIF@^1.4.7 https://github.com/Aircoookie/GifDecoder.git#bc3af189b6b1e06946569f6b4287f0b79a860f8e - https://github.com/troyhacks/ETHClass2.git#227ed2048e232a8a373ee345e22514626a159e0a + https://github.com/troyhacks/ETHClass2.git#a260165ec495738f7fecee3a3bfb573f2a281ed7 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 9e00b798fe..51b5f663cb 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -62,7 +62,7 @@ typedef struct EthernetSettings { int eth_clk_mode; } ethernet_settings; #define WLED_ETH_RSVD_PINS_COUNT 0 -extern managed_pin_type esp32_nonconfigurable_ethernet_pins[]; +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[] = {}; #endif extern const ethernet_settings ethernetBoards[]; From d736a74bcf8923d1b114b9fc3880b9b84c3d8c27 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:22:02 -0500 Subject: [PATCH 71/72] Fixes for esp32_nonconfigurable_ethernet_pins --- wled00/network.cpp | 2 ++ wled00/wled_ethernet.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index 101bb22647..20745b4a15 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -22,6 +22,8 @@ managed_pin_type esp32_nonconfigurable_ethernet_pins[6] = { { 26, false }, // RMII EMAC RXD1 == Second bit of received data { 27, true }, // RMII EMAC CRS_DV == Carrier Sense and RX Data Valid }; +#else +managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT] = {}; #endif #ifndef CONFIG_ETH_SPI_ETHERNET_W5500 diff --git a/wled00/wled_ethernet.h b/wled00/wled_ethernet.h index 51b5f663cb..e09cdf4f8a 100644 --- a/wled00/wled_ethernet.h +++ b/wled00/wled_ethernet.h @@ -62,7 +62,7 @@ typedef struct EthernetSettings { int eth_clk_mode; } ethernet_settings; #define WLED_ETH_RSVD_PINS_COUNT 0 -extern managed_pin_type esp32_nonconfigurable_ethernet_pins[] = {}; +extern managed_pin_type esp32_nonconfigurable_ethernet_pins[WLED_ETH_RSVD_PINS_COUNT]; #endif extern const ethernet_settings ethernetBoards[]; From 813a735f6a3f7d92fd02324a7543cf0aaaa08ba0 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:33:45 -0500 Subject: [PATCH 72/72] Fixes for boards without RMII --- wled00/wled.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index a775fffbe1..ce6fe24bfb 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1172,6 +1172,7 @@ bool WLED::initEthernet() #endif } #else + #ifdef CONFIG_ETH_PHY_INTERFACE_RMII // Ethernet initialization should only succeed once -- else reboot required managed_pin_type pinsToAllocate[10] = { // first six pins are non-configurable @@ -1210,7 +1211,7 @@ bool WLED::initEthernet() DEBUG_PRINTLN(F("initE: Failed to allocate ethernet pins")); return false; } - + if (!ETH.begin( (uint8_t)es.eth_address, (int)es.eth_power, @@ -1226,6 +1227,9 @@ bool WLED::initEthernet() } return false; } + #else + return false; + #endif #endif successfullyConfiguredEthernet = true; USER_PRINTLN(F("initC: *** Ethernet successfully configured! ***")); // WLEDMM