@microbit/microbit-connection 0.9.0-apps.alpha.16 → 0.9.0-apps.alpha.17
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.
- package/build/{esm/bluetooth.d.ts → cjs/bluetooth/connection.d.ts} +30 -26
- package/build/cjs/{bluetooth.js → bluetooth/connection.js} +147 -104
- package/build/cjs/bluetooth/connection.js.map +1 -0
- package/build/cjs/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
- package/build/cjs/bluetooth/connection.test.js.map +1 -0
- package/build/cjs/bluetooth/device-bond-state.js.map +1 -0
- package/build/cjs/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
- package/build/cjs/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +35 -35
- package/build/cjs/bluetooth/device-wrapper.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
- package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
- package/build/cjs/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.js +3 -3
- package/build/cjs/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/flashing-partial.js +5 -5
- package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/cjs/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/cjs/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
- package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/cjs/bluetooth/flashing/zip.js.map +1 -0
- package/build/cjs/bluetooth/flashing/zip.test.js.map +1 -0
- package/build/cjs/bluetooth/index.d.ts +5 -0
- package/build/cjs/bluetooth/index.js +9 -0
- package/build/cjs/bluetooth/index.js.map +1 -0
- package/build/cjs/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
- package/build/cjs/bluetooth/profile.js.map +1 -0
- package/build/cjs/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/cjs/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +16 -12
- package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/button-service.d.ts +2 -3
- package/build/cjs/{button-service.js → bluetooth/services/button-service.js} +15 -14
- package/build/cjs/bluetooth/services/button-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/cjs/{device-information-service.js → bluetooth/services/device-information-service.js} +2 -2
- package/build/cjs/bluetooth/services/device-information-service.js.map +1 -0
- package/build/cjs/{dfu-service.js → bluetooth/services/dfu-service.js} +2 -2
- package/build/cjs/bluetooth/services/dfu-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/led-service.d.ts +2 -3
- package/build/cjs/{led-service.js → bluetooth/services/led-service.js} +7 -7
- package/build/cjs/bluetooth/services/led-service.js.map +1 -0
- package/build/cjs/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/cjs/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +18 -14
- package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{esm → cjs/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/cjs/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +8 -8
- package/build/cjs/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/cjs/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/cjs/{uart-service.js → bluetooth/services/uart-service.js} +12 -9
- package/build/cjs/bluetooth/services/uart-service.js.map +1 -0
- package/build/cjs/board-id.d.ts +1 -1
- package/build/cjs/board-id.js.map +1 -1
- package/build/cjs/device.d.ts +82 -75
- package/build/cjs/device.js +40 -126
- package/build/cjs/device.js.map +1 -1
- package/build/cjs/events.d.ts +9 -108
- package/build/cjs/events.js +27 -88
- package/build/cjs/events.js.map +1 -1
- package/build/cjs/events.test.js +54 -48
- package/build/cjs/events.test.js.map +1 -1
- package/build/cjs/hex-util.d.ts +1 -0
- package/build/cjs/hex-util.js +15 -0
- package/build/cjs/hex-util.js.map +1 -0
- package/build/cjs/index.d.ts +7 -16
- package/build/cjs/index.js +6 -26
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/radio-bridge/connection.d.ts +39 -0
- package/build/cjs/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
- package/build/cjs/radio-bridge/connection.js.map +1 -0
- package/build/cjs/radio-bridge/index.d.ts +4 -0
- package/build/cjs/radio-bridge/index.js +9 -0
- package/build/cjs/radio-bridge/index.js.map +1 -0
- package/build/cjs/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/cjs/radio-bridge/serial-protocol.js.map +1 -0
- package/build/cjs/service-events.d.ts +42 -14
- package/build/cjs/service-events.js +6 -36
- package/build/cjs/service-events.js.map +1 -1
- package/build/{esm/hex-flash-data-source.d.ts → cjs/universal-hex/flash-data-source.d.ts} +1 -2
- package/build/cjs/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +7 -15
- package/build/cjs/universal-hex/flash-data-source.js.map +1 -0
- package/build/cjs/universal-hex/index.d.ts +4 -0
- package/build/cjs/universal-hex/index.js +9 -0
- package/build/cjs/universal-hex/index.js.map +1 -0
- package/build/cjs/usb/arm-debug.d.ts +137 -0
- package/build/cjs/usb/arm-debug.js +414 -0
- package/build/cjs/usb/arm-debug.js.map +1 -0
- package/build/cjs/usb/arm-debug.test.js +333 -0
- package/build/cjs/usb/arm-debug.test.js.map +1 -0
- package/build/{esm → cjs/usb}/board-serial-info.d.ts +2 -1
- package/build/cjs/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/cjs/usb/board-serial-info.js.map +1 -0
- package/build/cjs/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
- package/build/cjs/usb/board-serial-info.test.js.map +1 -0
- package/build/cjs/usb/cdc-saturation.d.ts +36 -0
- package/build/cjs/usb/cdc-saturation.js +151 -0
- package/build/cjs/usb/cdc-saturation.js.map +1 -0
- package/build/cjs/usb/cmsis-dap.d.ts +113 -0
- package/build/cjs/usb/cmsis-dap.js +349 -0
- package/build/cjs/usb/cmsis-dap.js.map +1 -0
- package/build/cjs/usb/cmsis-dap.test.js +350 -0
- package/build/cjs/usb/cmsis-dap.test.js.map +1 -0
- package/build/cjs/usb/connection.d.ts +81 -0
- package/build/cjs/{usb.js → usb/connection.js} +243 -166
- package/build/cjs/usb/connection.js.map +1 -0
- package/build/cjs/{usb.test.js → usb/connection.test.js} +52 -42
- package/build/cjs/usb/connection.test.js.map +1 -0
- package/build/cjs/usb/cortex-m.d.ts +72 -0
- package/build/cjs/usb/cortex-m.js +165 -0
- package/build/cjs/usb/cortex-m.js.map +1 -0
- package/build/cjs/usb/cortex-m.test.js +217 -0
- package/build/cjs/usb/cortex-m.test.js.map +1 -0
- package/build/cjs/usb/daplink.d.ts +69 -0
- package/build/cjs/usb/daplink.js +238 -0
- package/build/cjs/usb/daplink.js.map +1 -0
- package/build/cjs/usb/daplink.test.js +290 -0
- package/build/cjs/usb/daplink.test.js.map +1 -0
- package/build/cjs/usb/device-wrapper.d.ts +34 -0
- package/build/cjs/usb/device-wrapper.js +102 -0
- package/build/cjs/usb/device-wrapper.js.map +1 -0
- package/build/cjs/usb/index.d.ts +5 -0
- package/build/cjs/usb/index.js +10 -0
- package/build/cjs/usb/index.js.map +1 -0
- package/build/{esm/usb-partial-flashing-utils.d.ts → cjs/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/cjs/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +6 -49
- package/build/cjs/usb/partial-flashing-utils.js.map +1 -0
- package/build/{esm/usb-partial-flashing.d.ts → cjs/usb/partial-flashing.d.ts} +15 -7
- package/build/cjs/{usb-partial-flashing.js → usb/partial-flashing.js} +64 -119
- package/build/cjs/usb/partial-flashing.js.map +1 -0
- package/build/cjs/usb/promise-queue.js.map +1 -0
- package/build/cjs/usb/promise-queue.test.js.map +1 -0
- package/build/cjs/usb/serial-events.d.ts +21 -0
- package/build/cjs/{led.js → usb/serial-events.js} +1 -1
- package/build/cjs/usb/serial-events.js.map +1 -0
- package/build/cjs/usb/transport.d.ts +42 -0
- package/build/cjs/usb/transport.js +155 -0
- package/build/cjs/usb/transport.js.map +1 -0
- package/build/{cjs/bluetooth.d.ts → esm/bluetooth/connection.d.ts} +30 -26
- package/build/esm/{bluetooth.js → bluetooth/connection.js} +141 -98
- package/build/esm/bluetooth/connection.js.map +1 -0
- package/build/esm/{bluetooth.test.js → bluetooth/connection.test.js} +9 -9
- package/build/esm/bluetooth/connection.test.js.map +1 -0
- package/build/esm/bluetooth/device-bond-state.js.map +1 -0
- package/build/esm/{bluetooth-device-wrapper.d.ts → bluetooth/device-wrapper.d.ts} +11 -11
- package/build/esm/{bluetooth-device-wrapper.js → bluetooth/device-wrapper.js} +32 -32
- package/build/esm/bluetooth/device-wrapper.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-full.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/flashing-full.js +4 -4
- package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.d.ts +1 -1
- package/build/esm/bluetooth/flashing/flashing-makecode.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.test.js +2 -2
- package/build/esm/bluetooth/flashing/flashing-makecode.test.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/flashing-partial.js +4 -4
- package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -0
- package/build/esm/bluetooth/flashing/flashing-v1.js.map +1 -0
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.d.ts +2 -2
- package/build/esm/{flashing → bluetooth/flashing}/nordic-dfu.js +11 -8
- package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -0
- package/build/esm/bluetooth/flashing/zip.js.map +1 -0
- package/build/esm/bluetooth/flashing/zip.test.d.ts +1 -0
- package/build/esm/bluetooth/flashing/zip.test.js.map +1 -0
- package/build/esm/bluetooth/index.d.ts +5 -0
- package/build/esm/bluetooth/index.js +5 -0
- package/build/esm/bluetooth/index.js.map +1 -0
- package/build/esm/{bluetooth-profile.js → bluetooth/profile.js} +1 -1
- package/build/{cjs/bluetooth-profile.js.map → esm/bluetooth/profile.js.map} +1 -1
- package/build/esm/{accelerometer-service.d.ts → bluetooth/services/accelerometer-service.d.ts} +2 -3
- package/build/esm/{accelerometer-service.js → bluetooth/services/accelerometer-service.js} +10 -6
- package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/button-service.d.ts +2 -3
- package/build/esm/{button-service.js → bluetooth/services/button-service.js} +10 -9
- package/build/esm/bluetooth/services/button-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/device-information-service.d.ts +1 -1
- package/build/esm/{device-information-service.js → bluetooth/services/device-information-service.js} +1 -1
- package/build/esm/bluetooth/services/device-information-service.js.map +1 -0
- package/build/esm/{dfu-service.js → bluetooth/services/dfu-service.js} +1 -1
- package/build/esm/bluetooth/services/dfu-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/led-service.d.ts +2 -3
- package/build/esm/{led-service.js → bluetooth/services/led-service.js} +1 -1
- package/build/esm/bluetooth/services/led-service.js.map +1 -0
- package/build/esm/{magnetometer-service.d.ts → bluetooth/services/magnetometer-service.d.ts} +2 -3
- package/build/esm/{magnetometer-service.js → bluetooth/services/magnetometer-service.js} +10 -6
- package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -0
- package/build/{cjs → esm/bluetooth/services}/partial-flashing-service.d.ts +1 -1
- package/build/esm/{partial-flashing-service.js → bluetooth/services/partial-flashing-service.js} +4 -4
- package/build/esm/bluetooth/services/partial-flashing-service.js.map +1 -0
- package/build/esm/{uart-service.d.ts → bluetooth/services/uart-service.d.ts} +2 -2
- package/build/esm/{uart-service.js → bluetooth/services/uart-service.js} +8 -5
- package/build/esm/bluetooth/services/uart-service.js.map +1 -0
- package/build/esm/board-id.d.ts +1 -1
- package/build/esm/board-id.js.map +1 -1
- package/build/esm/device.d.ts +82 -75
- package/build/esm/device.js +38 -120
- package/build/esm/device.js.map +1 -1
- package/build/esm/events.d.ts +9 -108
- package/build/esm/events.js +26 -86
- package/build/esm/events.js.map +1 -1
- package/build/esm/events.test.js +55 -49
- package/build/esm/events.test.js.map +1 -1
- package/build/esm/hex-util.d.ts +1 -0
- package/build/esm/hex-util.js +11 -0
- package/build/esm/hex-util.js.map +1 -0
- package/build/esm/index.d.ts +7 -16
- package/build/esm/index.js +6 -10
- package/build/esm/index.js.map +1 -1
- package/build/esm/radio-bridge/connection.d.ts +39 -0
- package/build/esm/{usb-radio-bridge.js → radio-bridge/connection.js} +39 -25
- package/build/esm/radio-bridge/connection.js.map +1 -0
- package/build/esm/radio-bridge/index.d.ts +4 -0
- package/build/esm/radio-bridge/index.js +5 -0
- package/build/esm/radio-bridge/index.js.map +1 -0
- package/build/esm/{usb-serial-protocol.js → radio-bridge/serial-protocol.js} +1 -1
- package/build/esm/radio-bridge/serial-protocol.js.map +1 -0
- package/build/esm/service-events.d.ts +42 -14
- package/build/esm/service-events.js +5 -34
- package/build/esm/service-events.js.map +1 -1
- package/build/{cjs/hex-flash-data-source.d.ts → esm/universal-hex/flash-data-source.d.ts} +1 -2
- package/build/esm/{hex-flash-data-source.js → universal-hex/flash-data-source.js} +6 -13
- package/build/esm/universal-hex/flash-data-source.js.map +1 -0
- package/build/esm/universal-hex/index.d.ts +4 -0
- package/build/esm/universal-hex/index.js +5 -0
- package/build/esm/universal-hex/index.js.map +1 -0
- package/build/esm/usb/arm-debug.d.ts +137 -0
- package/build/esm/usb/arm-debug.js +409 -0
- package/build/esm/usb/arm-debug.js.map +1 -0
- package/build/esm/usb/arm-debug.test.d.ts +1 -0
- package/build/esm/usb/arm-debug.test.js +331 -0
- package/build/esm/usb/arm-debug.test.js.map +1 -0
- package/build/{cjs → esm/usb}/board-serial-info.d.ts +2 -1
- package/build/esm/{board-serial-info.js → usb/board-serial-info.js} +10 -7
- package/build/esm/usb/board-serial-info.js.map +1 -0
- package/build/esm/usb/board-serial-info.test.d.ts +1 -0
- package/build/esm/{board-serial-info.test.js → usb/board-serial-info.test.js} +2 -4
- package/build/esm/usb/board-serial-info.test.js.map +1 -0
- package/build/esm/usb/cdc-saturation.d.ts +36 -0
- package/build/esm/usb/cdc-saturation.js +148 -0
- package/build/esm/usb/cdc-saturation.js.map +1 -0
- package/build/esm/usb/cmsis-dap.d.ts +113 -0
- package/build/esm/usb/cmsis-dap.js +342 -0
- package/build/esm/usb/cmsis-dap.js.map +1 -0
- package/build/esm/usb/cmsis-dap.test.d.ts +1 -0
- package/build/esm/usb/cmsis-dap.test.js +348 -0
- package/build/esm/usb/cmsis-dap.test.js.map +1 -0
- package/build/esm/usb/connection.d.ts +81 -0
- package/build/esm/{usb.js → usb/connection.js} +239 -161
- package/build/esm/usb/connection.js.map +1 -0
- package/build/esm/usb/connection.test.d.ts +1 -0
- package/build/esm/{usb.test.js → usb/connection.test.js} +47 -37
- package/build/esm/usb/connection.test.js.map +1 -0
- package/build/esm/usb/cortex-m.d.ts +72 -0
- package/build/esm/usb/cortex-m.js +161 -0
- package/build/esm/usb/cortex-m.js.map +1 -0
- package/build/esm/usb/cortex-m.test.d.ts +1 -0
- package/build/esm/usb/cortex-m.test.js +215 -0
- package/build/esm/usb/cortex-m.test.js.map +1 -0
- package/build/esm/usb/daplink.d.ts +69 -0
- package/build/esm/usb/daplink.js +231 -0
- package/build/esm/usb/daplink.js.map +1 -0
- package/build/esm/usb/daplink.test.d.ts +1 -0
- package/build/esm/usb/daplink.test.js +288 -0
- package/build/esm/usb/daplink.test.js.map +1 -0
- package/build/esm/usb/device-wrapper.d.ts +34 -0
- package/build/esm/usb/device-wrapper.js +98 -0
- package/build/esm/usb/device-wrapper.js.map +1 -0
- package/build/esm/usb/index.d.ts +5 -0
- package/build/esm/usb/index.js +5 -0
- package/build/esm/usb/index.js.map +1 -0
- package/build/{cjs/usb-partial-flashing-utils.d.ts → esm/usb/partial-flashing-utils.d.ts} +6 -9
- package/build/esm/{usb-partial-flashing-utils.js → usb/partial-flashing-utils.js} +4 -44
- package/build/esm/usb/partial-flashing-utils.js.map +1 -0
- package/build/{cjs/usb-partial-flashing.d.ts → esm/usb/partial-flashing.d.ts} +15 -7
- package/build/esm/{usb-partial-flashing.js → usb/partial-flashing.js} +62 -94
- package/build/esm/usb/partial-flashing.js.map +1 -0
- package/build/esm/usb/promise-queue.js.map +1 -0
- package/build/esm/usb/promise-queue.test.d.ts +1 -0
- package/build/esm/usb/promise-queue.test.js.map +1 -0
- package/build/esm/usb/serial-events.d.ts +21 -0
- package/build/esm/usb/serial-events.js +2 -0
- package/build/esm/usb/serial-events.js.map +1 -0
- package/build/esm/usb/transport.d.ts +42 -0
- package/build/esm/usb/transport.js +151 -0
- package/build/esm/usb/transport.js.map +1 -0
- package/package.json +43 -2
- package/build/cjs/accelerometer-service.js.map +0 -1
- package/build/cjs/accelerometer.d.ts +0 -9
- package/build/cjs/accelerometer.js +0 -16
- package/build/cjs/accelerometer.js.map +0 -1
- package/build/cjs/bluetooth-device-wrapper.js.map +0 -1
- package/build/cjs/bluetooth.js.map +0 -1
- package/build/cjs/bluetooth.test.js.map +0 -1
- package/build/cjs/board-serial-info.js.map +0 -1
- package/build/cjs/board-serial-info.test.js.map +0 -1
- package/build/cjs/button-service.js.map +0 -1
- package/build/cjs/buttons.d.ts +0 -10
- package/build/cjs/buttons.js +0 -22
- package/build/cjs/buttons.js.map +0 -1
- package/build/cjs/constants.d.ts +0 -48
- package/build/cjs/constants.js +0 -73
- package/build/cjs/constants.js.map +0 -1
- package/build/cjs/device-bond-state.js.map +0 -1
- package/build/cjs/device-information-service.js.map +0 -1
- package/build/cjs/dfu-service.js.map +0 -1
- package/build/cjs/flashing/flashing-full.js.map +0 -1
- package/build/cjs/flashing/flashing-makecode.js.map +0 -1
- package/build/cjs/flashing/flashing-makecode.test.js.map +0 -1
- package/build/cjs/flashing/flashing-partial.js.map +0 -1
- package/build/cjs/flashing/flashing-v1.js.map +0 -1
- package/build/cjs/flashing/nordic-dfu.js.map +0 -1
- package/build/cjs/flashing/zip.js.map +0 -1
- package/build/cjs/flashing/zip.test.js.map +0 -1
- package/build/cjs/hex-flash-data-source.js.map +0 -1
- package/build/cjs/led-service.js.map +0 -1
- package/build/cjs/led.d.ts +0 -6
- package/build/cjs/led.js.map +0 -1
- package/build/cjs/magnetometer-service.js.map +0 -1
- package/build/cjs/magnetometer.d.ts +0 -9
- package/build/cjs/magnetometer.js +0 -16
- package/build/cjs/magnetometer.js.map +0 -1
- package/build/cjs/partial-flashing-service.js.map +0 -1
- package/build/cjs/promise-queue.js.map +0 -1
- package/build/cjs/promise-queue.test.js.map +0 -1
- package/build/cjs/serial-events.d.ts +0 -20
- package/build/cjs/serial-events.js +0 -69
- package/build/cjs/serial-events.js.map +0 -1
- package/build/cjs/uart-service.js.map +0 -1
- package/build/cjs/uart.d.ts +0 -4
- package/build/cjs/uart.js +0 -16
- package/build/cjs/uart.js.map +0 -1
- package/build/cjs/usb-device-wrapper.d.ts +0 -47
- package/build/cjs/usb-device-wrapper.js +0 -437
- package/build/cjs/usb-device-wrapper.js.map +0 -1
- package/build/cjs/usb-partial-flashing-utils.js.map +0 -1
- package/build/cjs/usb-partial-flashing.js.map +0 -1
- package/build/cjs/usb-radio-bridge.d.ts +0 -24
- package/build/cjs/usb-radio-bridge.js.map +0 -1
- package/build/cjs/usb-serial-protocol.js.map +0 -1
- package/build/cjs/usb.d.ts +0 -66
- package/build/cjs/usb.js.map +0 -1
- package/build/cjs/usb.test.js.map +0 -1
- package/build/esm/accelerometer-service.js.map +0 -1
- package/build/esm/accelerometer.d.ts +0 -9
- package/build/esm/accelerometer.js +0 -12
- package/build/esm/accelerometer.js.map +0 -1
- package/build/esm/bluetooth-device-wrapper.js.map +0 -1
- package/build/esm/bluetooth-profile.js.map +0 -1
- package/build/esm/bluetooth.js.map +0 -1
- package/build/esm/bluetooth.test.js.map +0 -1
- package/build/esm/board-serial-info.js.map +0 -1
- package/build/esm/board-serial-info.test.js.map +0 -1
- package/build/esm/button-service.js.map +0 -1
- package/build/esm/buttons.d.ts +0 -10
- package/build/esm/buttons.js +0 -18
- package/build/esm/buttons.js.map +0 -1
- package/build/esm/constants.d.ts +0 -48
- package/build/esm/constants.js +0 -70
- package/build/esm/constants.js.map +0 -1
- package/build/esm/device-bond-state.js.map +0 -1
- package/build/esm/device-information-service.js.map +0 -1
- package/build/esm/dfu-service.js.map +0 -1
- package/build/esm/flashing/flashing-full.js.map +0 -1
- package/build/esm/flashing/flashing-makecode.js.map +0 -1
- package/build/esm/flashing/flashing-makecode.test.js.map +0 -1
- package/build/esm/flashing/flashing-partial.js.map +0 -1
- package/build/esm/flashing/flashing-v1.js.map +0 -1
- package/build/esm/flashing/nordic-dfu.js.map +0 -1
- package/build/esm/flashing/zip.js.map +0 -1
- package/build/esm/flashing/zip.test.js.map +0 -1
- package/build/esm/hex-flash-data-source.js.map +0 -1
- package/build/esm/led-service.js.map +0 -1
- package/build/esm/led.d.ts +0 -6
- package/build/esm/led.js +0 -2
- package/build/esm/led.js.map +0 -1
- package/build/esm/magnetometer-service.js.map +0 -1
- package/build/esm/magnetometer.d.ts +0 -9
- package/build/esm/magnetometer.js +0 -12
- package/build/esm/magnetometer.js.map +0 -1
- package/build/esm/partial-flashing-service.js.map +0 -1
- package/build/esm/promise-queue.js.map +0 -1
- package/build/esm/promise-queue.test.js.map +0 -1
- package/build/esm/serial-events.d.ts +0 -20
- package/build/esm/serial-events.js +0 -61
- package/build/esm/serial-events.js.map +0 -1
- package/build/esm/uart-service.js.map +0 -1
- package/build/esm/uart.d.ts +0 -4
- package/build/esm/uart.js +0 -12
- package/build/esm/uart.js.map +0 -1
- package/build/esm/usb-device-wrapper.d.ts +0 -47
- package/build/esm/usb-device-wrapper.js +0 -410
- package/build/esm/usb-device-wrapper.js.map +0 -1
- package/build/esm/usb-partial-flashing-utils.js.map +0 -1
- package/build/esm/usb-partial-flashing.js.map +0 -1
- package/build/esm/usb-radio-bridge.d.ts +0 -24
- package/build/esm/usb-radio-bridge.js.map +0 -1
- package/build/esm/usb-serial-protocol.js.map +0 -1
- package/build/esm/usb.d.ts +0 -66
- package/build/esm/usb.js.map +0 -1
- package/build/esm/usb.test.js.map +0 -1
- /package/build/cjs/{bluetooth.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
- /package/build/cjs/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
- /package/build/cjs/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-makecode.test.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.d.ts +0 -0
- /package/build/cjs/{flashing → bluetooth/flashing}/zip.test.js +0 -0
- /package/build/cjs/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
- /package/build/cjs/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/cjs/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/cjs/{board-serial-info.test.d.ts → usb/arm-debug.test.d.ts} +0 -0
- /package/build/{esm → cjs/usb}/board-serial-info.test.d.ts +0 -0
- /package/build/cjs/{promise-queue.test.d.ts → usb/cmsis-dap.test.d.ts} +0 -0
- /package/build/cjs/{usb.test.d.ts → usb/connection.test.d.ts} +0 -0
- /package/build/{esm/bluetooth.test.d.ts → cjs/usb/cortex-m.test.d.ts} +0 -0
- /package/build/{esm/flashing/flashing-makecode.test.d.ts → cjs/usb/daplink.test.d.ts} +0 -0
- /package/build/cjs/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/cjs/{promise-queue.js → usb/promise-queue.js} +0 -0
- /package/build/{esm → cjs/usb}/promise-queue.test.d.ts +0 -0
- /package/build/cjs/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
- /package/build/esm/{flashing/zip.test.d.ts → bluetooth/connection.test.d.ts} +0 -0
- /package/build/esm/{device-bond-state.d.ts → bluetooth/device-bond-state.d.ts} +0 -0
- /package/build/esm/{device-bond-state.js → bluetooth/device-bond-state.js} +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-makecode.js +0 -0
- /package/build/esm/{usb.test.d.ts → bluetooth/flashing/flashing-makecode.test.d.ts} +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/flashing-v1.js +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.d.ts +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.js +0 -0
- /package/build/esm/{flashing → bluetooth/flashing}/zip.test.js +0 -0
- /package/build/esm/{bluetooth-profile.d.ts → bluetooth/profile.d.ts} +0 -0
- /package/build/esm/{dfu-service.d.ts → bluetooth/services/dfu-service.d.ts} +0 -0
- /package/build/esm/{usb-serial-protocol.d.ts → radio-bridge/serial-protocol.d.ts} +0 -0
- /package/build/esm/{promise-queue.d.ts → usb/promise-queue.d.ts} +0 -0
- /package/build/esm/{promise-queue.js → usb/promise-queue.js} +0 -0
- /package/build/esm/{promise-queue.test.js → usb/promise-queue.test.js} +0 -0
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { LedMatrix } from "
|
|
4
|
-
import { Logging } from "./logging.js";
|
|
5
|
-
import { MagnetometerData } from "./magnetometer.js";
|
|
6
|
-
import { ServiceConnectionEventMap } from "./service-events.js";
|
|
1
|
+
import { DeviceConnection, FlashDataSource, FlashOptions } from "../device.js";
|
|
2
|
+
import { Logging } from "../logging.js";
|
|
3
|
+
import { AccelerometerData, LedMatrix, MagnetometerData, ServiceConnectionEventMap } from "../service-events.js";
|
|
7
4
|
import { DeviceBondState } from "./device-bond-state.js";
|
|
8
|
-
export interface
|
|
5
|
+
export interface MicrobitBluetoothConnectionOptions {
|
|
9
6
|
logging?: Logging;
|
|
10
7
|
deviceBondState?: DeviceBondState;
|
|
11
8
|
}
|
|
12
|
-
export interface
|
|
9
|
+
export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceConnectionEventMap> {
|
|
13
10
|
/**
|
|
14
11
|
* Sets micro:bit name filter for device requesting.
|
|
15
12
|
*
|
|
@@ -19,96 +16,103 @@ export interface MicrobitWebBluetoothConnection extends DeviceConnection<Service
|
|
|
19
16
|
/**
|
|
20
17
|
* Gets micro:bit accelerometer data.
|
|
21
18
|
*
|
|
22
|
-
* @returns accelerometer data
|
|
19
|
+
* @returns accelerometer data.
|
|
20
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
23
21
|
*/
|
|
24
|
-
getAccelerometerData(): Promise<AccelerometerData
|
|
22
|
+
getAccelerometerData(): Promise<AccelerometerData>;
|
|
25
23
|
/**
|
|
26
24
|
* Gets micro:bit accelerometer period.
|
|
27
25
|
*
|
|
28
|
-
* @returns accelerometer period
|
|
26
|
+
* @returns accelerometer period.
|
|
27
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
29
28
|
*/
|
|
30
|
-
getAccelerometerPeriod(): Promise<number
|
|
29
|
+
getAccelerometerPeriod(): Promise<number>;
|
|
31
30
|
/**
|
|
32
31
|
* Sets micro:bit accelerometer period.
|
|
33
32
|
*
|
|
34
33
|
* @param value The accelerometer period.
|
|
34
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
35
35
|
*/
|
|
36
36
|
setAccelerometerPeriod(value: number): Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* Sets micro:bit LED text.
|
|
39
39
|
*
|
|
40
40
|
* @param text The text displayed on micro:bit LED.
|
|
41
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
41
42
|
*/
|
|
42
43
|
setLedText(text: string): Promise<void>;
|
|
43
44
|
/**
|
|
44
45
|
* Gets micro:bit LED scrolling delay.
|
|
45
46
|
*
|
|
46
47
|
* @returns LED scrolling delay in milliseconds.
|
|
48
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
47
49
|
*/
|
|
48
|
-
getLedScrollingDelay(): Promise<number
|
|
50
|
+
getLedScrollingDelay(): Promise<number>;
|
|
49
51
|
/**
|
|
50
52
|
* Sets micro:bit LED scrolling delay.
|
|
51
53
|
*
|
|
52
54
|
* @param delayInMillis LED scrolling delay in milliseconds.
|
|
55
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
53
56
|
*/
|
|
54
57
|
setLedScrollingDelay(delayInMillis: number): Promise<void>;
|
|
55
58
|
/**
|
|
56
59
|
* Gets micro:bit LED matrix.
|
|
57
60
|
*
|
|
58
61
|
* @returns a boolean matrix representing the micro:bit LED display.
|
|
62
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
59
63
|
*/
|
|
60
|
-
getLedMatrix(): Promise<LedMatrix
|
|
64
|
+
getLedMatrix(): Promise<LedMatrix>;
|
|
61
65
|
/**
|
|
62
66
|
* Sets micro:bit LED matrix.
|
|
63
67
|
*
|
|
64
68
|
* @param matrix an boolean matrix representing the micro:bit LED display.
|
|
69
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
65
70
|
*/
|
|
66
71
|
setLedMatrix(matrix: LedMatrix): Promise<void>;
|
|
67
72
|
/**
|
|
68
73
|
* Gets micro:bit magnetometer data.
|
|
69
74
|
*
|
|
70
75
|
* @returns magnetometer data.
|
|
76
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
71
77
|
*/
|
|
72
|
-
getMagnetometerData(): Promise<MagnetometerData
|
|
78
|
+
getMagnetometerData(): Promise<MagnetometerData>;
|
|
73
79
|
/**
|
|
74
80
|
* Gets micro:bit magnetometer bearing.
|
|
75
81
|
*
|
|
76
82
|
* @returns magnetometer bearing.
|
|
83
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
77
84
|
*/
|
|
78
|
-
getMagnetometerBearing(): Promise<number
|
|
85
|
+
getMagnetometerBearing(): Promise<number>;
|
|
79
86
|
/**
|
|
80
87
|
* Gets micro:bit magnetometer period.
|
|
81
88
|
*
|
|
82
89
|
* @returns magnetometer period.
|
|
90
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
83
91
|
*/
|
|
84
|
-
getMagnetometerPeriod(): Promise<number
|
|
92
|
+
getMagnetometerPeriod(): Promise<number>;
|
|
85
93
|
/**
|
|
86
94
|
* Sets micro:bit magnetometer period.
|
|
87
95
|
*
|
|
88
96
|
* @param value magnetometer period.
|
|
97
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
89
98
|
*/
|
|
90
99
|
setMagnetometerPeriod(value: number): Promise<void>;
|
|
91
100
|
/**
|
|
92
101
|
* Triggers micro:bit magnetometer calibration.
|
|
102
|
+
*
|
|
103
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
93
104
|
*/
|
|
94
105
|
triggerMagnetometerCalibration(): Promise<void>;
|
|
95
106
|
/**
|
|
96
107
|
* Write UART messages.
|
|
97
108
|
*
|
|
98
109
|
* @param data UART message.
|
|
110
|
+
* @throws {DeviceError} with code `not-connected` if there is no connection.
|
|
99
111
|
*/
|
|
100
112
|
uartWrite(data: Uint8Array): Promise<void>;
|
|
101
|
-
/**
|
|
102
|
-
* Flash the micro:bit.
|
|
103
|
-
*
|
|
104
|
-
* @param dataSource The data to use.
|
|
105
|
-
* @param options Flash options and progress callback.
|
|
106
|
-
* @throws {DeviceError} On flash failure. The error.code property indicates the failure type.
|
|
107
|
-
* @throws {FlashDataError} If data preparation fails.
|
|
108
|
-
*/
|
|
109
113
|
flash(dataSource: FlashDataSource, options: FlashOptions): Promise<void>;
|
|
110
114
|
}
|
|
111
115
|
/**
|
|
112
116
|
* A Bluetooth connection factory.
|
|
113
117
|
*/
|
|
114
|
-
export declare const
|
|
118
|
+
export declare const createBluetoothConnection: (options?: MicrobitBluetoothConnectionOptions) => MicrobitBluetoothConnection;
|
|
@@ -6,39 +6,39 @@
|
|
|
6
6
|
import { BleClient } from "@capacitor-community/bluetooth-le";
|
|
7
7
|
import { Capacitor } from "@capacitor/core";
|
|
8
8
|
import MemoryMap from "nrf-intel-hex";
|
|
9
|
-
import { BluetoothDeviceWrapper, isAndroid, scanningTimeoutInMs, } from "./
|
|
10
|
-
import { profile } from "./
|
|
11
|
-
import {
|
|
12
|
-
import { TypedEventTarget } from "
|
|
13
|
-
import { ConsoleLogging } from "
|
|
9
|
+
import { BluetoothDeviceWrapper, isAndroid, scanningTimeoutInMs, } from "./device-wrapper.js";
|
|
10
|
+
import { profile } from "./profile.js";
|
|
11
|
+
import { ConnectionStatus, DeviceError, FlashDataError, assertConnected, ProgressStage, } from "../device.js";
|
|
12
|
+
import { TypedEventTarget } from "../events.js";
|
|
13
|
+
import { ConsoleLogging } from "../logging.js";
|
|
14
14
|
import { fullFlash } from "./flashing/flashing-full.js";
|
|
15
15
|
import partialFlash, { PartialFlashResult, } from "./flashing/flashing-partial.js";
|
|
16
|
-
import { throwIfUnavailable } from "
|
|
17
|
-
import { truncateHexAfterEof } from "
|
|
16
|
+
import { throwIfUnavailable } from "../availability.js";
|
|
17
|
+
import { truncateHexAfterEof } from "../hex-util.js";
|
|
18
18
|
import { DefaultDeviceBondState, } from "./device-bond-state.js";
|
|
19
|
-
import { TimeoutError } from "
|
|
19
|
+
import { TimeoutError } from "../async-util.js";
|
|
20
20
|
let bleClientInitialized = false;
|
|
21
21
|
/**
|
|
22
22
|
* A Bluetooth connection factory.
|
|
23
23
|
*/
|
|
24
|
-
export const
|
|
24
|
+
export const createBluetoothConnection = (options) => new MicrobitBluetoothConnectionImpl(options);
|
|
25
25
|
/**
|
|
26
26
|
* A Bluetooth connection to a micro:bit device.
|
|
27
27
|
*/
|
|
28
|
-
class
|
|
28
|
+
class MicrobitBluetoothConnectionImpl extends TypedEventTarget {
|
|
29
29
|
constructor(options = {}) {
|
|
30
30
|
super();
|
|
31
31
|
Object.defineProperty(this, "status", {
|
|
32
32
|
enumerable: true,
|
|
33
33
|
configurable: true,
|
|
34
34
|
writable: true,
|
|
35
|
-
value: ConnectionStatus.
|
|
35
|
+
value: ConnectionStatus.NoAuthorizedDevice
|
|
36
36
|
});
|
|
37
37
|
/**
|
|
38
|
-
* The
|
|
38
|
+
* The BLE device we last connected to.
|
|
39
39
|
* Cleared if it is disconnected.
|
|
40
40
|
*/
|
|
41
|
-
Object.defineProperty(this, "
|
|
41
|
+
Object.defineProperty(this, "bleDevice", {
|
|
42
42
|
enumerable: true,
|
|
43
43
|
configurable: true,
|
|
44
44
|
writable: true,
|
|
@@ -56,7 +56,19 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
56
56
|
writable: true,
|
|
57
57
|
value: void 0
|
|
58
58
|
});
|
|
59
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Device-specific state. Created on connect, cleared on disconnect.
|
|
61
|
+
*/
|
|
62
|
+
Object.defineProperty(this, "device", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
configurable: true,
|
|
65
|
+
writable: true,
|
|
66
|
+
value: void 0
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Cached device property that persists across reconnections until clearDevice.
|
|
70
|
+
*/
|
|
71
|
+
Object.defineProperty(this, "cachedBoardVersion", {
|
|
60
72
|
enumerable: true,
|
|
61
73
|
configurable: true,
|
|
62
74
|
writable: true,
|
|
@@ -85,10 +97,10 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
85
97
|
options.deviceBondState || new DefaultDeviceBondState();
|
|
86
98
|
}
|
|
87
99
|
eventActivated(type) {
|
|
88
|
-
this.
|
|
100
|
+
this.device?.startNotifications(type);
|
|
89
101
|
}
|
|
90
102
|
eventDeactivated(type) {
|
|
91
|
-
this.
|
|
103
|
+
this.device?.stopNotifications(type);
|
|
92
104
|
}
|
|
93
105
|
log(v) {
|
|
94
106
|
this.logging.log(v);
|
|
@@ -156,7 +168,8 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
156
168
|
}
|
|
157
169
|
}
|
|
158
170
|
getBoardVersion() {
|
|
159
|
-
|
|
171
|
+
assertConnected(this.cachedBoardVersion);
|
|
172
|
+
return this.cachedBoardVersion;
|
|
160
173
|
}
|
|
161
174
|
async connect(options) {
|
|
162
175
|
const progress = options?.progress ?? (() => { });
|
|
@@ -168,21 +181,22 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
168
181
|
// disconnect before attempting to connect.
|
|
169
182
|
this.waitForPostFlashDisconnectPromise &&
|
|
170
183
|
(await this.waitForPostFlashDisconnectPromise);
|
|
171
|
-
if (!this.
|
|
184
|
+
if (!this.bleDevice || !this.device) {
|
|
172
185
|
progress(ProgressStage.FindingDevice);
|
|
173
186
|
const device = await this.requestDevice(options?.signal);
|
|
174
|
-
this.
|
|
175
|
-
onConnecting: () => this.setStatus(ConnectionStatus.
|
|
176
|
-
onSuccess: () => this.setStatus(ConnectionStatus.
|
|
177
|
-
onDisconnect: () => this.setStatus(ConnectionStatus.
|
|
187
|
+
this.device = new BluetoothDeviceWrapper(device, this.logging, this.deviceBondState, this.dispatchEvent.bind(this), () => this.getActiveEvents(), {
|
|
188
|
+
onConnecting: () => this.setStatus(ConnectionStatus.Connecting),
|
|
189
|
+
onSuccess: () => this.setStatus(ConnectionStatus.Connected),
|
|
190
|
+
onDisconnect: () => this.setStatus(ConnectionStatus.Disconnected),
|
|
178
191
|
});
|
|
179
192
|
}
|
|
180
|
-
await this.
|
|
193
|
+
await this.device.connect(options);
|
|
194
|
+
this.cachedBoardVersion = this.device.boardVersion;
|
|
181
195
|
}
|
|
182
196
|
async disconnect() {
|
|
183
197
|
try {
|
|
184
|
-
if (this.
|
|
185
|
-
await this.
|
|
198
|
+
if (this.device) {
|
|
199
|
+
await this.device.disconnect();
|
|
186
200
|
}
|
|
187
201
|
}
|
|
188
202
|
catch (e) {
|
|
@@ -192,7 +206,7 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
192
206
|
});
|
|
193
207
|
}
|
|
194
208
|
finally {
|
|
195
|
-
this.setStatus(ConnectionStatus.
|
|
209
|
+
this.setStatus(ConnectionStatus.Disconnected);
|
|
196
210
|
this.logging.event({
|
|
197
211
|
type: "Bluetooth-info",
|
|
198
212
|
message: "disconnected",
|
|
@@ -204,105 +218,118 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
204
218
|
this.status = newStatus;
|
|
205
219
|
this.log("Bluetooth connection status " + newStatus);
|
|
206
220
|
if (this.deferredUpdatesPreviousStatus === undefined) {
|
|
207
|
-
this.
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
if (this.connection) {
|
|
212
|
-
// TODO
|
|
221
|
+
this.dispatchEvent("status", {
|
|
222
|
+
status: newStatus,
|
|
223
|
+
previousStatus,
|
|
224
|
+
});
|
|
213
225
|
}
|
|
214
|
-
return Promise.resolve();
|
|
215
226
|
}
|
|
216
227
|
async clearDevice() {
|
|
217
228
|
await this.disconnect();
|
|
218
|
-
this.
|
|
219
|
-
this.
|
|
229
|
+
this.bleDevice = undefined;
|
|
230
|
+
this.cachedBoardVersion = undefined;
|
|
231
|
+
this.setStatus(ConnectionStatus.NoAuthorizedDevice);
|
|
220
232
|
}
|
|
221
233
|
setNameFilter(name) {
|
|
222
234
|
this.nameFilter = name;
|
|
223
235
|
}
|
|
224
236
|
async requestDevice(signal) {
|
|
225
|
-
//
|
|
237
|
+
// Support both the default "BBC micro:bit" name and the shorter "uBit"
|
|
238
|
+
// name used by some MakeCode extensions (e.g. bsiever/microbit-pxt-blehid).
|
|
226
239
|
// See https://github.com/bsiever/microbit-pxt-blehid/issues/31
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
const namePrefix = this.nameFilter
|
|
231
|
-
? `BBC micro:bit [${this.nameFilter}]`
|
|
232
|
-
: "BBC micro:bit";
|
|
240
|
+
const namePrefixes = this.nameFilter
|
|
241
|
+
? [`BBC micro:bit [${this.nameFilter}]`, `uBit [${this.nameFilter}]`]
|
|
242
|
+
: ["BBC micro:bit", "uBit"];
|
|
233
243
|
// If we have a cached device, check if it still matches the current filter.
|
|
234
244
|
// If not, clear it so we find a new device.
|
|
235
|
-
if (this.
|
|
236
|
-
if (this.
|
|
237
|
-
return this.
|
|
245
|
+
if (this.bleDevice) {
|
|
246
|
+
if (namePrefixes.some((p) => this.bleDevice.name?.startsWith(p))) {
|
|
247
|
+
return this.bleDevice;
|
|
238
248
|
}
|
|
239
|
-
this.log(`Cached device "${this.
|
|
249
|
+
this.log(`Cached device "${this.bleDevice.name}" doesn't match filters "${namePrefixes.join(", ")}", clearing`);
|
|
240
250
|
await this.clearDevice();
|
|
241
251
|
}
|
|
242
|
-
this.
|
|
252
|
+
this.dispatchEvent("beforerequestdevice");
|
|
243
253
|
try {
|
|
244
|
-
this.
|
|
245
|
-
? await this.requestDeviceNative(
|
|
246
|
-
: await this.requestDeviceWeb(
|
|
247
|
-
if (!this.
|
|
248
|
-
this.setStatus(ConnectionStatus.
|
|
254
|
+
this.bleDevice = Capacitor.isNativePlatform()
|
|
255
|
+
? await this.requestDeviceNative(namePrefixes, signal)
|
|
256
|
+
: await this.requestDeviceWeb(namePrefixes);
|
|
257
|
+
if (!this.bleDevice) {
|
|
258
|
+
this.setStatus(ConnectionStatus.NoAuthorizedDevice);
|
|
249
259
|
throw new DeviceError({
|
|
250
260
|
code: "no-device-selected",
|
|
251
261
|
message: "No device selected",
|
|
252
262
|
});
|
|
253
263
|
}
|
|
254
|
-
return this.
|
|
264
|
+
return this.bleDevice;
|
|
255
265
|
}
|
|
256
266
|
finally {
|
|
257
|
-
this.
|
|
267
|
+
this.dispatchEvent("afterrequestdevice");
|
|
258
268
|
}
|
|
259
269
|
}
|
|
260
270
|
async getAccelerometerData() {
|
|
261
|
-
|
|
271
|
+
assertConnected(this.device);
|
|
272
|
+
return this.device.accelerometer.getData();
|
|
262
273
|
}
|
|
263
274
|
async getAccelerometerPeriod() {
|
|
264
|
-
|
|
275
|
+
assertConnected(this.device);
|
|
276
|
+
return this.device.accelerometer.getPeriod();
|
|
265
277
|
}
|
|
266
278
|
async setAccelerometerPeriod(value) {
|
|
267
|
-
|
|
279
|
+
assertConnected(this.device);
|
|
280
|
+
return this.device.accelerometer.setPeriod(value);
|
|
268
281
|
}
|
|
269
282
|
async setLedText(text) {
|
|
270
|
-
|
|
283
|
+
assertConnected(this.device);
|
|
284
|
+
return this.device.led.setText(text);
|
|
271
285
|
}
|
|
272
286
|
async getLedScrollingDelay() {
|
|
273
|
-
|
|
287
|
+
assertConnected(this.device);
|
|
288
|
+
return this.device.led.getScrollingDelay();
|
|
274
289
|
}
|
|
275
290
|
async setLedScrollingDelay(delayInMillis) {
|
|
276
|
-
|
|
291
|
+
assertConnected(this.device);
|
|
292
|
+
await this.device.led.setScrollingDelay(delayInMillis);
|
|
277
293
|
}
|
|
278
294
|
async getLedMatrix() {
|
|
279
|
-
|
|
295
|
+
assertConnected(this.device);
|
|
296
|
+
return await this.device.led.getLedMatrix();
|
|
280
297
|
}
|
|
281
298
|
async setLedMatrix(matrix) {
|
|
282
|
-
|
|
299
|
+
assertConnected(this.device);
|
|
300
|
+
await this.device.led.setLedMatrix(matrix);
|
|
283
301
|
}
|
|
284
302
|
async getMagnetometerData() {
|
|
285
|
-
|
|
303
|
+
assertConnected(this.device);
|
|
304
|
+
return this.device.magnetometer.getData();
|
|
286
305
|
}
|
|
287
306
|
async getMagnetometerPeriod() {
|
|
288
|
-
|
|
307
|
+
assertConnected(this.device);
|
|
308
|
+
return this.device.magnetometer.getPeriod();
|
|
289
309
|
}
|
|
290
310
|
async setMagnetometerPeriod(value) {
|
|
291
|
-
|
|
311
|
+
assertConnected(this.device);
|
|
312
|
+
return this.device.magnetometer.setPeriod(value);
|
|
292
313
|
}
|
|
293
314
|
async getMagnetometerBearing() {
|
|
294
|
-
|
|
315
|
+
assertConnected(this.device);
|
|
316
|
+
return this.device.magnetometer.getBearing();
|
|
295
317
|
}
|
|
296
318
|
async triggerMagnetometerCalibration() {
|
|
297
|
-
|
|
319
|
+
assertConnected(this.device);
|
|
320
|
+
await this.device.magnetometer.triggerCalibration();
|
|
298
321
|
}
|
|
299
322
|
async uartWrite(data) {
|
|
300
|
-
|
|
323
|
+
assertConnected(this.device);
|
|
324
|
+
await this.device.uart.writeData(data);
|
|
301
325
|
}
|
|
302
326
|
/**
|
|
303
327
|
* Flash the micro:bit.
|
|
304
328
|
*
|
|
305
|
-
*
|
|
329
|
+
* Always leaves the connection in {@link ConnectionStatus.Disconnected} state.
|
|
330
|
+
* Bluetooth connects directly to the application processor, which reboots
|
|
331
|
+
* after flashing, so the connection is necessarily lost. Call {@link connect}
|
|
332
|
+
* again after flashing to reconnect.
|
|
306
333
|
*
|
|
307
334
|
* @param dataSource The data to use.
|
|
308
335
|
* @param options Flash options and progress callback.
|
|
@@ -312,10 +339,10 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
312
339
|
try {
|
|
313
340
|
// We'll disconnect/reconnect multiple times due to device resets, but reporting this is unhelpful.
|
|
314
341
|
this.deferredUpdatesPreviousStatus = this.status;
|
|
315
|
-
if (this.status !== ConnectionStatus.
|
|
342
|
+
if (this.status !== ConnectionStatus.Connected) {
|
|
316
343
|
await this.connect({ progress, signal: options.signal });
|
|
317
344
|
}
|
|
318
|
-
const connection = this.
|
|
345
|
+
const connection = this.device;
|
|
319
346
|
try {
|
|
320
347
|
const boardVersion = connection.boardVersion;
|
|
321
348
|
if (!boardVersion) {
|
|
@@ -328,7 +355,7 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
328
355
|
if (!memoryMap) {
|
|
329
356
|
throw new FlashDataError("Could not convert hex to memory map");
|
|
330
357
|
}
|
|
331
|
-
if (!this.
|
|
358
|
+
if (!this.bleDevice) {
|
|
332
359
|
throw new DeviceError({
|
|
333
360
|
code: "device-disconnected",
|
|
334
361
|
message: "No device",
|
|
@@ -339,7 +366,8 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
339
366
|
if (partialFlashResult === PartialFlashResult.AttemptFullFlash) {
|
|
340
367
|
await fullFlash(connection, boardVersion, memoryMap, progress);
|
|
341
368
|
}
|
|
342
|
-
|
|
369
|
+
this.dispatchEvent("flash");
|
|
370
|
+
if (partialFlashResult === PartialFlashResult.AlreadyUpToDate ||
|
|
343
371
|
partialFlashResult === PartialFlashResult.Success) {
|
|
344
372
|
this.waitForPostFlashDisconnectPromise = (async () => {
|
|
345
373
|
try {
|
|
@@ -363,7 +391,7 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
363
391
|
}
|
|
364
392
|
}
|
|
365
393
|
})();
|
|
366
|
-
this.setStatus(ConnectionStatus.
|
|
394
|
+
this.setStatus(ConnectionStatus.Disconnected);
|
|
367
395
|
}
|
|
368
396
|
}
|
|
369
397
|
catch (e) {
|
|
@@ -379,7 +407,10 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
379
407
|
finally {
|
|
380
408
|
const previousStatus = this.deferredUpdatesPreviousStatus;
|
|
381
409
|
this.deferredUpdatesPreviousStatus = undefined;
|
|
382
|
-
this.
|
|
410
|
+
this.dispatchEvent("status", {
|
|
411
|
+
status: this.status,
|
|
412
|
+
previousStatus,
|
|
413
|
+
});
|
|
383
414
|
}
|
|
384
415
|
}
|
|
385
416
|
/**
|
|
@@ -387,22 +418,33 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
387
418
|
*
|
|
388
419
|
* @returns device or undefined if user cancels.
|
|
389
420
|
*/
|
|
390
|
-
async requestDeviceWeb(
|
|
421
|
+
async requestDeviceWeb(namePrefixes) {
|
|
422
|
+
const optionalServices = [
|
|
423
|
+
profile.accelerometer.id,
|
|
424
|
+
profile.button.id,
|
|
425
|
+
profile.deviceInformation.id,
|
|
426
|
+
profile.dfuControl.id,
|
|
427
|
+
profile.event.id,
|
|
428
|
+
profile.ioPin.id,
|
|
429
|
+
profile.led.id,
|
|
430
|
+
profile.magnetometer.id,
|
|
431
|
+
profile.temperature.id,
|
|
432
|
+
profile.uart.id,
|
|
433
|
+
];
|
|
434
|
+
// Temporarily patch navigator.bluetooth.requestDevice to support multiple
|
|
435
|
+
// name prefix filters. The capacitor-ble plugin only supports a single
|
|
436
|
+
// namePrefix, but the Web Bluetooth API supports a filters array.
|
|
437
|
+
// By patching at this level the plugin's internal deviceMap is populated
|
|
438
|
+
// naturally when its own requestDevice completes.
|
|
439
|
+
const orig = navigator.bluetooth.requestDevice.bind(navigator.bluetooth);
|
|
391
440
|
try {
|
|
441
|
+
navigator.bluetooth.requestDevice = (options) => orig({
|
|
442
|
+
...options,
|
|
443
|
+
filters: namePrefixes.map((namePrefix) => ({ namePrefix })),
|
|
444
|
+
});
|
|
392
445
|
return await BleClient.requestDevice({
|
|
393
|
-
namePrefix,
|
|
394
|
-
optionalServices
|
|
395
|
-
profile.accelerometer.id,
|
|
396
|
-
profile.button.id,
|
|
397
|
-
profile.deviceInformation.id,
|
|
398
|
-
profile.dfuControl.id,
|
|
399
|
-
profile.event.id,
|
|
400
|
-
profile.ioPin.id,
|
|
401
|
-
profile.led.id,
|
|
402
|
-
profile.magnetometer.id,
|
|
403
|
-
profile.temperature.id,
|
|
404
|
-
profile.uart.id,
|
|
405
|
-
],
|
|
446
|
+
namePrefix: namePrefixes[0],
|
|
447
|
+
optionalServices,
|
|
406
448
|
});
|
|
407
449
|
}
|
|
408
450
|
catch (e) {
|
|
@@ -411,6 +453,9 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
411
453
|
}
|
|
412
454
|
throw e;
|
|
413
455
|
}
|
|
456
|
+
finally {
|
|
457
|
+
navigator.bluetooth.requestDevice = orig;
|
|
458
|
+
}
|
|
414
459
|
}
|
|
415
460
|
/**
|
|
416
461
|
* Finds device with specified name prefix.
|
|
@@ -418,19 +463,17 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
418
463
|
* @returns device or undefined if none can be found.
|
|
419
464
|
* @throws DeviceError with code "aborted" if signal is aborted.
|
|
420
465
|
*/
|
|
421
|
-
async requestDeviceNative(
|
|
466
|
+
async requestDeviceNative(namePrefixes, signal) {
|
|
422
467
|
if (signal?.aborted) {
|
|
423
468
|
throw new DeviceError({ code: "aborted", message: "Connection aborted" });
|
|
424
469
|
}
|
|
470
|
+
const matchesAnyPrefix = (name) => !!name && namePrefixes.some((p) => name.startsWith(p));
|
|
425
471
|
// Check for existing bonded devices.
|
|
426
|
-
const bonded = await this.checkBondedDevices((device) =>
|
|
427
|
-
const name = device.name;
|
|
428
|
-
return !!name && name.startsWith(namePrefix);
|
|
429
|
-
});
|
|
472
|
+
const bonded = await this.checkBondedDevices((device) => matchesAnyPrefix(device.name));
|
|
430
473
|
if (bonded) {
|
|
431
474
|
return bonded;
|
|
432
475
|
}
|
|
433
|
-
this.log(`Scanning for device - ${
|
|
476
|
+
this.log(`Scanning for device - ${namePrefixes.join(", ")}`);
|
|
434
477
|
let found = false;
|
|
435
478
|
let aborted = false;
|
|
436
479
|
const scanPromise = new Promise((resolve) =>
|
|
@@ -440,8 +483,8 @@ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
|
|
|
440
483
|
// isn't matched by the name filter but the advertising name is in the
|
|
441
484
|
// localName on the device. So we filter here instead. This happens on
|
|
442
485
|
// iOS if DFU fails / is interrupted.
|
|
443
|
-
if (result.device.name
|
|
444
|
-
result.localName
|
|
486
|
+
if (matchesAnyPrefix(result.device.name) ||
|
|
487
|
+
matchesAnyPrefix(result.localName)) {
|
|
445
488
|
found = true;
|
|
446
489
|
await BleClient.stopLEScan();
|
|
447
490
|
resolve(result.device);
|
|
@@ -486,4 +529,4 @@ const convertDataToMemoryMap = (data) => {
|
|
|
486
529
|
}
|
|
487
530
|
return MemoryMap.fromHex(truncateHexAfterEof(data));
|
|
488
531
|
};
|
|
489
|
-
//# sourceMappingURL=
|
|
532
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/bluetooth/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAa,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAIL,gBAAgB,EAGhB,WAAW,EACX,cAAc,EACd,eAAe,EAIf,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAW,cAAc,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,YAAY,EAAE,EACnB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AASxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,IAAI,oBAAoB,GAAG,KAAK,CAAC;AAkIjC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAA4C,EACf,EAAE,CAAC,IAAI,+BAA+B,CAAC,OAAO,CAAC,CAAC;AAE/E;;GAEG;AACH,MAAM,+BACJ,SAAQ,gBAAsE;IA2B9E,YAAY,UAA8C,EAAE;QAC1D,KAAK,EAAE,CAAC;QAzBV;;;;mBAA2B,gBAAgB,CAAC,kBAAkB;WAAC;QAE/D;;;WAGG;QACK;;;;;WAAiC;QAEjC;;;;;WAAiB;QACjB;;;;;WAAiC;QACzC;;WAEG;QACK;;;;;WAA2C;QAEnD;;WAEG;QACK;;;;;WAA6C;QAE7C;;;;;WAA+B;QAC/B;;;;;WAA4D;QAC5D;;;;;WAA6D;QAInE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,cAAc,EAAE,CAAC;QACvD,IAAI,CAAC,eAAe;YAClB,OAAO,CAAC,eAAe,IAAI,IAAI,sBAAsB,EAAE,CAAC;IAC5D,CAAC;IAES,cAAc,CAAC,IAAY;QACnC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAyB,CAAC,CAAC;IAC7D,CAAC;IAES,gBAAgB,CAAC,IAAY;QACrC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAyB,CAAC,CAAC;IAC5D,CAAC;IAEO,GAAG,CAAC,CAAM;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,OAAe,EAAE,CAAW;QACxC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,UAAU,KAAmB,CAAC;IAEpC,OAAO,KAAI,CAAC;IAEZ,KAAK,CAAC,iBAAiB;QACrB,IAAI,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,6BAA6B,EAAE,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,6BAA6B;QACzC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9D,OAAO,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gCAAgC;QAC5C,IAAI,CAAC;YACH,mEAAmE;YACnE,uEAAuE;YACvE,oDAAoD;YACpD,IAAI,SAAS,EAAE,EAAE,CAAC;gBAChB,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;gBAC9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,OAAO,mBAAmB,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,qEAAqE;YACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1B,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,oBAAoB,GAAG,IAAI,CAAC;YAC9B,CAAC;YAED,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;YACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,yEAAyE;YACzE,qEAAqE;YACrE,+FAA+F;YAC/F,MAAM,YAAY,GAChB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAoB,EAAE,OAAO,IAAI,EAAE,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,yCAAyC,YAAY,GAAG,CAAC,CAAC;YAEnE,IAAI,YAAY,KAAK,uBAAuB,EAAE,CAAC;gBAC7C,OAAO,mBAAmB,CAAC;YAC7B,CAAC;YACD,IAAI,YAAY,KAAK,iBAAiB,EAAE,CAAC;gBACvC,OAAO,aAAa,CAAC;YACvB,CAAC;YAED,+CAA+C;YAC/C,OAAO,mBAAmB,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,eAAe;QACb,eAAe,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEjD,8EAA8E;QAC9E,6EAA6E;QAC7E,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACrC,kBAAkB,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEnD,uEAAuE;QACvE,2CAA2C;QAC3C,IAAI,CAAC,iCAAiC;YACpC,CAAC,MAAM,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEjD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAsB,CACtC,MAAM,EACN,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAA4C,EACtE;gBACE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,UAAU,CAAC;gBAC/D,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC;gBAC3D,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAClE,CACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,cAAc;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,SAA2B;QAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,8BAA8B,GAAG,SAAS,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,6BAA6B,KAAK,SAAS,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC3B,MAAM,EAAE,SAAS;gBACjB,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAoB;QAC9C,uEAAuE;QACvE,4EAA4E;QAC5E,+DAA+D;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU;YAClC,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,UAAU,GAAG,EAAE,SAAS,IAAI,CAAC,UAAU,GAAG,CAAC;YACrE,CAAC,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAE9B,4EAA4E;QAC5E,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC,SAAS,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,GAAG,CACN,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,4BAA4B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CACtG,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,gBAAgB,EAAE;gBAC3C,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC;gBACtD,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;gBACpD,MAAM,IAAI,WAAW,CAAC;oBACpB,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EAAE,oBAAoB;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAa;QACxC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,aAAqB;QAC9C,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAiB;QAClC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACvC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,8BAA8B;QAClC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAgB;QAC9B,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,CACT,UAA2B,EAC3B,UAAwB,EAAE;QAE1B,MAAM,QAAQ,GAAqB,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,mGAAmG;YACnG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,MAAM,CAAC;YAEjD,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAO,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;gBAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,WAAW,CAAC;wBACpB,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,wBAAwB;qBAClC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,SAAS,GAAG,sBAAsB,CACtC,MAAM,UAAU,CAAC,YAAY,CAAC,CAC/B,CAAC;gBACF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,IAAI,cAAc,CAAC,qCAAqC,CAAC,CAAC;gBAClE,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpB,MAAM,IAAI,WAAW,CAAC;wBACpB,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,WAAW;qBACrB,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;gBAE9C,MAAM,kBAAkB,GAAG,MAAM,YAAY,CAC3C,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,CACT,CAAC;gBAEF,IAAI,kBAAkB,KAAK,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;oBAC/D,MAAM,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACjE,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAE5B,IACE,kBAAkB,KAAK,kBAAkB,CAAC,eAAe;oBACzD,kBAAkB,KAAK,kBAAkB,CAAC,OAAO,EACjD,CAAC;oBACD,IAAI,CAAC,iCAAiC,GAAG,CAAC,KAAK,IAAI,EAAE;wBACnD,IAAI,CAAC;4BACH,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gCACzB,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gCACtD,MAAM,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;4BAC7C,CAAC;wBACH,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gCAC9B,IAAI,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;4BAChE,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,KAAK,CACR,iDAAiD,EACjD,CAAC,CACF,CAAC;4BACJ,CAAC;wBACH,CAAC;gCAAS,CAAC;4BACT,IAAI,CAAC,iCAAiC,GAAG,SAAS,CAAC;4BACnD,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gCACzB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;4BAC1B,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,EAAE,CAAC;oBACL,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;gBACjC,MAAM,CAAC,CAAC;YACV,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC;oBAC5C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA8B,CAAC;YAC3D,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,gBAAgB,CAC5B,YAAsB;QAEtB,MAAM,gBAAgB,GAAG;YACvB,OAAO,CAAC,aAAa,CAAC,EAAE;YACxB,OAAO,CAAC,MAAM,CAAC,EAAE;YACjB,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC5B,OAAO,CAAC,UAAU,CAAC,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,EAAE;YACd,OAAO,CAAC,YAAY,CAAC,EAAE;YACvB,OAAO,CAAC,WAAW,CAAC,EAAE;YACtB,OAAO,CAAC,IAAI,CAAC,EAAE;SAChB,CAAC;QACF,0EAA0E;QAC1E,uEAAuE;QACvE,kEAAkE;QAClE,yEAAyE;QACzE,kDAAkD;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,SAAS,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,OAA8B,EAAE,EAAE,CACrE,IAAI,CAAC;gBACH,GAAG,OAAO;gBACV,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;aAC5D,CAAC,CAAC;YACL,OAAO,MAAM,SAAS,CAAC,aAAa,CAAC;gBACnC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;gBAC3B,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC5D,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,mBAAmB,CAC/B,YAAsB,EACtB,MAAoB;QAEpB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,IAAwB,EAAE,EAAE,CACpD,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,qCAAqC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAiB,EAAE,EAAE,CACjE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAC9B,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,WAAW,GAAuB,IAAI,OAAO,CACjD,CAAC,OAAO,EAAE,EAAE;QACV,4CAA4C;QAC5C,KAAK,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChD,qEAAqE;YACrE,sEAAsE;YACtE,uEAAuE;YACvE,qCAAqC;YACrC,IACE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACpC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,EAClC,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CACL,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,gBAAgB,CACtB,OAAO,EACP,KAAK,IAAI,EAAE;gBACT,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBACvC,MAAM,CACJ,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CACpE,CAAC;YACJ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAuB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACrE,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBACxC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,EAAE,mBAAmB,CAAC,CACxB,CAAC;QACF,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,SAAyC;QACxE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjB,iBAAiB;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CACN,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,8BAA8B,CACnC,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,sBAAsB,GAAG,CAC7B,IAAqC,EAC1B,EAAE;IACb,IAAI,IAAI,YAAY,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC"}
|