meshtastic 0.0.184 → 0.0.186

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +1 -0
  3. data/Gemfile +2 -1
  4. data/documentation/README.md +5 -0
  5. data/documentation/forwarder.md +149 -0
  6. data/documentation/mesh-interface.md +157 -1
  7. data/documentation/payload-formats.md +187 -0
  8. data/documentation/reticulum.md +89 -0
  9. data/lib/meshtastic/atak.rb +98 -13
  10. data/lib/meshtastic/atak_pb.rb +3 -1
  11. data/lib/meshtastic/config_pb.rb +1 -1
  12. data/lib/meshtastic/field_metadata_pb.rb +1 -1
  13. data/lib/meshtastic/forwarder.rb +190 -0
  14. data/lib/meshtastic/forwarder_pb.rb +77 -0
  15. data/lib/meshtastic/mesh_beacon_pb.rb +1 -1
  16. data/lib/meshtastic/mesh_interface.rb +115 -65
  17. data/lib/meshtastic/mesh_pb.rb +2 -1
  18. data/lib/meshtastic/module_config_pb.rb +1 -1
  19. data/lib/meshtastic/mqtt.rb +4 -34
  20. data/lib/meshtastic/payload_compression.rb +90 -0
  21. data/lib/meshtastic/payload_formats.rb +248 -0
  22. data/lib/meshtastic/reticulum.rb +71 -0
  23. data/lib/meshtastic/serial.rb +1 -19
  24. data/lib/meshtastic/telemetry_pb.rb +2 -2
  25. data/lib/meshtastic/unishox2.rb +467 -0
  26. data/lib/meshtastic/version.rb +1 -1
  27. data/lib/meshtastic.rb +4 -0
  28. data/meshtastic.gemspec +2 -0
  29. data/spec/lib/meshtastic/atak_spec.rb +50 -0
  30. data/spec/lib/meshtastic/bluetooth_spec.rb +14 -0
  31. data/spec/lib/meshtastic/forwarder_pb_spec.rb +11 -0
  32. data/spec/lib/meshtastic/forwarder_spec.rb +97 -0
  33. data/spec/lib/meshtastic/mesh_interface_spec.rb +169 -0
  34. data/spec/lib/meshtastic/mqtt_spec.rb +56 -0
  35. data/spec/lib/meshtastic/payload_compression_spec.rb +43 -0
  36. data/spec/lib/meshtastic/payload_formats_spec.rb +160 -0
  37. data/spec/lib/meshtastic/reticulum_spec.rb +91 -0
  38. data/spec/lib/meshtastic/serial_spec.rb +46 -0
  39. data/spec/lib/meshtastic/tcp_spec.rb +15 -0
  40. data/spec/lib/meshtastic/unishox2_spec.rb +34 -0
  41. data/spec/support/payload_fixtures.rb +123 -0
  42. data/spec/support/reticulum_fixtures.json +12 -0
  43. data/spec/support/tak_codec_fixtures.rb +4 -0
  44. data/spec/support/unishox_fixtures.rb +4 -0
  45. metadata +36 -3
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ # Generated descriptor data from paulmandal/libcotshrink
3
+ # Revision: 7d818b0d119a8df291770923b463fbb734b7e1b0
4
+ # MIT License
5
+ #
6
+ # Copyright (c) 2020 paulmandal
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in all
16
+ # copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ # SOFTWARE.
25
+
26
+ require 'google/protobuf'
27
+ require 'base64'
28
+
29
+ module Meshtastic
30
+ module ForwarderProtobuf
31
+ POOL = Google::Protobuf::DescriptorPool.new
32
+ POOL.add_serialized_file(Base64.strict_decode64('ChRkZXRhaWwvY29udGFjdC5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIqMBCgdDb250YWN0EhoKCGNhbGxzaWduGAEgASgJUghjYWxsc2lnbhIiCgxlbmRwb2ludEFkZHIYAiABKAdSDGVuZHBvaW50QWRkchIUCgVwaG9uZRgDIAEoCVIFcGhvbmUSIgoMZW1haWxBZGRyZXNzGAQgASgJUgxlbWFpbEFkZHJlc3MSHgoKc2lwQWRkcmVzcxgFIAEoCFIKc2lwQWRkcmVzc0ITQg9Qcm90b2J1ZkNvbnRhY3RIA2IGcHJvdG8z'))
33
+ POOL.add_serialized_file(Base64.strict_decode64('ChFkZXRhaWwvdGFrdi5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzImQKBFRha3YSDgoCb3MYASABKAVSAm9zEhgKB3ZlcnNpb24YAiABKAlSB3ZlcnNpb24SFgoGZGV2aWNlGAMgASgJUgZkZXZpY2USGgoIcGxhdGZvcm0YBCABKAlSCHBsYXRmb3JtQhBCDFByb3RvYnVmVGFrdkgDYgZwcm90bzM='))
34
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvdW5kZXJzY29yZV9ncm91cC5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIiUKD1VuZGVyc2NvcmVHcm91cBISCgRuYW1lGAEgASgJUgRuYW1lQhtCF1Byb3RvYnVmVW5kZXJzY29yZUdyb3VwSANiBnByb3RvMw=='))
35
+ POOL.add_serialized_file(Base64.strict_decode64('ChJkZXRhaWwvdHJhY2sucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyI1CgVUcmFjaxIWCgZjb3Vyc2UYASABKAVSBmNvdXJzZRIUCgVzcGVlZBgCIAEoBVIFc3BlZWRCEUINUHJvdG9idWZUcmFja0gDYgZwcm90bzM='))
36
+ POOL.add_serialized_file(Base64.strict_decode64('ChRkZXRhaWwvcmVtYXJrcy5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIl8KB1JlbWFya3MSGAoHcmVtYXJrcxgBIAEoCVIHcmVtYXJrcxIWCgZzb3VyY2UYAiABKAlSBnNvdXJjZRIOCgJ0bxgDIAEoCVICdG8SEgoEdGltZRgEIAEoDVIEdGltZUITQg9Qcm90b2J1ZlJlbWFya3NIA2IGcHJvdG8z'))
37
+ POOL.add_serialized_file(Base64.strict_decode64('ChlkZXRhaWwvY29tcGxleF9saW5rLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMinwEKC0NvbXBsZXhMaW5rEhAKA3VpZBgBIAEoCVIDdWlkEhIKBHR5cGUYAiABKAlSBHR5cGUSJgoOcGFyZW50Q2FsbHNpZ24YAyABKAlSDnBhcmVudENhbGxzaWduEhoKCHJlbGF0aW9uGAQgASgJUghyZWxhdGlvbhImCg5wcm9kdWN0aW9uVGltZRgFIAEoBVIOcHJvZHVjdGlvblRpbWVCF0ITUHJvdG9idWZDb21wbGV4TGlua0gDYgZwcm90bzM='))
38
+ POOL.add_serialized_file(Base64.strict_decode64('ChpkZXRhaWwvZnJlZWhhbmRfbGluay5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIiIKDEZyZWVoYW5kTGluaxISCgRsaW5lGAEgASgMUgRsaW5lQhhCFFByb3RvYnVmRnJlZWhhbmRMaW5rSANiBnByb3RvMw=='))
39
+ POOL.add_serialized_file(Base64.strict_decode64('Ch9kZXRhaWwvc2VydmVyX2Rlc3RpbmF0aW9uLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiNwoRU2VydmVyRGVzdGluYXRpb24SIgoMZGVzdGluYXRpb25zGAEgASgJUgxkZXN0aW5hdGlvbnNCHUIZUHJvdG9idWZTZXJ2ZXJEZXN0aW5hdGlvbkgDYgZwcm90bzM='))
40
+ POOL.add_serialized_file(Base64.strict_decode64('ChJkZXRhaWwvbW9kZWwucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyIbCgVNb2RlbBISCgRuYW1lGAEgASgJUgRuYW1lQhFCDVByb3RvYnVmTW9kZWxIA2IGcHJvdG8z'))
41
+ POOL.add_serialized_file(Base64.strict_decode64('ChJkZXRhaWwvY29sb3IucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyIxCgVDb2xvchISCgRhcmdiGAEgASgFUgRhcmdiEhQKBXZhbHVlGAIgASgFUgV2YWx1ZUIRQg1Qcm90b2J1ZkNvbG9ySANiBnByb3RvMw=='))
42
+ POOL.add_serialized_file(Base64.strict_decode64('ChlkZXRhaWwvZGV0YWlsX3N0eWxlLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaEmRldGFpbC9jb2xvci5wcm90byK6AQoLRGV0YWlsU3R5bGUSRwoFY29sb3IYASABKAsyMS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuQ29sb3JSBWNvbG9yEiIKDHN0cm9rZVdlaWdodBgCIAEoBVIMc3Ryb2tlV2VpZ2h0EiAKC3N0cm9rZUNvbG9yGAMgASgFUgtzdHJva2VDb2xvchIcCglmaWxsQ29sb3IYBCABKAVSCWZpbGxDb2xvckIXQhNQcm90b2J1ZkRldGFpbFN0eWxlSANiBnByb3RvMw=='))
43
+ POOL.add_serialized_file(Base64.strict_decode64('ChNkZXRhaWwvaGVpZ2h0LnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiKgoGSGVpZ2h0EiAKC2hlaWdodFZhbHVlGAEgASgFUgtoZWlnaHRWYWx1ZUISQg5Qcm90b2J1ZkhlaWdodEgDYgZwcm90bzM='))
44
+ POOL.add_serialized_file(Base64.strict_decode64('ChpkZXRhaWwvc2hhcGUvZWxsaXBzZS5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIksKB0VsbGlwc2USFAoFbWFqb3IYASABKAVSBW1ham9yEhQKBW1pbm9yGAIgASgFUgVtaW5vchIUCgVhbmdsZRgDIAEoBVIFYW5nbGVCE0IPUHJvdG9idWZFbGxpcHNlSANiBnByb3RvMw=='))
45
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvc2hhcGUvbGluZV9zdHlsZS5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIjcKCUxpbmVTdHlsZRIUCgVjb2xvchgBIAEoA1IFY29sb3ISFAoFd2lkdGgYAiABKAVSBXdpZHRoQhVCEVByb3RvYnVmTGluZVN0eWxlSANiBnByb3RvMw=='))
46
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvc2hhcGUvcG9seV9zdHlsZS5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIiEKCVBvbHlTdHlsZRIUCgVjb2xvchgBIAEoA1IFY29sb3JCFUIRUHJvdG9idWZQb2x5U3R5bGVIA2IGcHJvdG8z'))
47
+ POOL.add_serialized_file(Base64.strict_decode64('ChhkZXRhaWwvc2hhcGUvc3R5bGUucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxodZGV0YWlsL3NoYXBlL2xpbmVfc3R5bGUucHJvdG8aHWRldGFpbC9zaGFwZS9wb2x5X3N0eWxlLnByb3RvIrEBCgVTdHlsZRJTCglsaW5lU3R5bGUYASABKAsyNS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuTGluZVN0eWxlUglsaW5lU3R5bGUSUwoJcG9seVN0eWxlGAIgASgLMjUuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlBvbHlTdHlsZVIJcG9seVN0eWxlQhFCDVByb3RvYnVmU3R5bGVIA2IGcHJvdG8z'))
48
+ POOL.add_serialized_file(Base64.strict_decode64('Ch9kZXRhaWwvc2hhcGUvZWxsaXBzZV9saW5rLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaGGRldGFpbC9zaGFwZS9zdHlsZS5wcm90byKYAQoLRWxsaXBzZUxpbmsSEAoDdWlkGAEgASgJUgN1aWQSEgoEdHlwZRgCIAEoCVIEdHlwZRIaCghyZWxhdGlvbhgDIAEoCVIIcmVsYXRpb24SRwoFc3R5bGUYBCABKAsyMS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuU3R5bGVSBXN0eWxlQhdCE1Byb3RvYnVmRWxsaXBzZUxpbmtIA2IGcHJvdG8z'))
49
+ POOL.add_serialized_file(Base64.strict_decode64('ChhkZXRhaWwvc2hhcGUvc2hhcGUucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxoaZGV0YWlsL3NoYXBlL2VsbGlwc2UucHJvdG8aH2RldGFpbC9zaGFwZS9lbGxpcHNlX2xpbmsucHJvdG8iowEKBVNoYXBlEk0KB2VsbGlwc2UYASABKAsyMy5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuRWxsaXBzZVIHZWxsaXBzZRJLCgRsaW5rGAIgASgLMjcuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLkVsbGlwc2VMaW5rUgRsaW5rQhFCDVByb3RvYnVmU2hhcGVIA2IGcHJvdG8z'))
50
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvc2hhcGUvc2hhcGVfbGluay5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIkEKCVNoYXBlTGluaxIQCgNsYXQYASABKBFSA2xhdBIQCgNsb24YAiABKBFSA2xvbhIQCgNoYWUYAyABKBFSA2hhZUIVQhFQcm90b2J1ZlNoYXBlTGlua0gDYgZwcm90bzM='))
51
+ POOL.add_serialized_file(Base64.strict_decode64('ChhkZXRhaWwvZHJhd25fc2hhcGUucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxodZGV0YWlsL3NoYXBlL3NoYXBlX2xpbmsucHJvdG8iVwoKRHJhd25TaGFwZRJJCgRsaW5rGAEgAygLMjUuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlNoYXBlTGlua1IEbGlua0IWQhJQcm90b2J1ZkRyYXduU2hhcGVIA2IGcHJvdG8z'))
52
+ POOL.add_serialized_file(Base64.strict_decode64('ChNkZXRhaWwvc2Vuc29yLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiigIKBlNlbnNvchIaCghmb3ZHcmVlbhgBIAEoBVIIZm92R3JlZW4SGAoHZm92Qmx1ZRgCIAEoBVIHZm92Qmx1ZRIWCgZmb3ZSZWQYAyABKAVSBmZvdlJlZBIUCgVyYW5nZRgEIAEoBVIFcmFuZ2USGAoHYXppbXV0aBgFIAEoBVIHYXppbXV0aBI6ChhkaXNwbGF5TWFnbmV0aWNSZWZlcmVuY2UYBiABKAVSGGRpc3BsYXlNYWduZXRpY1JlZmVyZW5jZRIQCgNmb3YYByABKAVSA2ZvdhIYCgdoaWRlRm92GAggASgIUgdoaWRlRm92EhoKCGZvdkFscGhhGAkgASgFUghmb3ZBbHBoYUISQg5Qcm90b2J1ZlNlbnNvckgDYgZwcm90bzM='))
53
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvcm91dGUvcm91dGVfbGluay5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIrkBCglSb3V0ZUxpbmsSEAoDdWlkGAEgASgJUgN1aWQSGgoIY2FsbHNpZ24YAiABKAlSCGNhbGxzaWduEhIKBHR5cGUYAyABKAlSBHR5cGUSEAoDbGF0GAQgASgRUgNsYXQSEAoDbG9uGAUgASgRUgNsb24SEAoDaGFlGAYgASgRUgNoYWUSGAoHcmVtYXJrcxgHIAEoCVIHcmVtYXJrcxIaCghyZWxhdGlvbhgIIAEoCVIIcmVsYXRpb25CFUIRUHJvdG9idWZSb3V0ZUxpbmtIA2IGcHJvdG8z'))
54
+ POOL.add_serialized_file(Base64.strict_decode64('ChxkZXRhaWwvcm91dGUvbGlua19hdHRyLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiOAoITGlua0F0dHISFAoFY29sb3IYASABKA1SBWNvbG9yEhYKBnByZWZpeBgCIAEoCVIGcHJlZml4QhRCEFByb3RvYnVmTGlua0F0dHJIA2IGcHJvdG8z'))
55
+ POOL.add_serialized_file(Base64.strict_decode64('ChpkZXRhaWwvcm91dGUvdHJpZ2dlci5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIjMKB1RyaWdnZXISEgoEbW9kZRgBIAEoCVIEbW9kZRIUCgV2YWx1ZRgCIAEoBVIFdmFsdWVCE0IPUHJvdG9idWZUcmlnZ2VySANiBnByb3RvMw=='))
56
+ POOL.add_serialized_file(Base64.strict_decode64('ChpkZXRhaWwvcm91dGUvbmF2X2N1ZS5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzGhpkZXRhaWwvcm91dGUvdHJpZ2dlci5wcm90byJ9CgZOYXZDdWUSFAoFdm9pY2UYASABKAlSBXZvaWNlEg4KAmlkGAIgASgJUgJpZBJNCgd0cmlnZ2VyGAMgAygLMjMuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlRyaWdnZXJSB3RyaWdnZXJCEkIOUHJvdG9idWZOYXZDdWVIA2IGcHJvdG8z'))
57
+ POOL.add_serialized_file(Base64.strict_decode64('ChtkZXRhaWwvcm91dGUvbmF2X2N1ZXMucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxoaZGV0YWlsL3JvdXRlL25hdl9jdWUucHJvdG8iVwoHTmF2Q3VlcxJMCgduYXZDdWVzGAEgAygLMjIuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLk5hdkN1ZVIHbmF2Q3Vlc0ITQg9Qcm90b2J1Zk5hdkN1ZXNIA2IGcHJvdG8z'))
58
+ POOL.add_serialized_file(Base64.strict_decode64('Ch1kZXRhaWwvcm91dGUvcm91dGVfaW5mby5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzGhtkZXRhaWwvcm91dGUvbmF2X2N1ZXMucHJvdG8iWgoJUm91dGVJbmZvEk0KB25hdkN1ZXMYASABKAsyMy5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuTmF2Q3Vlc1IHbmF2Q3Vlc0IVQhFQcm90b2J1ZlJvdXRlSW5mb0gDYgZwcm90bzM='))
59
+ POOL.add_serialized_file(Base64.strict_decode64('ChhkZXRhaWwvcm91dGUvcm91dGUucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxodZGV0YWlsL3JvdXRlL3JvdXRlX2xpbmsucHJvdG8aHGRldGFpbC9yb3V0ZS9saW5rX2F0dHIucHJvdG8aHWRldGFpbC9yb3V0ZS9yb3V0ZV9pbmZvLnByb3RvIvkBCgVSb3V0ZRJJCgRsaW5rGAEgAygLMjUuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlJvdXRlTGlua1IEbGluaxJQCghsaW5rQXR0chgCIAEoCzI0LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5MaW5rQXR0clIIbGlua0F0dHISUwoJcm91dGVJbmZvGAMgASgLMjUuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlJvdXRlSW5mb1IJcm91dGVJbmZvQhFCDVByb3RvYnVmUm91dGVIA2IGcHJvdG8z'))
60
+ POOL.add_serialized_file(Base64.strict_decode64('Ch9kZXRhaWwvZ2VvY2hhdC9jaGF0X2dyb3VwLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiLQoJQ2hhdEdyb3VwEg4KAmlkGAEgASgJUgJpZBIQCgN1aWQYAiADKAlSA3VpZEIVQhFQcm90b2J1ZkNoYXRHcm91cEgDYgZwcm90bzM='))
61
+ POOL.add_serialized_file(Base64.strict_decode64('CjJkZXRhaWwvZ2VvY2hhdC9oaWVyYXJjaHkvZ3JvdXAvZ3JvdXBfY29udGFjdC5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIjQKDEdyb3VwQ29udGFjdBIQCgN1aWQYASABKAlSA3VpZBISCgRuYW1lGAIgASgJUgRuYW1lQhhCFFByb3RvYnVmR3JvdXBDb250YWN0SANiBnByb3RvMw=='))
62
+ POOL.add_serialized_file(Base64.strict_decode64('CipkZXRhaWwvZ2VvY2hhdC9oaWVyYXJjaHkvZ3JvdXAvZ3JvdXAucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxoyZGV0YWlsL2dlb2NoYXQvaGllcmFyY2h5L2dyb3VwL2dyb3VwX2NvbnRhY3QucHJvdG8iygEKBUdyb3VwEhAKA3VpZBgBIAEoCVIDdWlkEhIKBG5hbWUYAiABKAlSBG5hbWUSUgoHY29udGFjdBgDIAMoCzI4LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5Hcm91cENvbnRhY3RSB2NvbnRhY3QSRwoFZ3JvdXAYBCABKAsyMS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuR3JvdXBSBWdyb3VwQhFCDVByb3RvYnVmR3JvdXBIA2IGcHJvdG8z'))
63
+ POOL.add_serialized_file(Base64.strict_decode64('CihkZXRhaWwvZ2VvY2hhdC9oaWVyYXJjaHkvaGllcmFyY2h5LnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaKmRldGFpbC9nZW9jaGF0L2hpZXJhcmNoeS9ncm91cC9ncm91cC5wcm90byJUCglIaWVyYXJjaHkSRwoFZ3JvdXAYASABKAsyMS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuR3JvdXBSBWdyb3VwQhVCEVByb3RvYnVmSGllcmFyY2h5SANiBnByb3RvMw=='))
64
+ POOL.add_serialized_file(Base64.strict_decode64('ChlkZXRhaWwvZ2VvY2hhdC9jaGF0LnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaH2RldGFpbC9nZW9jaGF0L2NoYXRfZ3JvdXAucHJvdG8aKGRldGFpbC9nZW9jaGF0L2hpZXJhcmNoeS9oaWVyYXJjaHkucHJvdG8i2gIKBENoYXQSFgoGcGFyZW50GAEgASgJUgZwYXJlbnQSHgoKZ3JvdXBPd25lchgCIAEoBVIKZ3JvdXBPd25lchIaCghjaGF0cm9vbRgDIAEoCVIIY2hhdHJvb20SDgoCaWQYBCABKAlSAmlkEiYKDnNlbmRlckNhbGxzaWduGAUgASgJUg5zZW5kZXJDYWxsc2lnbhJTCgljaGF0R3JvdXAYBiABKAsyNS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuQ2hhdEdyb3VwUgljaGF0R3JvdXASUwoJaGllcmFyY2h5GAcgASgLMjUuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLkhpZXJhcmNoeVIJaGllcmFyY2h5EhwKCW1lc3NhZ2VJZBgIIAEoCVIJbWVzc2FnZUlkQhBCDFByb3RvYnVmQ2hhdEgDYgZwcm90bzM='))
65
+ POOL.add_serialized_file(Base64.strict_decode64('Ch5kZXRhaWwvZ2VvY2hhdC9jaGF0X2xpbmsucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyJMCghDaGF0TGluaxIQCgN1aWQYASABKAlSA3VpZBISCgR0eXBlGAIgASgJUgR0eXBlEhoKCHJlbGF0aW9uGAMgASgJUghyZWxhdGlvbkIUQhBQcm90b2J1ZkNoYXRMaW5rSANiBnByb3RvMw=='))
66
+ POOL.add_serialized_file(Base64.strict_decode64('CiNkZXRhaWwvdmlkZW8vY29ubmVjdGlvbl9lbnRyeS5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzIs8CCg9Db25uZWN0aW9uRW50cnkSJgoObmV0d29ya1RpbWVvdXQYASABKAVSDm5ldHdvcmtUaW1lb3V0EhAKA3VpZBgCIAEoCVIDdWlkEhIKBHBhdGgYAyABKAlSBHBhdGgSGgoIcHJvdG9jb2wYBCABKAlSCHByb3RvY29sEh4KCmJ1ZmZlclRpbWUYBSABKAVSCmJ1ZmZlclRpbWUSGAoHYWRkcmVzcxgGIAEoCVIHYWRkcmVzcxISCgRwb3J0GAcgASgFUgRwb3J0EhwKCXJvdmVyUG9ydBgIIAEoEVIJcm92ZXJQb3J0EiIKDHJ0c3BSZWxpYWJsZRgJIAEoBVIMcnRzcFJlbGlhYmxlEiwKEWlnbm9yZUVtYmVkZGVkS0xWGAogASgIUhFpZ25vcmVFbWJlZGRlZEtMVhIUCgVhbGlhcxgLIAEoCVIFYWxpYXNCG0IXUHJvdG9idWZDb25uZWN0aW9uRW50cnlIA2IGcHJvdG8z'))
67
+ POOL.add_serialized_file(Base64.strict_decode64('ChhkZXRhaWwvdmlkZW8vdmlkZW8ucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxojZGV0YWlsL3ZpZGVvL2Nvbm5lY3Rpb25fZW50cnkucHJvdG8ikgEKBVZpZGVvEhAKA3VpZBgBIAEoCVIDdWlkEhAKA3VybBgCIAEoCVIDdXJsEmUKD2Nvbm5lY3Rpb25FbnRyeRgDIAMoCzI7LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5Db25uZWN0aW9uRW50cnlSD2Nvbm5lY3Rpb25FbnRyeUIRQg1Qcm90b2J1ZlZpZGVvSANiBnByb3RvMw=='))
68
+ POOL.add_serialized_file(Base64.strict_decode64('ChtkZXRhaWwvc2hhcGUvZ2VvZmVuY2UucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyLpAwoIR2VvRmVuY2USLgoSZWxldmF0aW9uTW9uaXRvcmVkGAEgASgIUhJlbGV2YXRpb25Nb25pdG9yZWQSVgoHbW9uaXRvchgCIAEoDjI8LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5HZW9GZW5jZS5Nb25pdG9yUgdtb25pdG9yElYKB3RyaWdnZXIYAyABKA4yPC5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuR2VvRmVuY2UuVHJpZ2dlclIHdHJpZ2dlchIaCgh0cmFja2luZxgEIAEoCFIIdHJhY2tpbmcSIgoMbWluRWxldmF0aW9uGAUgASgRUgxtaW5FbGV2YXRpb24SIgoMbWF4RWxldmF0aW9uGAYgASgRUgxtYXhFbGV2YXRpb24SJgoOYm91bmRpbmdTcGhlcmUYByABKAVSDmJvdW5kaW5nU3BoZXJlIigKB1RyaWdnZXISCQoFRU5UUlkQABIICgRFWElUEAESCAoEQk9USBACIkcKB01vbml0b3ISDAoIVEFLVVNFUlMQABIMCghGUklFTkRMWRABEgsKB0hPU1RJTEUQAhIKCgZDVVNUT00QAxIHCgNBTEwQBEIUQhBQcm90b2J1Zkdlb0ZlbmNlSANiBnByb3RvMw=='))
69
+ POOL.add_serialized_file(Base64.strict_decode64('Ch5kZXRhaWwvbWVkZXZhYy9mbG93X3RhZ3MucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcyJYCghGbG93VGFncxIuChJhbmRyb2lkTWVkaWNhbExpbmUYASABKAlSEmFuZHJvaWRNZWRpY2FsTGluZRIcCglvYnN0YWNsZXMYAiABKAlSCW9ic3RhY2xlc0IUQhBQcm90b2J1ZkZsb3dUYWdzSANiBnByb3RvMw=='))
70
+ POOL.add_serialized_file(Base64.strict_decode64('ChlkZXRhaWwvbWVkZXZhYy9taXN0LnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMiugEKBE1pc3QSGgoIc3ltcHRvbXMYASABKAlSCHN5bXB0b21zEhwKCXRyZWF0bWVudBgCIAEoCVIJdHJlYXRtZW50EhYKBmluanVyeRgDIAEoCVIGaW5qdXJ5EiwKEW1lY2hhbmlzbU9mSW5qdXJ5GAQgASgJUhFtZWNoYW5pc21PZkluanVyeRIcCgl6YXBOdW1iZXIYBSABKAlSCXphcE51bWJlchIUCgV0aXRsZRgGIAEoCVIFdGl0bGVCEEIMUHJvdG9idWZNaXN0SANiBnByb3RvMw=='))
71
+ POOL.add_serialized_file(Base64.strict_decode64('Ch5kZXRhaWwvbWVkZXZhYy9taXN0c19tYXAucHJvdG8SKmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcxoZZGV0YWlsL21lZGV2YWMvbWlzdC5wcm90byJSCghNaXN0c01hcBJGCgV6TWlzdBgBIAMoCzIwLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5NaXN0UgV6TWlzdEIUQhBQcm90b2J1Zk1pc3RzTWFwSANiBnByb3RvMw=='))
72
+ POOL.add_serialized_file(Base64.strict_decode64('ChxkZXRhaWwvbWVkZXZhYy9tZWRldmFjLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaHmRldGFpbC9tZWRldmFjL21pc3RzX21hcC5wcm90byKpCgoHTWVkZXZhYxIUCgV0aXRsZRgBIAEoCVIFdGl0bGUSLAoRem9uZVByb3RTZWxlY3Rpb24YAiABKAVSEXpvbmVQcm90U2VsZWN0aW9uEhIKBGZyZXEYAyABKAlSBGZyZXESFgoGdXJnZW50GAQgASgFUgZ1cmdlbnQSGgoIcHJpb3JpdHkYBSABKAVSCHByaW9yaXR5EhgKB3JvdXRpbmUYBiABKAVSB3JvdXRpbmUSFAoFaG9pc3QYByABKAhSBWhvaXN0Eh4KCnZlbnRpbGF0b3IYCCABKAhSCnZlbnRpbGF0b3ISJgoOZXF1aXBtZW50T3RoZXIYCSABKAhSDmVxdWlwbWVudE90aGVyEjAKE2V4dHJhY3Rpb25FcXVpcG1lbnQYCiABKAhSE2V4dHJhY3Rpb25FcXVpcG1lbnQSJAoNZXF1aXBtZW50Tm9uZRgLIAEoCFINZXF1aXBtZW50Tm9uZRIoCg9lcXVpcG1lbnREZXRhaWwYDCABKAlSD2VxdWlwbWVudERldGFpbBIWCgZsaXR0ZXIYDSABKAVSBmxpdHRlchIeCgphbWJ1bGF0b3J5GA4gASgFUgphbWJ1bGF0b3J5EhoKCHNlY3VyaXR5GA8gASgFUghzZWN1cml0eRIeCgpobHpNYXJraW5nGBAgASgFUgpobHpNYXJraW5nEiQKDW5vbnVzQ2l2aWxpYW4YESABKAVSDW5vbnVzQ2l2aWxpYW4SHgoKdXNDaXZpbGlhbhgSIAEoBVIKdXNDaXZpbGlhbhIUCgVjaGlsZBgTIAEoBVIFY2hpbGQSEAoDZXB3GBQgASgFUgNlcHcSHgoKdXNNaWxpdGFyeRgVIAEoBVIKdXNNaWxpdGFyeRIkCg1ub251c01pbGl0YXJ5GBYgASgFUg1ub251c01pbGl0YXJ5EiIKDHRlcnJhaW5TbG9wZRgXIAEoCFIMdGVycmFpblNsb3BlEiIKDHRlcnJhaW5Sb3VnaBgYIAEoCFIMdGVycmFpblJvdWdoEiAKC3RlcnJhaW5Ob25lGBkgASgIUgt0ZXJyYWluTm9uZRIiCgx0ZXJyYWluT3RoZXIYGiABKAhSDHRlcnJhaW5PdGhlchIiCgx0ZXJyYWluTG9vc2UYGyABKAhSDHRlcnJhaW5Mb29zZRIuChJ0ZXJyYWluT3RoZXJEZXRhaWwYHCABKAlSEnRlcnJhaW5PdGhlckRldGFpbBIoCg90ZXJyYWluU2xvcGVEaXIYHSABKAlSD3RlcnJhaW5TbG9wZURpchImCg5tZWRsaW5lUmVtYXJrcxgeIAEoCVIObWVkbGluZVJlbWFya3MSGgoIbWFya2VkQnkYHyABKAlSCG1hcmtlZEJ5EhwKCW9ic3RhY2xlcxggIAEoCVIJb2JzdGFjbGVzEiIKDHdpbmRzQXJlRnJvbRghIAEoCVIMd2luZHNBcmVGcm9tEh4KCmZyaWVuZGxpZXMYIiABKAlSCmZyaWVuZGxpZXMSFAoFZW5lbXkYIyABKAlSBWVuZW15Eh4KCmhselJlbWFya3MYJCABKAlSCmhselJlbWFya3MSGgoIaGx6T3RoZXIYJSABKAlSCGhsek90aGVyEhgKB2Nhc2V2YWMYJiABKAhSB2Nhc2V2YWMSUgoJek1pc3RzTWFwGCcgASgLMjQuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLk1pc3RzTWFwUgl6TWlzdHNNYXBCE0IPUHJvdG9idWZNZWRldmFjSANiBnByb3RvMw=='))
73
+ POOL.add_serialized_file(Base64.strict_decode64('ChNkZXRhaWwvZGV0YWlsLnByb3RvEipjb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMaFGRldGFpbC9jb250YWN0LnByb3RvGhFkZXRhaWwvdGFrdi5wcm90bxodZGV0YWlsL3VuZGVyc2NvcmVfZ3JvdXAucHJvdG8aEmRldGFpbC90cmFjay5wcm90bxoUZGV0YWlsL3JlbWFya3MucHJvdG8aGWRldGFpbC9jb21wbGV4X2xpbmsucHJvdG8aGmRldGFpbC9mcmVlaGFuZF9saW5rLnByb3RvGh9kZXRhaWwvc2VydmVyX2Rlc3RpbmF0aW9uLnByb3RvGhJkZXRhaWwvbW9kZWwucHJvdG8aGWRldGFpbC9kZXRhaWxfc3R5bGUucHJvdG8aE2RldGFpbC9oZWlnaHQucHJvdG8aGGRldGFpbC9zaGFwZS9zaGFwZS5wcm90bxoYZGV0YWlsL2RyYXduX3NoYXBlLnByb3RvGhNkZXRhaWwvc2Vuc29yLnByb3RvGhhkZXRhaWwvcm91dGUvcm91dGUucHJvdG8aGWRldGFpbC9nZW9jaGF0L2NoYXQucHJvdG8aHmRldGFpbC9nZW9jaGF0L2NoYXRfbGluay5wcm90bxoYZGV0YWlsL3ZpZGVvL3ZpZGVvLnByb3RvGhtkZXRhaWwvc2hhcGUvZ2VvZmVuY2UucHJvdG8aHmRldGFpbC9tZWRldmFjL2Zsb3dfdGFncy5wcm90bxocZGV0YWlsL21lZGV2YWMvbWVkZXZhYy5wcm90byLKDQoGRGV0YWlsEk0KB2NvbnRhY3QYASABKAsyMy5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuQ29udGFjdFIHY29udGFjdBJECgR0YWt2GAIgASgLMjAuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlRha3ZSBHRha3YSUQoFZ3JvdXAYAyABKAsyOy5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuVW5kZXJzY29yZUdyb3VwUgVncm91cBJHCgV0cmFjaxgEIAEoCzIxLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5UcmFja1IFdHJhY2sSTQoHcmVtYXJrcxgFIAEoCzIzLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5SZW1hcmtzUgdyZW1hcmtzElkKC2NvbXBsZXhMaW5rGAYgASgLMjcuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLkNvbXBsZXhMaW5rUgtjb21wbGV4TGluaxJQCghjaGF0TGluaxgHIAEoCzI0LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5DaGF0TGlua1IIY2hhdExpbmsSRAoEY2hhdBgIIAEoCzIwLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5DaGF0UgRjaGF0EmsKEXNlcnZlckRlc3RpbmF0aW9uGAkgASgLMj0uY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlNlcnZlckRlc3RpbmF0aW9uUhFzZXJ2ZXJEZXN0aW5hdGlvbhJHCgVtb2RlbBgKIAEoCzIxLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5Nb2RlbFIFbW9kZWwSWQoLZGV0YWlsU3R5bGUYCyABKAsyNy5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuRGV0YWlsU3R5bGVSC2RldGFpbFN0eWxlEkoKBmhlaWdodBgMIAEoCzIyLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5IZWlnaHRSBmhlaWdodBIgCgtpY29uU2V0UGF0aBgNIAEoCVILaWNvblNldFBhdGgSRwoFc2hhcGUYDiABKAsyMS5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuU2hhcGVSBXNoYXBlElYKCmRyYXduU2hhcGUYDyABKAsyNi5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuRHJhd25TaGFwZVIKZHJhd25TaGFwZRJHCgVyb3V0ZRgQIAEoCzIxLmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5Sb3V0ZVIFcm91dGUSSgoGc2Vuc29yGBEgASgLMjIuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlNlbnNvclIGc2Vuc29yEkcKBXZpZGVvGBIgASgLMjEuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLlZpZGVvUgV2aWRlbxJQCghnZW9GZW5jZRgTIAEoCzI0LmNvbS5wYXVsbWFuZGFsLmF0YWsubGliY290c2hyaW5rLnByb3RvYnVmcy5HZW9GZW5jZVIIZ2VvRmVuY2USXAoMZnJlZWhhbmRMaW5rGBQgASgLMjguY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLkZyZWVoYW5kTGlua1IMZnJlZWhhbmRMaW5rElAKCGZsb3dUYWdzGBUgASgLMjQuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLkZsb3dUYWdzUghmbG93VGFncxJNCgdtZWRldmFjGBYgASgLMjMuY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzLk1lZGV2YWNSB21lZGV2YWNCEkIOUHJvdG9idWZEZXRhaWxIA2IGcHJvdG8z'))
74
+ POOL.add_serialized_file(Base64.strict_decode64('Cg5jb3RldmVudC5wcm90bxIqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzGhNkZXRhaWwvZGV0YWlsLnByb3RvIooCCghDb3RFdmVudBIQCgN1aWQYASABKAlSA3VpZBISCgR0eXBlGAIgASgJUgR0eXBlEhAKA2xhdBgDIAEoEVIDbGF0EhAKA2xvbhgEIAEoEVIDbG9uEg4KAmNlGAUgASgFUgJjZRIOCgJsZRgGIAEoBVICbGUSIAoLY3VzdG9tQnl0ZXMYByABKAZSC2N1c3RvbUJ5dGVzEiYKDmN1c3RvbUJ5dGVzRXh0GAggASgGUg5jdXN0b21CeXRlc0V4dBJKCgZkZXRhaWwYCSABKAsyMi5jb20ucGF1bG1hbmRhbC5hdGFrLmxpYmNvdHNocmluay5wcm90b2J1ZnMuRGV0YWlsUgZkZXRhaWxCQAoqY29tLnBhdWxtYW5kYWwuYXRhay5saWJjb3RzaHJpbmsucHJvdG9idWZzQhBQcm90b2J1ZkNvdEV2ZW50SANiBnByb3RvMw=='))
75
+ CotEvent = POOL.lookup('com.paulmandal.atak.libcotshrink.protobufs.CotEvent').msgclass
76
+ end
77
+ end
@@ -8,7 +8,7 @@ require 'meshtastic/channel_pb'
8
8
  require 'meshtastic/config_pb'
