pymammotion 0.2.58__tar.gz → 0.2.60__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. {pymammotion-0.2.58 → pymammotion-0.2.60}/PKG-INFO +1 -1
  2. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/cloud_gateway.py +2 -0
  3. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/device_config.py +1 -1
  4. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/mqtt/event.py +16 -0
  5. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/state_manager.py +9 -1
  6. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/devices/base.py +3 -2
  7. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/devices/mammotion.py +3 -5
  8. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/devices/mammotion_cloud.py +6 -2
  9. {pymammotion-0.2.58 → pymammotion-0.2.60}/pyproject.toml +3 -3
  10. {pymammotion-0.2.58 → pymammotion-0.2.60}/LICENSE +0 -0
  11. {pymammotion-0.2.58 → pymammotion-0.2.60}/README.md +0 -0
  12. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/__init__.py +0 -0
  13. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/__init__.py +0 -0
  14. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/cloud_service.py +0 -0
  15. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/aep_response.py +0 -0
  16. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/connect_response.py +0 -0
  17. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/dev_by_account_response.py +0 -0
  18. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/login_by_oauth_response.py +0 -0
  19. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/regions_response.py +0 -0
  20. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/session_by_authcode_response.py +0 -0
  21. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/model/stream_subscription_response.py +0 -0
  22. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/aliyun/tmp_constant.py +0 -0
  23. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/__init__.py +0 -0
  24. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/ble.py +0 -0
  25. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/ble_message.py +0 -0
  26. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/const.py +0 -0
  27. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/data/__init__.py +0 -0
  28. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/data/convert.py +0 -0
  29. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/data/framectrldata.py +0 -0
  30. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/bluetooth/data/notifydata.py +0 -0
  31. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/const.py +0 -0
  32. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/__init__.py +0 -0
  33. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/__init__.py +0 -0
  34. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/account.py +0 -0
  35. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/device.py +0 -0
  36. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/enums.py +0 -0
  37. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/excute_boarder_params.py +0 -0
  38. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/execute_boarder.py +0 -0
  39. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/generate_route_information.py +0 -0
  40. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/hash_list.py +0 -0
  41. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/location.py +0 -0
  42. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/mowing_modes.py +0 -0
  43. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/plan.py +0 -0
  44. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/rapid_state.py +0 -0
  45. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/region_data.py +0 -0
  46. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/model/report_info.py +0 -0
  47. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/mqtt/__init__.py +0 -0
  48. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/mqtt/properties.py +0 -0
  49. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/data/mqtt/status.py +0 -0
  50. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/event/__init__.py +0 -0
  51. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/event/event.py +0 -0
  52. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/http/_init_.py +0 -0
  53. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/http/http.py +0 -0
  54. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/http/model/http.py +0 -0
  55. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/__init__.py +0 -0
  56. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/__init__.py +0 -0
  57. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/abstract_message.py +0 -0
  58. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/mammotion_command.py +0 -0
  59. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/__init__.py +0 -0
  60. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/driver.py +0 -0
  61. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/media.py +0 -0
  62. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/navigation.py +0 -0
  63. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/network.py +0 -0
  64. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/ota.py +0 -0
  65. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/system.py +0 -0
  66. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/commands/messages/video.py +0 -0
  67. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/control/__init__.py +0 -0
  68. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/control/joystick.py +0 -0
  69. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/devices/__init__.py +0 -0
  70. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mammotion/devices/mammotion_bluetooth.py +0 -0
  71. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mqtt/__init__.py +0 -0
  72. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mqtt/mammotion_future.py +0 -0
  73. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/mqtt/mammotion_mqtt.py +0 -0
  74. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/__init__.py +0 -0
  75. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/basestation.proto +0 -0
  76. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/basestation.py +0 -0
  77. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/basestation_pb2.py +0 -0
  78. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/basestation_pb2.pyi +0 -0
  79. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/common.proto +0 -0
  80. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/common.py +0 -0
  81. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/common_pb2.py +0 -0
  82. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/common_pb2.pyi +0 -0
  83. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/dev_net.proto +0 -0
  84. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/dev_net.py +0 -0
  85. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/dev_net_pb2.py +0 -0
  86. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/dev_net_pb2.pyi +0 -0
  87. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_msg.proto +0 -0
  88. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_msg.py +0 -0
  89. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_msg_pb2.py +0 -0
  90. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_msg_pb2.pyi +0 -0
  91. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_mul.proto +0 -0
  92. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_mul.py +0 -0
  93. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_mul_pb2.py +0 -0
  94. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/luba_mul_pb2.pyi +0 -0
  95. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_driver.proto +0 -0
  96. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_driver.py +0 -0
  97. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_driver_pb2.py +0 -0
  98. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_driver_pb2.pyi +0 -0
  99. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_nav.proto +0 -0
  100. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_nav.py +0 -0
  101. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_nav_pb2.py +0 -0
  102. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_nav_pb2.pyi +0 -0
  103. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_ota.proto +0 -0
  104. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_ota.py +0 -0
  105. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_ota_pb2.py +0 -0
  106. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_ota_pb2.pyi +0 -0
  107. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_pept.proto +0 -0
  108. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_pept.py +0 -0
  109. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_pept_pb2.py +0 -0
  110. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_pept_pb2.pyi +0 -0
  111. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_sys.proto +0 -0
  112. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_sys.py +0 -0
  113. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_sys_pb2.py +0 -0
  114. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/proto/mctrl_sys_pb2.pyi +0 -0
  115. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/py.typed +0 -0
  116. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/constant/__init__.py +0 -0
  117. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/constant/device_constant.py +0 -0
  118. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/conversions.py +0 -0
  119. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/datatype_converter.py +0 -0
  120. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/device_type.py +0 -0
  121. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/map.py +0 -0
  122. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/movement.py +0 -0
  123. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/periodic.py +0 -0
  124. {pymammotion-0.2.58 → pymammotion-0.2.60}/pymammotion/utility/rocker_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymammotion
