wirestudio 0.26.0__tar.gz → 0.26.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wirestudio-0.26.0/wirestudio.egg-info → wirestudio-0.26.2}/PKG-INFO +1 -1
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_fleet.py +37 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/__init__.py +1 -1
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/app.py +7 -3
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/fleet/client.py +42 -23
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/yaml_gen.py +8 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2/wirestudio.egg-info}/PKG-INFO +1 -1
- {wirestudio-0.26.0 → wirestudio-0.26.2}/LICENSE +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/README.md +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/pyproject.toml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/setup.cfg +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_active_design.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_agent.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_agent_stream.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_api.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_api_route.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_ascii_gen.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_build_backend.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_chirpstack.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_circuitpython.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_codec.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_compatibility.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_compile.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_coverage_baseline.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_design_events.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_designs.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_designs_seed.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure_gate.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure_search.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_firmware_gen.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_footprints.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_intent.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_inventory.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_jlcpcb.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_fab.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_import.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_pcb.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_render.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_route.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_library_rtttl.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_lorawan.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_lorawan_api.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_auth.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_resources.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_server.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_meshtastic.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_modules.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_pin_solver.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_recommend.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_schema.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_schematics_gate.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_security_cors.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_seed_onboard.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_serve.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_strict.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_targets.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tasmota.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tools_add_bus.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tools_solve_pins.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_validate.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_workbench.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_workbench_provision.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_yaml_gen.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/agent.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/session.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/tools.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/__main__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/circuitpython.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/meshtastic.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/schemas.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/serve.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/workbench.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/compatibility.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/pin_solver.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/active.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/events.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/seed.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/store.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/openscad.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/search.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/analog-node.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-echo.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-lite.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-matrix.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-lcd.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-lite.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-onboard.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atomu-onboard.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atomu.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/attic-logger.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/awning-control.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bl0906-mainmeter.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/blind-stepper.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bluemotion.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bluesonoff.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/button-toggles-light.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/c3-supermini.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/c6-supermini.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/desk-climate.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/desk-matrix.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/distance-sensor.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/encoder-drives-stepper.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32-audio.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32cam-wrover.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32cam.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/flow-meter.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/garage-motion.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/grill-probe.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/guarded-button-light.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/keypad.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/kitchen-scale.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/led-display.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/lorawan-battery-uplink.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/motion-turns-on-light.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/multi-temp.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/nextion-thermostat.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/oled-knob.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/oled.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/parking-distance.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/presence-rf.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/rc522.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/room-climate.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/rs485-energy.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/s3-devkitc.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/s3-supermini.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/securitypanel.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/smart-plug-v1.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/smart-plug.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/solder-fan.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/subghz-rfid.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/t-beam.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/temp-above-turns-on-fan.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/temp-turns-on-fan.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/tft-touch.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/ttgo-lora32.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/tuya-smart-plug.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/wasserpir.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/weather-station.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/wemosgps.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/xiao-grove-climate.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/fleet/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/__main__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/ascii_gen.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/intent.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/check.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/csv_io.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/store.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/__main__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/check.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/client.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/fab.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/generator.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/import.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/importer.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/netlist.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/pcb.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/pcbnew_bridge.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/render.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/route.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/symbol_parser.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp01_1m.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c3-devkitm-1.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c3-supermini.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c6-supermini.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-devkitc-v4.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-s3-devkitc-1.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-s3-supermini.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-wrover-cam.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32cam-ai-thinker.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp8285-1m.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v2.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v3.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v4.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom-echo.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom-matrix.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atoms3-lite.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atoms3.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atomu.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/nodemcu-32s.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/nodemcu-v2.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/seeed-xiao-esp32c3.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-lora32-v1.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-lora32-v2.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-t-beam.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/wemos-d1-mini.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/adc.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ads1115.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ads1115_channel.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/aht10.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/apa102.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/axp192.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/battery_adc.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bh1750.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bl0906.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bme280.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bmp180.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bmp280.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/cc1101.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/cse7766.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/dht.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ds18b20.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/esp32_camera.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/esp32_rmt_led_strip.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/gpio_input.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/gpio_output.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/grove-aht20.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hc-sr04.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hc-sr501.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hlw8012.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/htu21d.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hx711.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/i2s_microphone.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ili9xxx.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/lcd_pcf8574.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ld2420.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max31855.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max7219.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max98357a.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mcp23008.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mcp23017.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/modbus.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mpu6050.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mpu6886.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/nextion.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pcf8574.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/potentiometer.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pulse_counter.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pwm_fan.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rc522.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rcwl-0516.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rdm6300.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/remote_transmitter.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rf_bridge.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rotary_encoder.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rtttl.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sdm_meter.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sht3xd.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ssd1306.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/st7789.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sx127x.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tm1638.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tsl2561.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya_sensor.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya_switch.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/uart_gps.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/uln2003.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/vl53l0x.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ws2812b.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/xpt2046.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/env-display.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/fan-controller.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/motion-light.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/oled-knob-13.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/relay-4ch.yaml +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/auth.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/server.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/model.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/recommend/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/recommend/recommender.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/schema/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/schema/design.schema.json +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/seed.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/base.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/build_backend.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/esphome.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/__main__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/api.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/build_local.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/chirpstack.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/codec.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/compile.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/firmware_gen.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/templates/main.cpp.j2 +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/templates/platformio.ini.j2 +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/workbench_provision.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/tasmota.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/validate.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/__init__.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/client.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/serial.py +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/SOURCES.txt +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/dependency_links.txt +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/entry_points.txt +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/requires.txt +0 -0
- {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/top_level.txt +0 -0
|
@@ -753,3 +753,40 @@ async def test_fleet_push_lorawan_secrets_no_op_for_non_lorawan_designs(
|
|
|
753
753
|
# The pushed YAML has no lorawan block at all; the secrets are ignored.
|
|
754
754
|
assert "lorawan:" not in pushed
|
|
755
755
|
assert "dev_eui" not in pushed
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
async def test_get_firmware_resolves_a_run_id_to_its_job_id():
|
|
759
|
+
"""The addon keys artifacts by job_id, while the push response, the
|
|
760
|
+
status poll and the studio's own route are all keyed by run_id. Passing
|
|
761
|
+
the run_id straight through 404s, which reads as "the build produced
|
|
762
|
+
nothing" rather than "wrong key" -- a compile that actually succeeded
|
|
763
|
+
looks broken."""
|
|
764
|
+
addon = FakeFleetAddon()
|
|
765
|
+
addon.queue_jobs = [{
|
|
766
|
+
"id": "job-abc", "run_id": "run-1", "state": "success",
|
|
767
|
+
"target": "dev.yaml", "finished_at": "2026-08-01T00:00:00Z",
|
|
768
|
+
}]
|
|
769
|
+
# Stored under the job id, as the real addon does.
|
|
770
|
+
addon.firmware["job-abc"] = {"app": b"FAKE-APP-IMAGE", "factory": None}
|
|
771
|
+
fc = addon.make_client()
|
|
772
|
+
assert await fc.get_firmware("run-1") == b"FAKE-APP-IMAGE"
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
async def test_get_firmware_still_accepts_a_job_id_directly():
|
|
776
|
+
addon = FakeFleetAddon()
|
|
777
|
+
addon.firmware["job-abc"] = {"app": b"DIRECT", "factory": None}
|
|
778
|
+
fc = addon.make_client()
|
|
779
|
+
assert await fc.get_firmware("job-abc") == b"DIRECT"
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
async def test_get_firmware_reports_the_jobs_it_tried():
|
|
783
|
+
"""A genuinely missing artifact should say the run's jobs were checked,
|
|
784
|
+
so the failure is distinguishable from the key mix-up above."""
|
|
785
|
+
addon = FakeFleetAddon()
|
|
786
|
+
addon.queue_jobs = [{
|
|
787
|
+
"id": "job-abc", "run_id": "run-1", "state": "success",
|
|
788
|
+
"target": "dev.yaml", "finished_at": "2026-08-01T00:00:00Z",
|
|
789
|
+
}]
|
|
790
|
+
fc = addon.make_client()
|
|
791
|
+
with pytest.raises(FleetUnavailable, match="job"):
|
|
792
|
+
await fc.get_firmware("run-1")
|
|
@@ -1330,12 +1330,16 @@ def create_app(
|
|
|
1330
1330
|
``/lorawan/firmware/{cache_key}[/factory]`` so the WebSerial flow
|
|
1331
1331
|
on the external-component path can reuse ``lib/flash.ts`` unchanged.
|
|
1332
1332
|
|
|
1333
|
+
Takes a run_id, matching the push response and the status poll.
|
|
1334
|
+
The addon keys artifacts by job_id, so the client resolves the run
|
|
1335
|
+
to its jobs when the id isn't found directly; a job_id also works
|
|
1336
|
+
if you happen to have one.
|
|
1337
|
+
|
|
1333
1338
|
Returns 404 when the run hasn't finished, has aged out of the
|
|
1334
1339
|
addon's tracking, or the build didn't produce the requested image
|
|
1335
1340
|
type; 503 when fleet credentials are missing; 502 when the addon
|
|
1336
|
-
is reachable but the call failed
|
|
1337
|
-
|
|
1338
|
-
``docs/lorawan/fleet-firmware-flash.md``).
|
|
1341
|
+
is reachable but the call failed -- see
|
|
1342
|
+
``docs/lorawan/fleet-firmware-flash.md``.
|
|
1339
1343
|
"""
|
|
1340
1344
|
fc = make_fleet()
|
|
1341
1345
|
if not fc.is_configured():
|
|
@@ -291,40 +291,59 @@ class FleetClient:
|
|
|
291
291
|
) -> bytes:
|
|
292
292
|
"""Fetch the compiled firmware bytes for a finished build.
|
|
293
293
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
294
|
+
The addon stores artifacts at ``GET /ui/api/jobs/{job_id}/firmware``
|
|
295
|
+
keyed by **job_id**, while everything else in this flow -- the push
|
|
296
|
+
response, the status poll, the studio's own route -- is keyed by
|
|
297
|
+
run_id. Passing the run_id straight through 404s, which reads as
|
|
298
|
+
"the build produced nothing" rather than "wrong key", so a compile
|
|
299
|
+
that actually succeeded looks broken. Accepts either: tries the id
|
|
300
|
+
as given, then resolves the run's jobs and retries.
|
|
301
|
+
|
|
302
|
+
The browser never holds ``FLEET_TOKEN``; this is the studio-side
|
|
303
|
+
passthrough that fetches with the server token and re-streams the
|
|
304
|
+
bytes to the WebSerial flasher via the matching studio route.
|
|
301
305
|
|
|
302
306
|
``factory=False`` (default) fetches the app image (re-flash that
|
|
303
307
|
preserves NVS); ``factory=True`` fetches the merged factory image
|
|
304
308
|
for blank-board flashing at offset 0x0. 404 -> ``FleetUnavailable``
|
|
305
309
|
the same way ``get_job_log`` handles unknown run_ids, so the UI
|
|
306
310
|
can stop polling.
|
|
307
|
-
|
|
308
|
-
The upstream endpoint does not exist yet at the time of writing
|
|
309
|
-
(it's the scoped fleet half); calls will 502 via the matching
|
|
310
|
-
studio route until the addon ships it. That gates the dialog's
|
|
311
|
-
"Flash via WebSerial" button on the upstream rollout without
|
|
312
|
-
changing this client surface later.
|
|
313
311
|
"""
|
|
314
312
|
if not self.is_configured():
|
|
315
313
|
raise FleetUnavailable("FLEET_URL or FLEET_TOKEN missing")
|
|
316
314
|
suffix = "/factory" if factory else ""
|
|
315
|
+
|
|
316
|
+
async def _fetch(c: httpx.AsyncClient, ident: str) -> Optional[bytes]:
|
|
317
|
+
resp = await c.get(f"/ui/api/jobs/{ident}/firmware{suffix}")
|
|
318
|
+
if resp.status_code == 404:
|
|
319
|
+
return None
|
|
320
|
+
if resp.status_code >= 400:
|
|
321
|
+
raise FleetUnavailable(
|
|
322
|
+
f"firmware fetch failed: http {resp.status_code} {resp.text}"
|
|
323
|
+
)
|
|
324
|
+
return resp.content
|
|
325
|
+
|
|
317
326
|
async with self._client() as c:
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
327
|
+
content = await _fetch(c, run_id)
|
|
328
|
+
if content is not None:
|
|
329
|
+
return content
|
|
330
|
+
|
|
331
|
+
# Not found under that id. If it was a run_id, the artifact lives
|
|
332
|
+
# under one of its jobs.
|
|
333
|
+
try:
|
|
334
|
+
jobs = (await self.get_run_status(run_id)).jobs
|
|
335
|
+
except FleetUnavailable:
|
|
336
|
+
jobs = []
|
|
337
|
+
async with self._client() as c:
|
|
338
|
+
for job in jobs:
|
|
339
|
+
content = await _fetch(c, job.job_id)
|
|
340
|
+
if content is not None:
|
|
341
|
+
return content
|
|
342
|
+
|
|
343
|
+
raise FleetUnavailable(
|
|
344
|
+
f"firmware artifact not available for {run_id!r}"
|
|
345
|
+
+ (f" or its {len(jobs)} job(s)" if jobs else "")
|
|
346
|
+
)
|
|
328
347
|
|
|
329
348
|
# ------------------------------------------------------------------
|
|
330
349
|
# Internals
|
|
@@ -504,6 +504,14 @@ def build_yaml_dict(
|
|
|
504
504
|
chip_block["framework"] = {"type": design.board.framework}
|
|
505
505
|
if board.chip_variant != "esp32":
|
|
506
506
|
chip_block["variant"] = board.chip_variant.upper()
|
|
507
|
+
# ESPHome defaults to 4 MB regardless of the PlatformIO board, so a
|
|
508
|
+
# 16 MB board silently gets a 4 MB partition table -- three quarters
|
|
509
|
+
# of the flash unused and OTA slots smaller than the chip allows.
|
|
510
|
+
# Nothing errors, which is why it goes unnoticed. Under-declaring is
|
|
511
|
+
# the safe direction (over-declaring boot-loops the bootloader on a
|
|
512
|
+
# size mismatch), so emit what the board file says.
|
|
513
|
+
if board.flash_size_mb:
|
|
514
|
+
chip_block["flash_size"] = f"{board.flash_size_mb}MB"
|
|
507
515
|
out["esp32"] = chip_block
|
|
508
516
|
else:
|
|
509
517
|
out[board.chip_variant] = chip_block
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|