9
9
 
10
10
 
11
- descriptor_data = "\n\x1cmeshtastic/mesh_beacon.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"\xe8\x01\n\nMeshBeacon\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x32\n\roffer_channel\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12>\n\x0coffer_region\x18\x03 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x44\n\x0coffer_preset\x18\x04 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x42\x0f\n\r_offer_presetBf\n\x14org.meshtastic.protoB\x10MeshBeaconProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
11
+ descriptor_data = "\n\x1cmeshtastic/mesh_beacon.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"\xa4\x02\n\nMeshBeacon\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x32\n\roffer_channel\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12>\n\x0coffer_region\x18\x03 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x44\n\x0coffer_preset\x18\x04 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12!\n\x14offer_frequency_slot\x18\x05 \x01(\rH\x01\x88\x01\x01\x42\x0f\n\r_offer_presetB\x17\n\x15_offer_frequency_slotBf\n\x14org.meshtastic.protoB\x10MeshBeaconProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
12
12
 
13
13
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
14
14
  pool.add_serialized_file(descriptor_data)
@@ -5,6 +5,24 @@ require 'meshtastic/mesh_pb'
5
5
  # Plugin used to interact with Meshtastic nodes
6
6
  module Meshtastic
7
7
  class MeshInterface
8
+ # Wire schemas, not similarly named transport/status messages.
9
+ PROTOBUF_PAYLOADS = {
10
+ REMOTE_HARDWARE_APP: HardwareMessage, POSITION_APP: Position, NODEINFO_APP: User,
11
+ ROUTING_APP: Routing, ADMIN_APP: AdminMessage, WAYPOINT_APP: Waypoint,
12
+ KEY_VERIFICATION_APP: KeyVerification, REMOTE_SHELL_APP: RemoteShell,
13
+ PAXCOUNTER_APP: Paxcount, STORE_FORWARD_PLUSPLUS_APP: StoreForwardPlusPlus,
14
+ NODE_STATUS_APP: StatusMessage, MESH_BEACON_APP: MeshBeacon,
15
+ STORE_FORWARD_APP: StoreAndForward, TELEMETRY_APP: Telemetry,
16
+ SIMULATOR_APP: Compressed, TRACEROUTE_APP: RouteDiscovery,
17
+ NEIGHBORINFO_APP: NeighborInfo, ATAK_PLUGIN: TAKPacket, MAP_REPORT_APP: MapReport,
18
+ POWERSTRESS_APP: PowerStressMessage, LORAWAN_BRIDGE: LoRaWANBridge, ATAK_PLUGIN_V2: TAKPacketV2
19
+ }.freeze
20
+ TEXT_PAYLOADS = %i[TEXT_MESSAGE_APP DETECTION_SENSOR_APP ALERT_APP REPLY_APP RANGE_TEST_APP].freeze
21
+ BINARY_PAYLOADS = %i[TEXT_MESSAGE_COMPRESSED_APP AUDIO_APP IP_TUNNEL_APP ZPS_APP
22
+ CAYENNE_APP LORA_OTA_APP ATAK_FORWARDER RETICULUM_TUNNEL_APP].freeze
23
+ # No guessed protobuf decoding for application-owned or undefined bytes.
24
+ RAW_PAYLOADS = %i[UNKNOWN_APP PAGING_APP SERIAL_APP GROUPALARM_APP MAX].freeze
25
+
8
26
  attr_accessor :acknowledgment,
9
27
  :config_id,
10
28
  :current_packet_id,
@@ -432,76 +450,53 @@ module Meshtastic
432
450
  end
433
451
 
434
452
  # Supported Method Parameters::
435
- # Meshtastic::MQQT.decode_payload(
436
- # payload: 'required - payload to recursively decode',
453
+ # Meshtastic::MeshInterface.decode_payload(
454
+ # payload: 'required - bytes to decode; nil decodes known proto3 defaults; unknown absent payload remains nil',
437
455
  # msg_type: 'required - message type (e.g. :TEXT_MESSAGE_APP)',
438
456
  # gps_metadata: 'optional - include GPS metadata in output (default: false)',
439
457
  # )
440
458
 
441
459
  def decode_payload(opts = {})
460
+ decode_application_payload(opts.merge(simulator_depth: 0))
461
+ end
462
+
463
+ def decode_application_payload(opts = {})
442
464
  payload = opts[:payload]
443
465
  msg_type = opts[:msg_type]
444
466
  gps_metadata = opts[:gps_metadata]
445
467
 
446
- case msg_type
447
- when :ADMIN_APP
448
- decoder = Meshtastic::AdminMessage
449
- when :ATAK_FORWARDER, :ATAK_PLUGIN
450
- decoder = Meshtastic::TAKPacket
451
- # when :AUDIO_APP
452
- # decoder = Meshtastic::Audio
453
- when :DETECTION_SENSOR_APP
454
- decoder = Meshtastic::DeviceState
455
- # when :IP_TUNNEL_APP
456
- # decoder = Meshtastic::IpTunnel
457
- when :MAP_REPORT_APP
458
- decoder = Meshtastic::MapReport
459
- # when :MAX
460
- # decoder = Meshtastic::Max
461
- when :NEIGHBORINFO_APP
462
- decoder = Meshtastic::NeighborInfo
463
- when :NODEINFO_APP
464
- decoder = Meshtastic::User
465
- when :PAXCOUNTER_APP
466
- decoder = Meshtastic::Paxcount
467
- when :POSITION_APP
468
- decoder = Meshtastic::Position
469
- # when :PRIVATE_APP
470
- # decoder = Meshtastic::Private
471
- when :RANGE_TEST_APP
472
- # Unsure if this is the correct protobuf object
473
- decoder = Meshtastic::FromRadio
474
- when :REMOTE_HARDWARE_APP
475
- decoder = Meshtastic::HardwareMessage
476
- # when :REPLY_APP
477
- # decoder = Meshtastic::Reply
478
- when :ROUTING_APP
479
- decoder = Meshtastic::Routing
480
- when :SERIAL_APP
481
- decoder = Meshtastic::SerialConnectionStatus
482
- when :SIMULATOR_APP
483
- decoder = Meshtastic::Compressed
484
- when :STORE_FORWARD_APP
485
- decoder = Meshtastic::StoreAndForward
486
- when :TELEMETRY_APP
487
- decoder = Meshtastic::Telemetry
488
- when :TEXT_MESSAGE_APP
489
- return payload.dup.force_encoding(Encoding::UTF_8).scrub
490
- when :UNKNOWN_APP
491
- decoder = Meshtastic::Data
492
- when :TRACEROUTE_APP
493
- decoder = Meshtastic::RouteDiscovery
494
- when :WAYPOINT_APP
495
- decoder = Meshtastic::Waypoint
496
- # when :ZPS_APP
497
- # decoder = Meshtastic::Zps
498
- else
499
- puts "WARNING: Can't decode\n#{payload.inspect}\nw/ portnum: #{msg_type}"
500
- return payload
468
+ msg_type = Meshtastic::PortNum.lookup(msg_type) || msg_type if msg_type.is_a?(Integer)
469
+ decoder = PROTOBUF_PAYLOADS[msg_type]
470
+ return (payload || '').dup.force_encoding(Encoding::UTF_8).scrub if TEXT_PAYLOADS.include?(msg_type)
471
+ return nil if payload.nil? && !decoder
472
+
473
+ return Meshtastic::Unishox2.decode(payload: payload) if msg_type == :TEXT_MESSAGE_COMPRESSED_APP
474
+ return Meshtastic::Forwarder.decode_packet(payload: payload) if msg_type == :ATAK_FORWARDER
475
+ return Meshtastic::Reticulum.decode_packet(payload: payload) if msg_type == :RETICULUM_TUNNEL_APP
476
+ return Meshtastic::PayloadFormats.decode(portnum: msg_type, payload: payload) if Meshtastic::PayloadFormats::PORTS.key?(msg_type)
477
+
478
+ return payload unless decoder
479
+
480
+ # Retain the next wrapper unchanged once eight simulator layers are decoded.
481
+ return payload if msg_type == :SIMULATOR_APP && opts[:simulator_depth] >= 8
482
+
483
+ payload ||= ''.b
484
+ payload = case msg_type
485
+ when :ATAK_PLUGIN
486
+ Meshtastic::ATAK.decode(portnum: msg_type, payload: payload).to_h
487
+ when :ATAK_PLUGIN_V2
488
+ payload.empty? ? {} : Meshtastic::ATAK.decode_v2(payload: payload).to_h
489
+ else
490
+ decoder.decode(payload).to_h
491
+ end
492
+ if msg_type == :SIMULATOR_APP
493
+ data = decode_application_payload(
494
+ payload: payload[:data], msg_type: payload.fetch(:portnum, 0),
495
+ gps_metadata: gps_metadata, simulator_depth: opts[:simulator_depth] + 1
496
+ )
497
+ payload[:data] = data unless data.nil?
501
498
  end
502
499
 
503
- payload = decoder.decode(payload).to_h
504
-
505
500
  if payload.keys.include?(:latitude_i)
506
501
  lat = payload[:latitude_i] * 0.0000001
507
502
  payload[:latitude] = lat
@@ -542,11 +537,57 @@ module Meshtastic
542
537
  end
543
538
 
544
539
  payload
545
- rescue Encoding::CompatibilityError,
546
- Google::Protobuf::ParseError
547
- payload
548
- rescue StandardError => e
549
- raise e
540
+ rescue StandardError
541
+ # A malformed or unavailable application codec must not stop reception.
542
+ opts[:payload]
543
+ end
544
+
545
+ private :decode_application_payload
546
+
547
+ # Decode only the selected channel key; never reinterpret PKI as PSK crypto.
548
+ # AES-CTR parsing is not authentication or proof of origin.
549
+ def decrypt_packet(opts = {})
550
+ message = opts[:message]
551
+ return message if message[:decoded] || !message.key?(:encrypted)
552
+
553
+ if message[:pki_encrypted]
554
+ message[:decryption_error] = 'PKI ciphertext requires device-owned private keys'
555
+ return message
556
+ end
557
+
558
+ channel = opts[:channel]
559
+ psks = opts[:psks] || {}
560
+ psk = psks[channel] || psks[channel.to_s] || psks[channel.to_s.to_sym] unless channel.nil?
561
+ if channel.nil?
562
+ # Encrypted radio packets carry an eight-bit name/key XOR hash, not a slot.
563
+ candidates = psks.select do |name, value|
564
+ bytes = Base64.strict_decode64(value)
565
+ [16, 32].include?(bytes.bytesize) && (name.to_s.bytes + bytes.bytes).reduce(0, :^) == message.fetch(:channel, 0)
566
+ rescue ArgumentError
567
+ false
568
+ end
569
+ psk = candidates.values.first if candidates.size == 1
570
+ end
571
+ unless psk
572
+ message[:decryption_error] = 'No PSK for the selected channel'
573
+ return message
574
+ end
575
+
576
+ key = Base64.strict_decode64(psk)
577
+ raise ArgumentError, 'PSK must contain 16 or 32 bytes' unless [16, 32].include?(key.bytesize)
578
+
579
+ cipher = OpenSSL::Cipher.new(key.bytesize == 32 ? 'AES-256-CTR' : 'AES-128-CTR')
580
+ cipher.decrypt
581
+ cipher.key = key
582
+ cipher.iv = [message.fetch(:id, 0), 0, message.fetch(:from, 0), 0].pack('V4')
583
+ ciphertext = message[:encrypted]
584
+ plaintext = (ciphertext.empty? ? ''.b : cipher.update(ciphertext)) + cipher.final
585
+ message[:decoded] = Meshtastic::Data.decode(plaintext).to_h
586
+ message[:encrypted] = :decrypted
587
+ message
588
+ rescue ArgumentError, OpenSSL::Cipher::CipherError, Google::Protobuf::ParseError
589
+ message[:decryption_error] = 'Unable to decode with the selected channel PSK'
590
+ message
550
591
  end
551
592
 
552
593
  # Author(s):: 0day Inc. <support@0dayinc.com>
@@ -612,12 +653,21 @@ module Meshtastic
612
653
  psks: 'optional - hash of :channel => psk key value pairs (default: { LongFast: \"AQ==\" })'
613
654
  )