3
- Version: 0.2.58
3
+ Version: 0.2.60
4
4
  Summary:
5
5
  License: GNU-3.0
6
6
  Author: Michael Arthur
@@ -664,6 +664,7 @@ class CloudIOTGateway:
664
664
  "args": {"content": self.converter.printBase64Binary(command)},
665
665
  "identifier": "device_protobuf_sync_service",
666
666
  "iotId": f"{iot_id}",
667
+ "identityId": f"{self._session_by_authcode_response.data.identityId}"
667
668
  },
668
669
  request=request,
669
670
  version="1.0",
@@ -687,6 +688,7 @@ class CloudIOTGateway:
687
688
  str(response_body_dict.get("msg")),
688
689
  )
689
690
  if response_body_dict.get("code") == 29003:
691
+ logger.debug(self._session_by_authcode_response.data.identityId)
690
692
  self.sign_out()
691
693
  raise SetupException(response_body_dict.get("code"))
692
694
  if response_body_dict.get("code") == 6205:
@@ -34,7 +34,7 @@ class OperationSettings(DataClassORJSONMixin):
34
34
  blade_height: int = 0
35
35
  path_order: str = ""
36
36
  toward: int = 0 # is just angle
37
- toward_included_angle: int = 0
37
+ toward_included_angle: int = 90
38
38
  toward_mode: int = 0 # angle type relative etc
39
39
  border_mode: int = 1 # border laps
40
40
  obstacle_laps: int = 1
@@ -64,6 +64,13 @@ class DeviceNotificationEventValue(DataClassORJSONMixin):
64
64
  data: str # parsed to DeviceNotificationEventCode
65
65
 
66
66
 
67
+ @dataclass
68
+ class DeviceBizReqEventValue(DataClassORJSONMixin):
69
+ bizType: str
70
+ bizId: str
71
+ params: str
72
+
73
+
67
74
  @dataclass
68
75
  class GeneralParams(DataClassORJSONMixin):
69
76
  groupIdList: list[str]
@@ -115,6 +122,13 @@ class DeviceNotificationEventParams(GeneralParams):
115
122
  value: DeviceNotificationEventValue
116
123
 
117
124
 
125
+ @dataclass
126
+ class DeviceBizReqEventParams(GeneralParams):
127
+ identifier: Literal["device_biz_req_event"]
128
+ type: Literal["info"]
129
+ value: DeviceBizReqEventValue
130
+
131
+
118
132
  @dataclass
119
133
  class DeviceWarningEventParams(GeneralParams):
120
134
  identifier: Literal["device_warning_event"]
@@ -152,6 +166,8 @@ class ThingEventMessage(DataClassORJSONMixin):
152
166
  params_obj = DeviceProtobufMsgEventParams.from_dict(params_dict)
153
167
  elif identifier == "device_warning_event":
154
168
  params_obj = DeviceWarningEventParams.from_dict(params_dict)
169
+ elif identifier == "device_biz_req_event":
170
+ params_obj = DeviceBizReqEventParams.from_dict(params_dict)
155
171
  elif identifier == "device_config_req_event":
156
172
  params_obj = payload.get("params", {})
157
173
  elif identifier == "device_notification_event" or identifier == "device_warning_code_event":
@@ -1,10 +1,12 @@
1
1
  """Manage state from notifications into MowingDevice."""
2
2
 
3
+ import logging
3
4
  from datetime import datetime
4
5
  from typing import Any, Awaitable, Callable, Optional
5
6
 
6
7
  import betterproto
7
8
 
9
+ from pymammotion.aliyun.cloud_gateway import SetupException
8
10
  from pymammotion.data.model.device import MowingDevice
9
11
  from pymammotion.data.model.hash_list import AreaHashNameList
10
12
  from pymammotion.data.mqtt.properties import ThingPropertiesMessage