614
655
 
656
+ # Binary codecs: Unishox2, ATAK V1/V2, Forwarder, Reticulum and PayloadFormats.
657
+ # EXI unsupported; fragments are not automatically grouped.
658
+ # PCM and experimental ZPS profiles require the direct PayloadFormats API.
615
659
  #{self}.decode_payload(
616
- payload: 'required - payload to recursively decode',
660
+ payload: 'required - bytes to decode; nil decodes known proto3 defaults; unknown absent payload remains nil',
617
661
  msg_type: 'required - message type (e.g. :TEXT_MESSAGE_APP)',
618
662
  gps_metadata: 'optional - include GPS metadata in output (default: false)',
619
663
  )
620
664
 
665
+ #{self}.decrypt_packet(
666
+ message: 'required - decoded MeshPacket hash, updated in place',
667
+ psks: 'required - channel names mapped to full Base64 AES keys',
668
+ channel: 'optional - exact MQTT channel name; omitted selects unique radio channel hash'
669
+ )
670
+
621
671
  #{self}.authors
622
672
  "
623
673
  end
@@ -13,7 +13,7 @@ require 'meshtastic/telemetry_pb'
13
13
  require 'meshtastic/xmodem_pb'
14
14
 
15
15
 
16
- descriptor_data = "\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1ameshtastic/device_ui.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\x87\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x8a\x02\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xac\x04\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\x12\x11\n\tack_proof\x18\x04 \x01(\x0c\"\xe7\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\xe5\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x12\x18\n\x10xeddsa_signature\x18\n \x01(\x0c\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 \x01(\x0c\"\xcb\x03\n\x14StoreForwardPlusPlus\x12M\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32\x32.meshtastic.StoreForwardPlusPlus.SFPP_message_type\x12\x14\n\x0cmessage_hash\x18\x02 \x01(\x0c\x12\x13\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x12\x11\n\troot_hash\x18\x04 \x01(\x0c\x12\x0f\n\x07message\x18\x05 \x01(\x0c\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\n \x01(\r\"\x95\x01\n\x11SFPP_message_type\x12\x12\n\x0e\x43\x41NON_ANNOUNCE\x10\x00\x12\x0f\n\x0b\x43HAIN_QUERY\x10\x01\x12\x10\n\x0cLINK_REQUEST\x10\x03\x12\x10\n\x0cLINK_PROVIDE\x10\x04\x12\x1a\n\x16LINK_PROVIDE_FIRSTHALF\x10\x05\x12\x1b\n\x17LINK_PROVIDE_SECONDHALF\x10\x06\"\xe3\x02\n\x0bRemoteShell\x12*\n\x02op\x18\x01 \x01(\x0e\x32\x1e.meshtastic.RemoteShell.OpCode\x12\x12\n\nsession_id\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07\x61\x63k_seq\x18\x04 \x01(\r\x12\x0f\n\x07payload\x18\x05 \x01(\x0c\x12\x0c\n\x04\x63ols\x18\x06 \x01(\r\x12\x0c\n\x04rows\x18\x07 \x01(\r\x12\r\n\x05\x66lags\x18\x08 \x01(\r\x12\x13\n\x0blast_tx_seq\x18\t \x01(\r\x12\x13\n\x0blast_rx_seq\x18\n \x01(\r\"\x8f\x01\n\x06OpCode\x12\x0c\n\x08OP_UNSET\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\t\n\x05INPUT\x10\x02\x12\n\n\x06RESIZE\x10\x03\x12\t\n\x05\x43LOSE\x10\x04\x12\x08\n\x04PING\x10\x05\x12\x07\n\x03\x41\x43K\x10\x06\x12\x0b\n\x07OPEN_OK\x10@\x12\n\n\x06OUTPUT\x10\x41\x12\n\n\x06\x43LOSED\x10\x42\x12\t\n\x05\x45RROR\x10\x43\x12\x08\n\x04PONG\x10\x44\"u\n\x0b\x42oundingBox\x12\x18\n\x10longitude_west_i\x18\x01 \x01(\x0f\x12\x18\n\x10latitude_south_i\x18\x02 \x01(\x0f\x12\x18\n\x10longitude_east_i\x18\x03 \x01(\x0f\x12\x18\n\x10latitude_north_i\x18\x04 \x01(\x0f\"\xea\x02\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\x12\x17\n\x0fgeofence_radius\x18\t \x01(\r\x12\x32\n\x0c\x62ounding_box\x18\n \x01(\x0b\x32\x17.meshtastic.BoundingBoxH\x02\x88\x01\x01\x12\x17\n\x0fnotify_on_enter\x18\x0b \x01(\x08\x12\x16\n\x0enotify_on_exit\x18\x0c \x01(\x08\x12\x1d\n\x15notify_favorites_only\x18\r \x01(\x08\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0f\n\r_bounding_box\"\x1f\n\rStatusMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\x89\x08\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x14\n\x07rx_time\x18\x07 \x01(\x07H\x01\x88\x01\x01\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x14\n\x07rx_rssi\x18\x0c \x01(\x05H\x02\x88\x01\x01\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \x01(\r\x12\x46\n\x13transport_mechanism\x18\x15 \x01(\x0e\x32).meshtastic.MeshPacket.TransportMechanism\x12\x15\n\rxeddsa_signed\x18\x16 \x01(\x08\"~\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\"\xea\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x12\x19\n\x15TRANSPORT_UNICAST_UDP\x10\x08\x42\x11\n\x0fpayload_variantB\n\n\x08_rx_timeB\n\n\x08_rx_rssi\"\x93\x03\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x01(\x0b\x32\x14.meshtastic.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12 \n\x18is_key_manually_verified\x18\x0c \x01(\x08\x12\x10\n\x08is_muted\x18\r \x01(\x08\x12\x19\n\x11has_xeddsa_signed\x18\x0e \x01(\x08\x12\x1d\n\x15heard_on_current_lora\x18\x0f \x01(\x08\x42\x0c\n\n_hops_away\"\xc1\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b \x01(\r\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\x12\x35\n\x10\x66irmware_edition\x18\x0e \x01(\x0e\x32\x1b.meshtastic.FirmwareEdition\x12\x14\n\x0cnodedb_count\x18\x0f \x01(\r\"\xc0\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12*\n\x05level\x18\x04 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xeb\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12(\n\x06packet\x18\x02 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12)\n\x07my_info\x18\x03 \x01(\x0b\x32\x16.meshtastic.MyNodeInfoH\x00\x12)\n\tnode_info\x18\x04 \x01(\x0b\x32\x14.meshtastic.NodeInfoH\x00\x12$\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12+\n\nlog_record\x18\x06 \x01(\x0b\x32\x15.meshtastic.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x30\n\x0cmoduleConfig\x18\t \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12&\n\x07\x63hannel\x18\n \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12.\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32\x17.meshtastic.QueueStatusH\x00\x12*\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12.\n\x08metadata\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12(\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x14.meshtastic.FileInfoH\x00\x12<\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\x1e.meshtastic.ClientNotificationH\x00\x12\x34\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32\x1a.meshtastic.DeviceUIConfigH\x00\x12\x35\n\x0flockdown_status\x18\x12 \x01(\x0b\x32\x1a.meshtastic.LockdownStatusH\x00\x12\x39\n\x0eregion_presets\x18\x13 \x01(\x0b\x32\x1f.meshtastic.LoRaRegionPresetMapH\x00\x42\x11\n\x0fpayload_variant\"\x93\x02\n\x0eLockdownStatus\x12/\n\x05state\x18\x01 \x01(\x0e\x32 .meshtastic.LockdownStatus.State\x12\x13\n\x0block_reason\x18\x02 \x01(\t\x12\x17\n\x0f\x62oots_remaining\x18\x03 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x04 \x01(\r\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x05 \x01(\r\"n\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x13\n\x0fNEEDS_PROVISION\x10\x01\x12\n\n\x06LOCKED\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\x0c\n\x08\x44ISABLED\x10\x05\"\xfa\x03\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12*\n\x05level\x18\x03 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\t\x12Q\n\x1ekey_verification_number_inform\x18\x0b \x01(\x0b\x32\'.meshtastic.KeyVerificationNumberInformH\x00\x12S\n\x1fkey_verification_number_request\x18\x0c \x01(\x0b\x32(.meshtastic.KeyVerificationNumberRequestH\x00\x12\x42\n\x16key_verification_final\x18\r \x01(\x0b\x32 .meshtastic.KeyVerificationFinalH\x00\x12@\n\x15\x64uplicated_public_key\x18\x0e \x01(\x0b\x32\x1f.meshtastic.DuplicatedPublicKeyH\x00\x12\x34\n\x0flow_entropy_key\x18\x0f \x01(\x0b\x32\x19.meshtastic.LowEntropyKeyH\x00\x42\x11\n\x0fpayload_variantB\x0b\n\t_reply_id\"^\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x17\n\x0fsecurity_number\x18\x03 \x01(\r\"F\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\"q\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x10\n\x08isSender\x18\x03 \x01(\x08\x12\x1f\n\x17verification_characters\x18\x04 \x01(\t\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x94\x02\n\x07ToRadio\x12(\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12*\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12*\n\theartbeat\x18\x07 \x01(\x0b\x32\x15.meshtastic.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"@\n\nCompressed\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x87\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\'\n\tneighbors\x18\x04 \x03(\x0b\x32\x14.meshtastic.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 \x01(\r\"\xeb\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 \x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 \x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 \x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 \x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12+\n\x08hw_model\x18\t \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\x12\x12\n\nhas_xeddsa\x18\x0e \x01(\x08\"\xa7\x01\n\x0fLoRaPresetGroup\x12:\n\x07presets\x18\x01 \x03(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x41\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"b\n\x11LoRaRegionPresets\x12\x38\n\x06region\x18\x01 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x13\n\x0bgroup_index\x18\x02 \x01(\r\"x\n\x13LoRaRegionPresetMap\x12+\n\x06groups\x18\x01 \x03(\x0b\x32\x1b.meshtastic.LoRaPresetGroup\x12\x34\n\rregion_groups\x18\x02 \x03(\x0b\x32\x1d.meshtastic.LoRaRegionPresets\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\r\"U\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12*\n\x03pin\x18\x02 \x01(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xaa\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12\x32\n\rresend_chunks\x18\x04 \x01(\x0b\x32\x19.meshtastic.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xdf\x16\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x15\n\x11MAKERFABS_TRACKER\x10\x1b\x12\x16\n\x12MAKERFABS_RESERVED\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0f\n\x0bT_ECHO_PLUS\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12 \n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\r\n\tMUZI_BASE\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\x12\x0b\n\x07LINK_32\x10\x62\x12\x18\n\x14SEEED_WIO_TRACKER_L1\x10\x63\x12\x1d\n\x19SEEED_WIO_TRACKER_L1_EINK\x10\x64\x12\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0b\n\x07RAK6421\x10v\x12\x10\n\x0cTHINKNODE_M4\x10w\x12\x10\n\x0cTHINKNODE_M6\x10x\x12\x12\n\x0eMESHSTICK_1262\x10y\x12\x10\n\x0cTBEAM_1_WATT\x10z\x12\x14\n\x10T5_S3_EPAPER_PRO\x10{\x12\r\n\tTBEAM_BPF\x10|\x12\x12\n\x0eMINI_EPAPER_S3\x10}\x12\x13\n\x0fTDISPLAY_S3_PRO\x10~\x12\x19\n\x15HELTEC_MESH_NODE_T096\x10\x7f\x12\x14\n\x0fMESH_TRACKER_X1\x10\x80\x01\x12\x11\n\x0cTHINKNODE_M7\x10\x81\x01\x12\x11\n\x0cTHINKNODE_M8\x10\x82\x01\x12\x11\n\x0cTHINKNODE_M9\x10\x83\x01\x12\x11\n\x0cHELTEC_V4_R8\x10\x84\x01\x12\x18\n\x13HELTEC_MESH_NODE_T1\x10\x85\x01\x12\x0f\n\nSTATION_G3\x10\x86\x01\x12\x13\n\x0eT_IMPULSE_PLUS\x10\x87\x01\x12\x10\n\x0bT_ECHO_CARD\x10\x88\x01\x12\x19\n\x14SEEED_WIO_TRACKER_L2\x10\x89\x01\x12\x11\n\x0c\x43ROWPANEL_P4\x10\x8a\x01\x12\x19\n\x14HELTEC_MESH_TOWER_V2\x10\x8b\x01\x12\x13\n\x0eMESHNOLOGY_W10\x10\x8c\x01\x12\x10\n\x0bHELTEC_RC32\x10\x8d\x01\x12\x10\n\x0bHELTEC_RC52\x10\x8e\x01\x12\x10\n\x0bHELTEC_RCC6\x10\x8f\x01\x12 \n\x1bSEEED_WIO_TRACKER_L1_PRO_1W\x10\x90\x01\x12\x13\n\x0eMESHNOLOGY_W12\x10\x91\x01\x12\x11\n\x0cMESHPAGER_X2\x10\x92\x01\x12\x12\n\rT_CONNECT_PRO\x10\x93\x01\x12\x1a\n\x15\x41XIOMETA_GENESIS_MINI\x10\x94\x01\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xe9\x01*\xb4\x02\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\xa1\x01\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x07\n\x03\x46\x41\x42\x10\x14\x12\x0e\n\nDRAGON_CON\x10\x15\x12\x07\n\x03\x43\x43\x43\x10\x16\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 \x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x42`\n\x14org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
16
+ descriptor_data = "\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1ameshtastic/device_ui.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\x87\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x8a\x02\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xac\x04\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\x12\x11\n\tack_proof\x18\x04 \x01(\x0c\"\xe7\x02\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\xe5\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x12\x18\n\x10xeddsa_signature\x18\n \x01(\x0c\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 \x01(\x0c\"\xcb\x03\n\x14StoreForwardPlusPlus\x12M\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32\x32.meshtastic.StoreForwardPlusPlus.SFPP_message_type\x12\x14\n\x0cmessage_hash\x18\x02 \x01(\x0c\x12\x13\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x12\x11\n\troot_hash\x18\x04 \x01(\x0c\x12\x0f\n\x07message\x18\x05 \x01(\x0c\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\n \x01(\r\"\x95\x01\n\x11SFPP_message_type\x12\x12\n\x0e\x43\x41NON_ANNOUNCE\x10\x00\x12\x0f\n\x0b\x43HAIN_QUERY\x10\x01\x12\x10\n\x0cLINK_REQUEST\x10\x03\x12\x10\n\x0cLINK_PROVIDE\x10\x04\x12\x1a\n\x16LINK_PROVIDE_FIRSTHALF\x10\x05\x12\x1b\n\x17LINK_PROVIDE_SECONDHALF\x10\x06\"\xe3\x02\n\x0bRemoteShell\x12*\n\x02op\x18\x01 \x01(\x0e\x32\x1e.meshtastic.RemoteShell.OpCode\x12\x12\n\nsession_id\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07\x61\x63k_seq\x18\x04 \x01(\r\x12\x0f\n\x07payload\x18\x05 \x01(\x0c\x12\x0c\n\x04\x63ols\x18\x06 \x01(\r\x12\x0c\n\x04rows\x18\x07 \x01(\r\x12\r\n\x05\x66lags\x18\x08 \x01(\r\x12\x13\n\x0blast_tx_seq\x18\t \x01(\r\x12\x13\n\x0blast_rx_seq\x18\n \x01(\r\"\x8f\x01\n\x06OpCode\x12\x0c\n\x08OP_UNSET\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\t\n\x05INPUT\x10\x02\x12\n\n\x06RESIZE\x10\x03\x12\t\n\x05\x43LOSE\x10\x04\x12\x08\n\x04PING\x10\x05\x12\x07\n\x03\x41\x43K\x10\x06\x12\x0b\n\x07OPEN_OK\x10@\x12\n\n\x06OUTPUT\x10\x41\x12\n\n\x06\x43LOSED\x10\x42\x12\t\n\x05\x45RROR\x10\x43\x12\x08\n\x04PONG\x10\x44\"u\n\x0b\x42oundingBox\x12\x18\n\x10longitude_west_i\x18\x01 \x01(\x0f\x12\x18\n\x10latitude_south_i\x18\x02 \x01(\x0f\x12\x18\n\x10longitude_east_i\x18\x03 \x01(\x0f\x12\x18\n\x10latitude_north_i\x18\x04 \x01(\x0f\"\xea\x02\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\x12\x17\n\x0fgeofence_radius\x18\t \x01(\r\x12\x32\n\x0c\x62ounding_box\x18\n \x01(\x0b\x32\x17.meshtastic.BoundingBoxH\x02\x88\x01\x01\x12\x17\n\x0fnotify_on_enter\x18\x0b \x01(\x08\x12\x16\n\x0enotify_on_exit\x18\x0c \x01(\x08\x12\x1d\n\x15notify_favorites_only\x18\r \x01(\x08\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0f\n\r_bounding_box\"\x1f\n\rStatusMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\xb4\t\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x14\n\x07rx_time\x18\x07 \x01(\x07H\x01\x88\x01\x01\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x14\n\x07rx_rssi\x18\x0c \x01(\x05H\x02\x88\x01\x01\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \x01(\r\x12\x46\n\x13transport_mechanism\x18\x15 \x01(\x0e\x32).meshtastic.MeshPacket.TransportMechanism\x12\x15\n\rxeddsa_signed\x18\x16 \x01(\x08\x12?\n\x10\x61\x63k_proof_status\x18\x17 \x01(\x0e\x32%.meshtastic.MeshPacket.AckProofStatus\"~\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\"\xea\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x12\x19\n\x15TRANSPORT_UNICAST_UDP\x10\x08\"h\n\x0e\x41\x63kProofStatus\x12\x14\n\x10\x41\x43K_PROOF_ABSENT\x10\x00\x12\x13\n\x0f\x41\x43K_PROOF_VALID\x10\x01\x12\x15\n\x11\x41\x43K_PROOF_INVALID\x10\x02\x12\x14\n\x10\x41\x43K_PROOF_NO_KEY\x10\x03\x42\x11\n\x0fpayload_variantB\n\n\x08_rx_timeB\n\n\x08_rx_rssi\"\x93\x03\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x01(\x0b\x32\x14.meshtastic.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12 \n\x18is_key_manually_verified\x18\x0c \x01(\x08\x12\x10\n\x08is_muted\x18\r \x01(\x08\x12\x19\n\x11has_xeddsa_signed\x18\x0e \x01(\x08\x12\x1d\n\x15heard_on_current_lora\x18\x0f \x01(\x08\x42\x0c\n\n_hops_away\"\xc1\x01\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b \x01(\r\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\x12\x35\n\x10\x66irmware_edition\x18\x0e \x01(\x0e\x32\x1b.meshtastic.FirmwareEdition\x12\x14\n\x0cnodedb_count\x18\x0f \x01(\r\"\xc0\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12*\n\x05level\x18\x04 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xeb\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12(\n\x06packet\x18\x02 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12)\n\x07my_info\x18\x03 \x01(\x0b\x32\x16.meshtastic.MyNodeInfoH\x00\x12)\n\tnode_info\x18\x04 \x01(\x0b\x32\x14.meshtastic.NodeInfoH\x00\x12$\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12+\n\nlog_record\x18\x06 \x01(\x0b\x32\x15.meshtastic.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x30\n\x0cmoduleConfig\x18\t \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12&\n\x07\x63hannel\x18\n \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12.\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32\x17.meshtastic.QueueStatusH\x00\x12*\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12.\n\x08metadata\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12(\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x14.meshtastic.FileInfoH\x00\x12<\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\x1e.meshtastic.ClientNotificationH\x00\x12\x34\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32\x1a.meshtastic.DeviceUIConfigH\x00\x12\x35\n\x0flockdown_status\x18\x12 \x01(\x0b\x32\x1a.meshtastic.LockdownStatusH\x00\x12\x39\n\x0eregion_presets\x18\x13 \x01(\x0b\x32\x1f.meshtastic.LoRaRegionPresetMapH\x00\x42\x11\n\x0fpayload_variant\"\x93\x02\n\x0eLockdownStatus\x12/\n\x05state\x18\x01 \x01(\x0e\x32 .meshtastic.LockdownStatus.State\x12\x13\n\x0block_reason\x18\x02 \x01(\t\x12\x17\n\x0f\x62oots_remaining\x18\x03 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x04 \x01(\r\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x05 \x01(\r\"n\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x13\n\x0fNEEDS_PROVISION\x10\x01\x12\n\n\x06LOCKED\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\x0c\n\x08\x44ISABLED\x10\x05\"\xfa\x03\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12*\n\x05level\x18\x03 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\t\x12Q\n\x1ekey_verification_number_inform\x18\x0b \x01(\x0b\x32\'.meshtastic.KeyVerificationNumberInformH\x00\x12S\n\x1fkey_verification_number_request\x18\x0c \x01(\x0b\x32(.meshtastic.KeyVerificationNumberRequestH\x00\x12\x42\n\x16key_verification_final\x18\r \x01(\x0b\x32 .meshtastic.KeyVerificationFinalH\x00\x12@\n\x15\x64uplicated_public_key\x18\x0e \x01(\x0b\x32\x1f.meshtastic.DuplicatedPublicKeyH\x00\x12\x34\n\x0flow_entropy_key\x18\x0f \x01(\x0b\x32\x19.meshtastic.LowEntropyKeyH\x00\x42\x11\n\x0fpayload_variantB\x0b\n\t_reply_id\"^\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x17\n\x0fsecurity_number\x18\x03 \x01(\r\"F\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\"q\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x10\n\x08isSender\x18\x03 \x01(\x08\x12\x1f\n\x17verification_characters\x18\x04 \x01(\t\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\x94\x02\n\x07ToRadio\x12(\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12*\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12*\n\theartbeat\x18\x07 \x01(\x0b\x32\x15.meshtastic.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"@\n\nCompressed\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x87\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\'\n\tneighbors\x18\x04 \x03(\x0b\x32\x14.meshtastic.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 \x01(\r\"\xeb\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 \x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 \x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 \x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 \x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12+\n\x08hw_model\x18\t \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\x12\x12\n\nhas_xeddsa\x18\x0e \x01(\x08\"\xa7\x01\n\x0fLoRaPresetGroup\x12:\n\x07presets\x18\x01 \x03(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x41\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"b\n\x11LoRaRegionPresets\x12\x38\n\x06region\x18\x01 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x13\n\x0bgroup_index\x18\x02 \x01(\r\"x\n\x13LoRaRegionPresetMap\x12+\n\x06groups\x18\x01 \x03(\x0b\x32\x1b.meshtastic.LoRaPresetGroup\x12\x34\n\rregion_groups\x18\x02 \x03(\x0b\x32\x1d.meshtastic.LoRaRegionPresets\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\r\"U\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12*\n\x03pin\x18\x02 \x01(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xaa\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12\x32\n\rresend_chunks\x18\x04 \x01(\x0b\x32\x19.meshtastic.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xdf\x16\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x15\n\x11MAKERFABS_TRACKER\x10\x1b\x12\x16\n\x12MAKERFABS_RESERVED\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0f\n\x0bT_ECHO_PLUS\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12 \n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\r\n\tMUZI_BASE\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\x12\x0b\n\x07LINK_32\x10\x62\x12\x18\n\x14SEEED_WIO_TRACKER_L1\x10\x63\x12\x1d\n\x19SEEED_WIO_TRACKER_L1_EINK\x10\x64\x12\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0b\n\x07RAK6421\x10v\x12\x10\n\x0cTHINKNODE_M4\x10w\x12\x10\n\x0cTHINKNODE_M6\x10x\x12\x12\n\x0eMESHSTICK_1262\x10y\x12\x10\n\x0cTBEAM_1_WATT\x10z\x12\x14\n\x10T5_S3_EPAPER_PRO\x10{\x12\r\n\tTBEAM_BPF\x10|\x12\x12\n\x0eMINI_EPAPER_S3\x10}\x12\x13\n\x0fTDISPLAY_S3_PRO\x10~\x12\x19\n\x15HELTEC_MESH_NODE_T096\x10\x7f\x12\x14\n\x0fMESH_TRACKER_X1\x10\x80\x01\x12\x11\n\x0cTHINKNODE_M7\x10\x81\x01\x12\x11\n\x0cTHINKNODE_M8\x10\x82\x01\x12\x11\n\x0cTHINKNODE_M9\x10\x83\x01\x12\x11\n\x0cHELTEC_V4_R8\x10\x84\x01\x12\x18\n\x13HELTEC_MESH_NODE_T1\x10\x85\x01\x12\x0f\n\nSTATION_G3\x10\x86\x01\x12\x13\n\x0eT_IMPULSE_PLUS\x10\x87\x01\x12\x10\n\x0bT_ECHO_CARD\x10\x88\x01\x12\x19\n\x14SEEED_WIO_TRACKER_L2\x10\x89\x01\x12\x11\n\x0c\x43ROWPANEL_P4\x10\x8a\x01\x12\x19\n\x14HELTEC_MESH_TOWER_V2\x10\x8b\x01\x12\x13\n\x0eMESHNOLOGY_W10\x10\x8c\x01\x12\x10\n\x0bHELTEC_RC32\x10\x8d\x01\x12\x10\n\x0bHELTEC_RC52\x10\x8e\x01\x12\x10\n\x0bHELTEC_RCC6\x10\x8f\x01\x12 \n\x1bSEEED_WIO_TRACKER_L1_PRO_1W\x10\x90\x01\x12\x13\n\x0eMESHNOLOGY_W12\x10\x91\x01\x12\x11\n\x0cMESHPAGER_X2\x10\x92\x01\x12\x12\n\rT_CONNECT_PRO\x10\x93\x01\x12\x1a\n\x15\x41XIOMETA_GENESIS_MINI\x10\x94\x01\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xe9\x01*\xb4\x02\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\xa1\x01\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x07\n\x03\x46\x41\x42\x10\x14\x12\x0e\n\nDRAGON_CON\x10\x15\x12\x07\n\x03\x43\x43\x43\x10\x16\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\xe7\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 \x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x12\x1a\n\x14STATUSMESSAGE_CONFIG\x10\x80\x80\x02\x12\x1e\n\x18TRAFFICMANAGEMENT_CONFIG\x10\x80\x80\x04\x12\x10\n\nTAK_CONFIG\x10\x80\x80\x08\x12\x17\n\x11MESHBEACON_CONFIG\x10\x80\x80\x10\x42`\n\x14org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
17
17
 
18
18
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
19
19
  pool.add_serialized_file(descriptor_data)
@@ -40,6 +40,7 @@ module Meshtastic
40
40
  MeshPacket::Priority = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MeshPacket.Priority").enummodule
41
41
  MeshPacket::Delayed = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MeshPacket.Delayed").enummodule
42
42
  MeshPacket::TransportMechanism = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MeshPacket.TransportMechanism").enummodule
43
+ MeshPacket::AckProofStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MeshPacket.AckProofStatus").enummodule
43
44
  NodeInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.NodeInfo").msgclass
44
45
  MyNodeInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.MyNodeInfo").msgclass
45
46
  LogRecord = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("meshtastic.LogRecord").msgclass
@@ -10,7 +10,7 @@ require 'meshtastic/config_pb'
10
10
  require 'meshtastic/field_metadata_pb'
11
11
 
12
12
 
13
- descriptor_data = "\n\x1emeshtastic/module_config.proto\x12\nmeshtastic\x1a\x15meshtastic/atak.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1fmeshtastic/field_metadata.proto\"\xf7\x63\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x12\x45\n\rstatusmessage\x18\x0e \x01(\x0b\x32,.meshtastic.ModuleConfig.StatusMessageConfigH\x00\x12N\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x30.meshtastic.ModuleConfig.TrafficManagementConfigH\x00\x12\x31\n\x03tak\x18\x10 \x01(\x0b\x32\".meshtastic.ModuleConfig.TAKConfigH\x00\x12@\n\x0bmesh_beacon\x18\x11 \x01(\x0b\x32).meshtastic.ModuleConfig.MeshBeaconConfigH\x00\x1a\xde\x06\n\nMQTTConfig\x12#\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x12\xca\xf3\x18\x0e:\x0cMQTT Enabled\x12\x1e\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\r\xca\xf3\x18\t:\x07\x41\x64\x64ress\x12 \n\x08username\x18\x03 \x01(\tB\x0e\xca\xf3\x18\n:\x08Username\x12 \n\x08password\x18\x04 \x01(\tB\x0e\xca\xf3\x18\n:\x08Password\x12\x34\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x42\x18\xca\xf3\x18\x14:\x12\x45ncryption Enabled\x12\x18\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\x02\x18\x01\x12^\n\x0btls_enabled\x18\x07 \x01(\x08\x42I\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12\x1e\n\x04root\x18\x08 \x01(\tB\x10\xca\xf3\x18\x0c:\nRoot Topic\x12{\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x42Z\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xb0\x02\n\x15map_reporting_enabled\x18\n \x01(\x08\x42\x90\x02\xca\xf3\x18\x8b\x02:\rMap ReportingB\xf9\x01Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1a\x9e\x02\n\x11MapReportSettings\x12<\n\x15publish_interval_secs\x18\x01 \x01(\rB\x1d\xca\xf3\x18\x19*\x01s:\x14Map Publish Interval\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\xae\x01\n\x16should_report_location\x18\x03 \x01(\x08\x42\x8d\x01\xca\xf3\x18\x88\x01:\x0fReport LocationBuI have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a\xba\x03\n\x12NeighborInfoConfig\x12\xb2\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xa0\x01\xca\xf3\x18\x9b\x01:\x15Neighbor Info EnabledB\x81\x01\x45nable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.\x12\x31\n\x0fupdate_interval\x18\x02 \x01(\rB\x18\xca\xf3\x18\x14*\x01s:\x0fUpdate Interval\x12\xbb\x01\n\x12transmit_over_lora\x18\x03 \x01(\x08\x42\x9e\x01\xca\xf3\x18\x99\x01:\x12Transmit over LoRaB\x82\x01Whether to transmit neighbor info over LoRa in addition to MQTT and PhoneAPI. Not available on channels with default key and name.\x1a\x9a\x08\n\x15\x44\x65tectionSensorConfig\x12\x83\x02\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xf1\x01\xca\xf3\x18\xec\x01:\x18\x44\x65tection Sensor EnabledB\xcf\x01\x45nables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.\x12R\n\x16minimum_broadcast_secs\x18\x02 \x01(\rB2\xca\xf3\x18.*\x01s:)Minimum time between detection broadcasts\x12?\n\x14state_broadcast_secs\x18\x03 \x01(\rB!\xca\xf3\x18\x1d*\x01s:\x18State Broadcast Interval\x12|\n\tsend_bell\x18\x04 \x01(\x08\x42i\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\x18\n\x04name\x18\x05 \x01(\tB\n\xca\xf3\x18\x06:\x04Name\x12.\n\x0bmonitor_pin\x18\x06 \x01(\rB\x19\xca\xf3\x18\x15:\x13GPIO Pin to monitor\x12m\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32:.meshtastic.ModuleConfig.DetectionSensorConfig.TriggerTypeB\x11\xca\xf3\x18\r:\x0bTriggerType\x12\xa3\x01\n\nuse_pullup\x18\x08 \x01(\x08\x42\x8e\x01\xca\xf3\x18\x89\x01:\x14Uses pullup resistorBqWhether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin\"\x88\x01\n\x0bTriggerType\x12\r\n\tLOGIC_LOW\x10\x00\x12\x0e\n\nLOGIC_HIGH\x10\x01\x12\x10\n\x0c\x46\x41LLING_EDGE\x10\x02\x12\x0f\n\x0bRISING_EDGE\x10\x03\x12\x1a\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x12\x1b\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\xe4\x05\n\x0b\x41udioConfig\x12z\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x42\x62\xca\xf3\x18^:\x0e\x43odec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.\x12=\n\x07ptt_pin\x18\x02 \x01(\rB,\xca\xf3\x18(:\x07PTT PinB\x1dPush-to-talk GPIO pin number.\x12\xca\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_BaudB\x87\x01\xca\xf3\x18\x82\x01:\x07\x42itrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.\x12\x1c\n\x06i2s_ws\x18\x04 \x01(\rB\x0c\xca\xf3\x18\x08:\x06I2S WS\x12\x1c\n\x06i2s_sd\x18\x05 \x01(\rB\x0c\xca\xf3\x18\x08:\x06I2S SD\x12\x1e\n\x07i2s_din\x18\x06 \x01(\rB\r\xca\xf3\x18\t:\x07I2S DIN\x12\x1e\n\x07i2s_sck\x18\x07 \x01(\rB\r\xca\xf3\x18\t:\x07I2S SCK\"\xd0\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x12\n\nCODEC2_700\x10\x07\x1a\x02\x08\x01\x12\x13\n\x0b\x43ODEC2_700B\x10\x08\x1a\x02\x08\x01\x12\x0f\n\x0b\x43ODEC2_700C\x10\t\x12\x0e\n\nCODEC2_450\x10\n\x1a\x81\x04\n\x10PaxcounterConfig\x12\xd5\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xc3\x01\xca\xf3\x18\xbe\x01:\x13PAX Counter EnabledB\xa6\x01When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work.\x12<\n\x1apaxcounter_update_interval\x18\x02 \x01(\rB\x18\xca\xf3\x18\x14*\x01s:\x0fUpdate Interval\x12l\n\x0ewifi_threshold\x18\x03 \x01(\x05\x42T\xca\xf3\x18P:\x0eWiFi ThresholdB>RSSI threshold for WiFi device counting. Default is \xe2\x88\x92\x38\x30 dBm.\x12i\n\rble_threshold\x18\x04 \x01(\x05\x42R\xca\xf3\x18N:\rBLE ThresholdB=RSSI threshold for BLE device counting. Default is \xe2\x88\x92\x38\x30 dBm.\x1a\xc2\x05\n\x17TrafficManagementConfig\x12\x46\n\x1aposition_min_interval_secs\x18\x04 \x01(\rB\"\xca\xf3\x18\x1e*\x01s:\x19Minimum Position Interval\x12I\n!nodeinfo_direct_response_max_hops\x18\x06 \x01(\rB\x1e\xca\xf3\x18\x1a:\x18\x44irect NodeInfo Max Hops\x12:\n\x16rate_limit_window_secs\x18\x08 \x01(\rB\x1a\xca\xf3\x18\x16*\x01s:\x11Rate Limit Window\x12l\n\x16rate_limit_max_packets\x18\t \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x0b \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08J\x04\x08\n\x10\x0bJ\x04\x08\x0c\x10\rJ\x04\x08\r\x10\x0eJ\x04\x08\x0e\x10\x0fR\x07\x65nabledR\x16position_dedup_enabledR\x17position_precision_bitsR\x18nodeinfo_direct_responseR\x12rate_limit_enabledR\x14\x64rop_unknown_enabledR\x15\x65xhaust_hop_telemetryR\x14\x65xhaust_hop_positionR\x14router_preserve_hops\x1a\xe5\t\n\x0cSerialConfig\x12%\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x14\xca\xf3\x18\x10:\x0eSerial Enabled\x12Z\n\x04\x65\x63ho\x18\x02 \x01(\x08\x42L\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12.\n\x03rxd\x18\x03 \x01(\rB!\xca\xf3\x18\x1d:\x1bReceive data (rxd) GPIO pin\x12/\n\x03txd\x18\x04 \x01(\rB\"\xca\xf3\x18\x1e:\x1cTransmit data (txd) GPIO pin\x12K\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_BaudB\n\xca\xf3\x18\x06:\x04\x42\x61ud\x12\x1e\n\x07timeout\x18\x06 \x01(\rB\r\xca\xf3\x18\t:\x07Timeout\x12K\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_ModeB\n\xca\xf3\x18\x06:\x04Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\xa2\x04\n\x0bSerial_Baud\x12\x1f\n\x0c\x42\x41UD_DEFAULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x1c\n\x08\x42\x41UD_110\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08\x31\x31\x30 Baud\x12\x1c\n\x08\x42\x41UD_300\x10\x02\x1a\x0e\xca\xf3\x18\n:\x08\x33\x30\x30 Baud\x12\x1c\n\x08\x42\x41UD_600\x10\x03\x1a\x0e\xca\xf3\x18\n:\x08\x36\x30\x30 Baud\x12\x1e\n\tBAUD_1200\x10\x04\x1a\x0f\xca\xf3\x18\x0b:\t1200 Baud\x12\x1e\n\tBAUD_2400\x10\x05\x1a\x0f\xca\xf3\x18\x0b:\t2400 Baud\x12\x1e\n\tBAUD_4800\x10\x06\x1a\x0f\xca\xf3\x18\x0b:\t4800 Baud\x12\x1e\n\tBAUD_9600\x10\x07\x1a\x0f\xca\xf3\x18\x0b:\t9600 Baud\x12 \n\nBAUD_19200\x10\x08\x1a\x10\xca\xf3\x18\x0c:\n19200 Baud\x12 \n\nBAUD_38400\x10\t\x1a\x10\xca\xf3\x18\x0c:\n38400 Baud\x12 \n\nBAUD_57600\x10\n\x1a\x10\xca\xf3\x18\x0c:\n57600 Baud\x12\"\n\x0b\x42\x41UD_115200\x10\x0b\x1a\x11\xca\xf3\x18\r:\x0b\x31\x31\x35\x32\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_230400\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0b\x32\x33\x30\x34\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_460800\x10\r\x1a\x11\xca\xf3\x18\r:\x0b\x34\x36\x30\x38\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_576000\x10\x0e\x1a\x11\xca\xf3\x18\r:\x0b\x35\x37\x36\x30\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_921600\x10\x0f\x1a\x11\xca\xf3\x18\r:\x0b\x39\x32\x31\x36\x30\x30 Baud\"\xeb\x01\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x18\n\x06SIMPLE\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06Simple\x12\x1a\n\x05PROTO\x10\x02\x1a\x0f\xca\xf3\x18\x0b:\tProtobufs\x12\x1f\n\x07TEXTMSG\x10\x03\x1a\x12\xca\xf3\x18\x0e:\x0cText Message\x12\x1e\n\x04NMEA\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0eNMEA Positions\x12\x1a\n\x07\x43\x41LTOPO\x10\x05\x1a\r\xca\xf3\x18\t:\x07\x43\x41LTOPO\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\x12\r\n\tMS_CONFIG\x10\x08\x12\x07\n\x03LOG\x10\t\x12\x0b\n\x07LOGTEXT\x10\n\x1a\xb1\n\n\x1a\x45xternalNotificationConfig\x12\x34\n\x07\x65nabled\x18\x01 \x01(\x08\x42#\xca\xf3\x18\x1f:\x1d\x45xternal Notification Enabled\x12\x31\n\toutput_ms\x18\x02 \x01(\rB\x1e\xca\xf3\x18\x1a*\x02ms:\x14GPIO Output Duration\x12%\n\x06output\x18\x03 \x01(\rB\x15\xca\xf3\x18\x11:\x0fOutput pin GPIO\x12\x31\n\x0coutput_vibra\x18\x08 \x01(\rB\x1b\xca\xf3\x18\x17:\x15Output pin vibra GPIO\x12\x33\n\routput_buzzer\x18\t \x01(\rB\x1c\xca\xf3\x18\x18:\x16Output pin buzzer GPIO\x12q\n\x06\x61\x63tive\x18\x04 \x01(\x08\x42\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12;\n\ralert_message\x18\x05 \x01(\x08\x42$\xca\xf3\x18 :\x1e\x41lert when receiving a message\x12\x65\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x42H\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12N\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x42\x30\xca\xf3\x18,:*Alert GPIO buzzer when receiving a message\x12\x35\n\nalert_bell\x18\x06 \x01(\x08\x42!\xca\xf3\x18\x1d:\x1b\x41lert when receiving a bell\x12L\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x42\x32\xca\xf3\x18.:,Alert GPIO vibra motor when receiving a bell\x12H\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x42-\xca\xf3\x18):\'Alert GPIO buzzer when receiving a bell\x12\xee\x01\n\x07use_pwm\x18\x07 \x01(\x08\x42\xdc\x01\xca\xf3\x18\xd7\x01:\x0eUse PWM BuzzerB\xc4\x01Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.\x12)\n\x0bnag_timeout\x18\x0e \x01(\rB\x14\xca\xf3\x18\x10*\x01s:\x0bNag Timeout\x12\xc8\x01\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x42\xac\x01\xca\xf3\x18\xa7\x01:\x11Use I2S As BuzzerB\x91\x01\x45nables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.\x1a\xe1\x03\n\x12StoreForwardConfig\x12W\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12]\n\theartbeat\x18\x02 \x01(\x08\x42J\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12(\n\x07records\x18\x03 \x01(\rB\x17\xca\xf3\x18\x13:\x11Number of records\x12\x34\n\x12history_return_max\x18\x04 \x01(\rB\x18\xca\xf3\x18\x14:\x12History Return Max\x12:\n\x15history_return_window\x18\x05 \x01(\rB\x1b\xca\xf3\x18\x17:\x15History Return Window\x12w\n\tis_server\x18\x06 \x01(\x08\x42\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x1a\x86\x02\n\x0fRangeTestConfig\x12)\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x18\xca\xf3\x18\x14:\x12Range Test Enabled\x12%\n\x06sender\x18\x02 \x01(\rB\x15\xca\xf3\x18\x11:\x0fSender Interval\x12\x87\x01\n\x04save\x18\x03 \x01(\x08\x42y\xca\xf3\x18u:\x04SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.\x12\x17\n\x0f\x63lear_on_reboot\x18\x04 \x01(\x08\x1a\xe9\x07\n\x0fTelemetryConfig\x12@\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\rB \xca\xf3\x18\x1c*\x01s:\x17\x44\x65vice Metrics Interval\x12J\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\rB%\xca\xf3\x18!*\x01s:\x1c\x45nvironment Metrics Interval\x12J\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x42!\xca\xf3\x18\x1d:\x1b\x45nvironment Metrics Enabled\x12?\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x42\x1b\xca\xf3\x18\x17:\x15Show on device screen\x12@\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x42\x18\xca\xf3\x18\x14:\x12\x44isplay Fahrenheit\x12>\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x42!\xca\xf3\x18\x1d:\x1b\x41ir Quality Metrics Enabled\x12\x43\n\x14\x61ir_quality_interval\x18\x07 \x01(\rB%\xca\xf3\x18!*\x01s:\x1c\x41ir Quality Metrics Interval\x12\x42\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x42\x1f\xca\xf3\x18\x1b:\x19Power Measurement Enabled\x12>\n\x15power_update_interval\x18\t \x01(\rB\x1f\xca\xf3\x18\x1b*\x01s:\x16Power Metrics Interval\x12\x30\n\x14power_screen_enabled\x18\n \x01(\x08\x42\x12\xca\xf3\x18\x0e:\x0cPower Screen\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x12\xb6\x01\n\x18\x64\x65vice_telemetry_enabled\x18\x0e \x01(\x08\x42\x93\x01\xca\xf3\x18\x8e\x01:\x18\x42roadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.\x12\"\n\x1a\x61ir_quality_screen_enabled\x18\x0f \x01(\x08\x1a\xff\x06\n\x13\x43\x61nnedMessageConfig\x12\'\n\x0frotary1_enabled\x18\x01 \x01(\x08\x42\x0e\xca\xf3\x18\n:\x08Rotary 1\x12&\n\x11inputbroker_pin_a\x18\x02 \x01(\rB\x0b\xca\xf3\x18\x07:\x05Pin A\x12&\n\x11inputbroker_pin_b\x18\x03 \x01(\rB\x0b\xca\xf3\x18\x07:\x05Pin B\x12.\n\x15inputbroker_pin_press\x18\x04 \x01(\rB\x0f\xca\xf3\x18\x0b:\tPress Pin\x12w\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharB\x1c\xca\xf3\x18\x18:\x16\x43lockwise Rotary Event\x12\x80\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharB$\xca\xf3\x18 :\x1e\x43ounter Clockwise Rotary Event\x12w\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharB\x19\xca\xf3\x18\x15:\x13\x45ncoder Press Event\x12(\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x42\x0f\xca\xf3\x18\x0b:\tUp Down 1\x12\x13\n\x07\x65nabled\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1e\n\x12\x61llow_input_source\x18\n \x01(\tB\x02\x18\x01\x12\"\n\tsend_bell\x18\x0b \x01(\x08\x42\x0f\xca\xf3\x18\x0b:\tSend Bell\"\xc6\x01\n\x0eInputEventChar\x12\x14\n\x04NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x10\n\x02UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x14\n\x04\x44OWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x14\n\x04LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x16\n\x05RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x18\n\x06SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x14\n\x04\x42\x41\x43K\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x18\n\x06\x43\x41NCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x1a\xd1\x04\n\x15\x41mbientLightingConfig\x12\x41\n\tled_state\x18\x01 \x01(\x08\x42.\xca\xf3\x18*:\tLED StateB\x1dThe state of the LED (on/off)\x12t\n\x07\x63urrent\x18\x02 \x01(\rBc\xca\xf3\x18_\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00?@:\x07\x43urrentB!Drive current for the LED output.J\x1fled|brightness|ambient|lighting\x12{\n\x03red\x18\x03 \x01(\rBn\xca\xf3\x18j\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x03RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12\x81\x01\n\x05green\x18\x04 \x01(\rBr\xca\xf3\x18n\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x05GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12~\n\x04\x62lue\x18\x05 \x01(\rBp\xca\xf3\x18l\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x04\x42lueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x1a*\n\x13StatusMessageConfig\x12\x13\n\x0bnode_status\x18\x01 \x01(\t\x1a\xe3\x06\n\x10MeshBeaconConfig\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12(\n\x11\x62roadcast_message\x18\x04 \x01(\tB\r\xca\xf3\x18\t:\x07Message\x12<\n\x17\x62roadcast_offer_channel\x18\x05 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12H\n\x16\x62roadcast_offer_region\x18\x06 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12N\n\x16\x62roadcast_offer_preset\x18\x07 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12\x32\n\x17\x62roadcast_interval_secs\x18\x0b \x01(\rB\x11\xca\xf3\x18\r*\x01s:\x08Interval\x12T\n\x11\x62roadcast_targets\x18\r \x03(\x0b\x32\x39.meshtastic.ModuleConfig.MeshBeaconConfig.BroadcastTarget\x1a\xc4\x01\n\x0f\x42roadcastTarget\x12>\n\x06preset\x18\x01 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12\x38\n\x06region\x18\x02 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x1a\n\rchannel_index\x18\x04 \x01(\rH\x01\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_index\"b\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x17\n\x13\x46LAG_LISTEN_ENABLED\x10\x01\x12\x1a\n\x16\x46LAG_BROADCAST_ENABLED\x10\x02\x12\x15\n\x11\x46LAG_LEGACY_SPLIT\x10\x04\x42\x19\n\x17_broadcast_offer_presetJ\x04\x08\x03\x10\x04J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bR\x16\x62roadcast_send_as_nodeR\x14\x62roadcast_on_channelR\x13\x62roadcast_on_regionR\x13\x62roadcast_on_preset\x1ai\n\tTAKConfig\x12*\n\x04team\x18\x01 \x01(\x0e\x32\x10.meshtastic.TeamB\n\xca\xf3\x18\x06:\x04Team\x12\x30\n\x04role\x18\x02 \x01(\x0e\x32\x16.meshtastic.MemberRoleB\n\xca\xf3\x18\x06:\x04RoleB\x11\n\x0fpayload_variant\"d\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.meshtastic.RemoteHardwarePinType*I\n\x15RemoteHardwarePinType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0c\x44IGITAL_READ\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x42h\n\x14org.meshtastic.protoB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
13
+ descriptor_data = "\n\x1emeshtastic/module_config.proto\x12\nmeshtastic\x1a\x15meshtastic/atak.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1fmeshtastic/field_metadata.proto\"\xadx\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x12S\n\rstatusmessage\x18\x0e \x01(\x0b\x32,.meshtastic.ModuleConfig.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12[\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x30.meshtastic.ModuleConfig.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12>\n\x03tak\x18\x10 \x01(\x0b\x32\".meshtastic.ModuleConfig.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12M\n\x0bmesh_beacon\x18\x11 \x01(\x0b\x32).meshtastic.ModuleConfig.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x1a\xe2\x07\n\nMQTTConfig\x12\x38\n\x07\x65nabled\x18\x01 \x01(\x08\x42\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12\x33\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\"\xca\xf3\x18\x1e:\x07\x41\x64\x64ressB\x13MQTT server address\x12/\n\x08username\x18\x03 \x01(\tB\x1d\xca\xf3\x18\x19:\x08UsernameB\rMQTT username\x12/\n\x08password\x18\x04 \x01(\tB\x1d\xca\xf3\x18\x19:\x08PasswordB\rMQTT password\x12T\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x42\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12#\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.8.0\x12^\n\x0btls_enabled\x18\x07 \x01(\x08\x42I\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12/\n\x04root\x18\x08 \x01(\tB!\xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12{\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x42Z\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xb0\x02\n\x15map_reporting_enabled\x18\n \x01(\x08\x42\x90\x02\xca\xf3\x18\x8b\x02:\rMap ReportingB\xf9\x01Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1a\xcb\x02\n\x11MapReportSettings\x12\x62\n\x15publish_interval_secs\x18\x01 \x01(\rBC\xca\xf3\x18?*\x01s:\x14Map Publish IntervalB$How often a map report is published.\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\xb5\x01\n\x16should_report_location\x18\x03 \x01(\x08\x42\x94\x01\xca\xf3\x18\x8f\x01:\x0fReport LocationBuI have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.R\x05\x32.6.8\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a\xe1\x03\n\x12NeighborInfoConfig\x12\xb2\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xa0\x01\xca\xf3\x18\x9b\x01:\x15Neighbor Info EnabledB\x81\x01\x45nable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.\x12X\n\x0fupdate_interval\x18\x02 \x01(\rB?\xca\xf3\x18;*\x01s:\x0fUpdate IntervalB%How often to broadcast neighbor info.\x12\xbb\x01\n\x12transmit_over_lora\x18\x03 \x01(\x08\x42\x9e\x01\xca\xf3\x18\x99\x01:\x12Transmit over LoRaB\x82\x01Whether to transmit neighbor info over LoRa in addition to MQTT and PhoneAPI. Not available on channels with default key and name.\x1a\xf2\n\n\x15\x44\x65tectionSensorConfig\x12\x83\x02\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xf1\x01\xca\xf3\x18\xec\x01:\x18\x44\x65tection Sensor EnabledB\xcf\x01\x45nables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.\x12~\n\x16minimum_broadcast_secs\x18\x02 \x01(\rB^\xca\xf3\x18Z*\x01s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.\x12\xa1\x01\n\x14state_broadcast_secs\x18\x03 \x01(\rB\x82\x01\xca\xf3\x18~*\x01s:\x18State Broadcast IntervalB_How often to send the detection sensor state to the mesh, whether or not anything was detected.\x12|\n\tsend_bell\x18\x04 \x01(\x08\x42i\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12\x37\n\x04name\x18\x05 \x01(\tB)\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12S\n\x0bmonitor_pin\x18\x06 \x01(\rB>\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x84\x01\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32:.meshtastic.ModuleConfig.DetectionSensorConfig.TriggerTypeB(\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\x12\xa3\x01\n\nuse_pullup\x18\x08 \x01(\x08\x42\x8e\x01\xca\xf3\x18\x89\x01:\x14Uses pullup resistorBqWhether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin\"\xf5\x01\n\x0bTriggerType\x12\x18\n\tLOGIC_LOW\x10\x00\x1a\t\xca\xf3\x18\x05:\x03Low\x12\x1a\n\nLOGIC_HIGH\x10\x01\x1a\n\xca\xf3\x18\x06:\x04High\x12$\n\x0c\x46\x41LLING_EDGE\x10\x02\x1a\x12\xca\xf3\x18\x0e:\x0c\x46\x61lling Edge\x12\"\n\x0bRISING_EDGE\x10\x03\x1a\x11\xca\xf3\x18\r:\x0bRising Edge\x12\x31\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x1a\x15\xca\xf3\x18\x11:\x0f\x45ither Edge Low\x12\x33\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\x16\xca\xf3\x18\x12:\x10\x45ither Edge High\x1a\xf2\x06\n\x0b\x41udioConfig\x12z\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x42\x62\xca\xf3\x18^:\x0e\x43odec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.\x12=\n\x07ptt_pin\x18\x02 \x01(\rB,\xca\xf3\x18(:\x07PTT PinB\x1dPush-to-talk GPIO pin number.\x12\xca\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_BaudB\x87\x01\xca\xf3\x18\x82\x01:\x07\x42itrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.\x12\x1c\n\x06i2s_ws\x18\x04 \x01(\rB\x0c\xca\xf3\x18\x08:\x06I2S WS\x12\x1c\n\x06i2s_sd\x18\x05 \x01(\rB\x0c\xca\xf3\x18\x08:\x06I2S SD\x12\x1e\n\x07i2s_din\x18\x06 \x01(\rB\r\xca\xf3\x18\t:\x07I2S DIN\x12\x1e\n\x07i2s_sck\x18\x07 \x01(\rB\r\xca\xf3\x18\t:\x07I2S SCK\"\xde\x02\n\nAudio_Baud\x12!\n\x0e\x43ODEC2_DEFAULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x1f\n\x0b\x43ODEC2_3200\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08\x33\x32\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_2400\x10\x02\x1a\x0e\xca\xf3\x18\n:\x08\x32\x34\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1600\x10\x03\x1a\x0e\xca\xf3\x18\n:\x08\x31\x36\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1400\x10\x04\x1a\x0e\xca\xf3\x18\n:\x08\x31\x34\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1300\x10\x05\x1a\x0e\xca\xf3\x18\n:\x08\x31\x33\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1200\x10\x06\x1a\x0e\xca\xf3\x18\n:\x08\x31\x32\x30\x30 bps\x12\x12\n\nCODEC2_700\x10\x07\x1a\x02\x08\x01\x12\x13\n\x0b\x43ODEC2_700B\x10\x08\x1a\x02\x08\x01\x12\x1f\n\x0b\x43ODEC2_700C\x10\t\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\n\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\x1a\xa9\x04\n\x10PaxcounterConfig\x12\xd5\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xc3\x01\xca\xf3\x18\xbe\x01:\x13PAX Counter EnabledB\xa6\x01When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work.\x12\x83\x01\n\x1apaxcounter_update_interval\x18\x02 \x01(\rB_\xca\xf3\x18[*\x01s:\x0fUpdate IntervalBEHow often we can send a message to the mesh when people are detected.\x12\\\n\x0ewifi_threshold\x18\x03 \x01(\x05\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x05\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\x1a\xe2\x06\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x04 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12x\n!nodeinfo_direct_response_max_hops\x18\x06 \x01(\rBM\xca\xf3\x18I:\x18\x44irect NodeInfo Max HopsB-Only answer requestors within this many hops.\x12\x65\n\x16rate_limit_window_secs\x18\x08 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\t \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x0b \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08J\x04\x08\n\x10\x0bJ\x04\x08\x0c\x10\rJ\x04\x08\r\x10\x0eJ\x04\x08\x0e\x10\x0fR\x07\x65nabledR\x16position_dedup_enabledR\x17position_precision_bitsR\x18nodeinfo_direct_responseR\x12rate_limit_enabledR\x14\x64rop_unknown_enabledR\x15\x65xhaust_hop_telemetryR\x14\x65xhaust_hop_positionR\x14router_preserve_hops\x1a\x9c\x0b\n\x0cSerialConfig\x12;\n\x07\x65nabled\x18\x01 \x01(\x08\x42*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12Z\n\x04\x65\x63ho\x18\x02 \x01(\x08\x42L\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12=\n\x03rxd\x18\x03 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x04 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12]\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12\x62\n\x07timeout\x18\x06 \x01(\rBQ\xca\xf3\x18M:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12i\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\xa2\x04\n\x0bSerial_Baud\x12\x1f\n\x0c\x42\x41UD_DEFAULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x1c\n\x08\x42\x41UD_110\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08\x31\x31\x30 Baud\x12\x1c\n\x08\x42\x41UD_300\x10\x02\x1a\x0e\xca\xf3\x18\n:\x08\x33\x30\x30 Baud\x12\x1c\n\x08\x42\x41UD_600\x10\x03\x1a\x0e\xca\xf3\x18\n:\x08\x36\x30\x30 Baud\x12\x1e\n\tBAUD_1200\x10\x04\x1a\x0f\xca\xf3\x18\x0b:\t1200 Baud\x12\x1e\n\tBAUD_2400\x10\x05\x1a\x0f\xca\xf3\x18\x0b:\t2400 Baud\x12\x1e\n\tBAUD_4800\x10\x06\x1a\x0f\xca\xf3\x18\x0b:\t4800 Baud\x12\x1e\n\tBAUD_9600\x10\x07\x1a\x0f\xca\xf3\x18\x0b:\t9600 Baud\x12 \n\nBAUD_19200\x10\x08\x1a\x10\xca\xf3\x18\x0c:\n19200 Baud\x12 \n\nBAUD_38400\x10\t\x1a\x10\xca\xf3\x18\x0c:\n38400 Baud\x12 \n\nBAUD_57600\x10\n\x1a\x10\xca\xf3\x18\x0c:\n57600 Baud\x12\"\n\x0b\x42\x41UD_115200\x10\x0b\x1a\x11\xca\xf3\x18\r:\x0b\x31\x31\x35\x32\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_230400\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0b\x32\x33\x30\x34\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_460800\x10\r\x1a\x11\xca\xf3\x18\r:\x0b\x34\x36\x30\x38\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_576000\x10\x0e\x1a\x11\xca\xf3\x18\r:\x0b\x35\x37\x36\x30\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_921600\x10\x0f\x1a\x11\xca\xf3\x18\r:\x0b\x39\x32\x31\x36\x30\x30 Baud\"\xfa\x01\n\x0bSerial_Mode\x12\x1a\n\x07\x44\x45\x46\x41ULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x18\n\x06SIMPLE\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06Simple\x12\x1a\n\x05PROTO\x10\x02\x1a\x0f\xca\xf3\x18\x0b:\tProtobufs\x12\x1f\n\x07TEXTMSG\x10\x03\x1a\x12\xca\xf3\x18\x0e:\x0cText Message\x12\x1e\n\x04NMEA\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0eNMEA Positions\x12\x1a\n\x07\x43\x41LTOPO\x10\x05\x1a\r\xca\xf3\x18\t:\x07\x43\x41LTOPO\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\x12\r\n\tMS_CONFIG\x10\x08\x12\x07\n\x03LOG\x10\t\x12\x0b\n\x07LOGTEXT\x10\n\x1a\x9f\r\n\x1a\x45xternalNotificationConfig\x12S\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x42\xca\xf3\x18>:\x1d\x45xternal Notification EnabledB\x1d\x45nable external notifications\x12`\n\toutput_ms\x18\x02 \x01(\rBM\xca\xf3\x18I*\x02ms:\x14GPIO Output DurationB-In GPIO mode, how long to keep the output on.\x12s\n\x06output\x18\x03 \x01(\rBc\xca\xf3\x18_:\x0fOutput pin GPIOBLGPIO pin driven on notification. Defaults to the board\'s EXT_NOTIFY_OUT pin.\x12M\n\x0coutput_vibra\x18\x08 \x01(\rB7\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12\x46\n\routput_buzzer\x18\t \x01(\rB/\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12q\n\x06\x61\x63tive\x18\x04 \x01(\x08\x42\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12V\n\ralert_message\x18\x05 \x01(\x08\x42?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x65\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x42H\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12h\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x42J\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12N\n\nalert_bell\x18\x06 \x01(\x08\x42:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12g\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x42M\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12`\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x42\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xee\x01\n\x07use_pwm\x18\x07 \x01(\x08\x42\xdc\x01\xca\xf3\x18\xd7\x01:\x0eUse PWM BuzzerB\xc4\x01Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.\x12K\n\x0bnag_timeout\x18\x0e \x01(\rB6\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\x12\xc8\x01\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x42\xac\x01\xca\xf3\x18\xa7\x01:\x11Use I2S As BuzzerB\x91\x01\x45nables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.\x1a\xe1\x03\n\x12StoreForwardConfig\x12W\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12]\n\theartbeat\x18\x02 \x01(\x08\x42J\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12(\n\x07records\x18\x03 \x01(\rB\x17\xca\xf3\x18\x13:\x11Number of records\x12\x34\n\x12history_return_max\x18\x04 \x01(\rB\x18\xca\xf3\x18\x14:\x12History Return Max\x12:\n\x15history_return_window\x18\x05 \x01(\rB\x1b\xca\xf3\x18\x17:\x15History Return Window\x12w\n\tis_server\x18\x06 \x01(\x08\x42\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x1a\xfa\x02\n\x0fRangeTestConfig\x12\x43\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x32\xca\xf3\x18.:\x12Range Test EnabledB\x18\x45nable range test module\x12q\n\x06sender\x18\x02 \x01(\rBa\xca\xf3\x18]*\x01s:\x0fSender IntervalBGThis device will send out range test messages on the selected interval.\x12\x87\x01\n\x04save\x18\x03 \x01(\x08\x42y\xca\xf3\x18u:\x04SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.\x12%\n\x0f\x63lear_on_reboot\x18\x04 \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.11\x1a\x97\x0b\n\x0fTelemetryConfig\x12r\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x81\x01\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\rB\\\xca\xf3\x18X*\x01s:\x1c\x45nvironment Metrics IntervalB5How often environment metrics are sent over the mesh.\x12l\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x42\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12k\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x42G\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12\x63\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x42;\xca\xf3\x18\x37:\x12\x44isplay FahrenheitB!Display environment in Fahrenheit\x12[\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x42>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12z\n\x14\x61ir_quality_interval\x18\x07 \x01(\rB\\\xca\xf3\x18X*\x01s:\x1c\x41ir Quality Metrics IntervalB5How often air quality metrics are sent over the mesh.\x12Y\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x42\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12o\n\x15power_update_interval\x18\t \x01(\rBP\xca\xf3\x18L*\x01s:\x16Power Metrics IntervalB/How often power metrics are sent over the mesh.\x12Q\n\x14power_screen_enabled\x18\n \x01(\x08\x42\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x12\xbe\x01\n\x18\x64\x65vice_telemetry_enabled\x18\x0e \x01(\x08\x42\x9b\x01\xca\xf3\x18\x96\x01:\x18\x42roadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.R\x06\x32.7.13\x12\x30\n\x1a\x61ir_quality_screen_enabled\x18\x0f \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x1a\xd0\t\n\x13\x43\x61nnedMessageConfig\x12>\n\x0frotary1_enabled\x18\x01 \x01(\x08\x42%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12K\n\x11inputbroker_pin_a\x18\x02 \x01(\rB0\xca\xf3\x18,:\x05Pin AB#GPIO pin for rotary encoder A port.\x12K\n\x11inputbroker_pin_b\x18\x03 \x01(\rB0\xca\xf3\x18,:\x05Pin BB#GPIO pin for rotary encoder B port.\x12W\n\x15inputbroker_pin_press\x18\x04 \x01(\rB8\xca\xf3\x18\x34:\tPress PinB\'GPIO pin for rotary encoder Press port.\x12\x9b\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\xac\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x96\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventCharB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\x12\x45\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x42,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12\x1e\n\x07\x65nabled\x18\t \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.7.0\x12)\n\x12\x61llow_input_source\x18\n \x01(\tB\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.7.0\x12\x45\n\tsend_bell\x18\x0b \x01(\x08\x42\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\xc6\x01\n\x0eInputEventChar\x12\x14\n\x04NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x10\n\x02UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x14\n\x04\x44OWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x14\n\x04LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x16\n\x05RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x18\n\x06SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x14\n\x04\x42\x41\x43K\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x18\n\x06\x43\x41NCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x1a\xd1\x04\n\x15\x41mbientLightingConfig\x12\x41\n\tled_state\x18\x01 \x01(\x08\x42.\xca\xf3\x18*:\tLED StateB\x1dThe state of the LED (on/off)\x12t\n\x07\x63urrent\x18\x02 \x01(\rBc\xca\xf3\x18_\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00?@:\x07\x43urrentB!Drive current for the LED output.J\x1fled|brightness|ambient|lighting\x12{\n\x03red\x18\x03 \x01(\rBn\xca\xf3\x18j\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x03RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12\x81\x01\n\x05green\x18\x04 \x01(\rBr\xca\xf3\x18n\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x05GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12~\n\x04\x62lue\x18\x05 \x01(\rBp\xca\xf3\x18l\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x04\x42lueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x1a*\n\x13StatusMessageConfig\x12\x13\n\x0bnode_status\x18\x01 \x01(\t\x1a\xa4\x08\n\x10MeshBeaconConfig\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12+\n\x1e\x62roadcast_offer_frequency_slot\x18\x02 \x01(\rH\x00\x88\x01\x01\x12G\n\x11\x62roadcast_message\x18\x04 \x01(\tB,\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12<\n\x17\x62roadcast_offer_channel\x18\x05 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12H\n\x16\x62roadcast_offer_region\x18\x06 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12N\n\x16\x62roadcast_offer_preset\x18\x07 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x01\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x0b \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12T\n\x11\x62roadcast_targets\x18\r \x03(\x0b\x32\x39.meshtastic.ModuleConfig.MeshBeaconConfig.BroadcastTarget\x1a\xf4\x01\n\x0f\x42roadcastTarget\x12>\n\x06preset\x18\x01 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12\x38\n\x06region\x18\x02 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x1a\n\rchannel_index\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66requency_slot\x18\x05 \x01(\rH\x02\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_indexB\x11\n\x0f_frequency_slot\"b\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x17\n\x13\x46LAG_LISTEN_ENABLED\x10\x01\x12\x1a\n\x16\x46LAG_BROADCAST_ENABLED\x10\x02\x12\x15\n\x11\x46LAG_LEGACY_SPLIT\x10\x04\x42!\n\x1f_broadcast_offer_frequency_slotB\x19\n\x17_broadcast_offer_presetJ\x04\x08\x03\x10\x04J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bR\x16\x62roadcast_send_as_nodeR\x14\x62roadcast_on_channelR\x13\x62roadcast_on_regionR\x13\x62roadcast_on_preset\x1a\x8a\x01\n\tTAKConfig\x12:\n\x04team\x18\x01 \x01(\x0e\x32\x10.meshtastic.TeamB\x1a\xca\xf3\x18\x16:\x04TeamB\x0eTAK team color\x12\x41\n\x04role\x18\x02 \x01(\x0e\x32\x16.meshtastic.MemberRoleB\x1b\xca\xf3\x18\x17:\x04RoleB\x0fTAK member roleB\x11\n\x0fpayload_variant\"d\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.meshtastic.RemoteHardwarePinType*I\n\x15RemoteHardwarePinType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0c\x44IGITAL_READ\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x42h\n\x14org.meshtastic.protoB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3"
14
14
 
15
15
  pool = ::Google::Protobuf::DescriptorPool.generated_pool
16
16
  pool.add_serialized_file(descriptor_data)