@@ -12,6 +14,8 @@ from pymammotion.proto.luba_msg import LubaMsg
12
14
  from pymammotion.proto.mctrl_nav import AppGetAllAreaHashName, NavGetCommDataAck, NavGetHashListAck
13
15
  from pymammotion.utility.constant import WorkMode
14
16
 
17
+ logger = logging.getLogger(__name__)
18
+
15
19
 
16
20
  class StateManager:
17
21
  """Manage state."""
@@ -89,7 +93,11 @@ class StateManager:
89
93
  self._device.update_report_data(sys_msg[1])
90
94
  if self.queue_command_callback:
91
95
  if self._device.sys.toapp_report_data.dev.sys_status != WorkMode.MODE_WORKING:
92
- await self.queue_command_callback("get_report_cfg_stop")
96
+ try:
97
+ await self.queue_command_callback("get_report_cfg_stop")
98
+ except SetupException as exc:
99
+ # can't do anything about it yet
100
+ logger.debug(exc)
93
101
  case "mow_to_app_info":
94
102
  self._device.mow_info(sys_msg[1])
95
103
  case "system_tard_state_tunnel":
@@ -217,8 +217,9 @@ class MammotionBaseDevice:
217
217
 
218
218
  await self.queue_command("get_all_boundary_hash_list", sub_cmd=0)
219
219
  await self.queue_command("get_hash_response", total_frame=1, current_frame=1)
220
- data_hash = self.mower.map.missing_hashlist.pop()
221
- await self.queue_command("synchronize_hash_data", hash_num=data_hash)
220
+ if len(self.mower.map.missing_hashlist) > 0:
221
+ data_hash = self.mower.map.missing_hashlist.pop()
222
+ await self.queue_command("synchronize_hash_data", hash_num=data_hash)
222
223
 
223
224
  # sub_cmd 3 is job hashes??
224
225
  # sub_cmd 4 is dump location (yuka)
@@ -182,11 +182,10 @@ class Mammotion:
182
182
  await self.initiate_cloud_connection(account, cloud_client)
183
183
 
184
184
  async def initiate_cloud_connection(self, account: str, cloud_client: CloudIOTGateway) -> None:
185
+ loop = asyncio.get_running_loop()
185
186
  if self.mqtt_list.get(account) is not None:
186
- if self.mqtt_list.get(account).is_connected:
187
- # we might have removed a device so readd
188
- self.add_cloud_devices(self.mqtt_list.get(account))
189
- return
187
+ if self.mqtt_list.get(account).is_connected():
188
+ await loop.run_in_executor(None, self.mqtt_list.get(account).disconnect)
190
189
 
191
190
  mammotion_cloud = MammotionCloud(
192
191
  MammotionMQTT(
@@ -203,7 +202,6 @@ class Mammotion:
203
202
  self.mqtt_list[account] = mammotion_cloud
204
203
  self.add_cloud_devices(mammotion_cloud)
205
204
 
206
- loop = asyncio.get_running_loop()
207
205
  await loop.run_in_executor(None, self.mqtt_list[account].connect_async)
208
206
 
209
207
  def add_cloud_devices(self, mqtt_client: MammotionCloud) -> None:
@@ -258,11 +258,15 @@ class MammotionBaseCloudDevice(MammotionBaseDevice):
258
258
 
259
259
  async def _parse_message_for_device(self, event: ThingEventMessage) -> None:
260
260
  params = event.params
261
+ new_msg = LubaMsg()
261
262
  if event.params.iotId != self.iot_id:
262
263
  return
263
264
  binary_data = base64.b64decode(params.value.content)
264
- self._update_raw_data(binary_data)
265
- new_msg = LubaMsg().parse(binary_data)
265
+ try:
266
+ self._update_raw_data(binary_data)
267
+ new_msg = LubaMsg().parse(binary_data)
268
+ except (KeyError, ValueError, IndexError):
269
+ _LOGGER.exception("Error parsing message %s", binary_data)
266
270
 
267
271
  if (
268
272
  self._commands.get_device_product_key() == ""
@@ -1,10 +1,10 @@
1
1
  [project]
2
2
  name = "pymammotion"
3
- version = "0.2.58"
3
+ version = "0.2.60"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "pymammotion"
7
- version = "0.2.58"
7
+ version = "0.2.60"
8
8
  license = "GNU-3.0"
9
9
  description = ""
10
10
  readme = "README.md"
@@ -61,7 +61,7 @@ mypy = "^1.11.2"
61
61
  autotyping = "^24.3.0"
62
62
 
63
63
  [tool.bumpver]
64
- current_version = "0.2.58"
64
+ current_version = "0.2.60"
65
65
  version_pattern = "MAJOR.MINOR.PATCH"
66
66
  commit_message = "Bump version {old_version} -> {new_version}"
67
67
  commit = true
File without changes
File without changes