brynq-sdk-task-scheduler 1.1.3__tar.gz → 1.1.4__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.
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/PKG-INFO +1 -1
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk/task_scheduler/task_scheduler.py +1 -96
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/PKG-INFO +1 -1
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/setup.py +1 -1
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk/task_scheduler/__init__.py +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/SOURCES.txt +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/not-zip-safe +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/requires.txt +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/brynq_sdk_task_scheduler.egg-info/top_level.txt +0 -0
- {brynq_sdk_task_scheduler-1.1.3 → brynq_sdk_task_scheduler-1.1.4}/setup.cfg +0 -0
|
@@ -50,7 +50,6 @@ class TaskScheduler(BrynQ):
|
|
|
50
50
|
# Check if the log tables exists in the customer database. If not, create them
|
|
51
51
|
# Mysql throws a warning when a table already exists. We don't care so we ignore warnings. (not exceptions!)
|
|
52
52
|
warnings.filterwarnings('ignore')
|
|
53
|
-
# self.check_if_logging_tables_exists()
|
|
54
53
|
|
|
55
54
|
# Check if the task is started on schedule or manual. store in a variable to use later in the script
|
|
56
55
|
self.task_manual_started = self.check_if_task_manual_started()
|
|
@@ -72,100 +71,6 @@ class TaskScheduler(BrynQ):
|
|
|
72
71
|
key_count += self.__count_keys(value) # Recursively count keys in nested dictionaries
|
|
73
72
|
return key_count
|
|
74
73
|
|
|
75
|
-
def check_if_logging_tables_exists(self):
|
|
76
|
-
"""
|
|
77
|
-
This function checks if all the needed tables for the task_scheduler exists. If they don't, this function
|
|
78
|
-
creates the needed tables
|
|
79
|
-
:return: nothing
|
|
80
|
-
"""
|
|
81
|
-
# Check if the table task_scheduler exists. If not, create it
|
|
82
|
-
new_table_query = 'CREATE TABLE IF NOT EXISTS `task_scheduler` (' \
|
|
83
|
-
'`id` int(11) NOT NULL AUTO_INCREMENT,' \
|
|
84
|
-
'`dashboard_reload` bool NOT NULL DEFAULT \'0\',' \
|
|
85
|
-
'`title` varchar(50) NOT NULL,' \
|
|
86
|
-
'`description` varchar(255) NOT NULL,' \
|
|
87
|
-
'`dashboard_guid` varchar(255) NULL DEFAULT NULL,' \
|
|
88
|
-
'`docker_image` varchar(255) DEFAULT NULL,' \
|
|
89
|
-
'`runfile_path` varchar(255) DEFAULT NULL,' \
|
|
90
|
-
'`trigger_type` enum("MANUAL", "TIME", "OTHER_TASK") NOT NULL DEFAULT \'MANUAL\',' \
|
|
91
|
-
'`next_reload` timestamp NULL DEFAULT NULL,' \
|
|
92
|
-
'`timezone` enum("Africa/Abidjan", "Africa/Accra", "Africa/Addis_Ababa", "Africa/Algiers", "Africa/Asmara", "Africa/Bamako", "Africa/Bangui", "Africa/Banjul", "Africa/Bissau", "Africa/Blantyre", "Africa/Brazzaville", "Africa/Bujumbura", "Africa/Cairo", "Africa/Casablanca", "Africa/Ceuta", "Africa/Conakry", "Africa/Dakar", "Africa/Dar_es_Salaam", "Africa/Djibouti", "Africa/Douala", "Africa/El_Aaiun", "Africa/Freetown", "Africa/Gaborone", "Africa/Harare", "Africa/Johannesburg", "Africa/Juba", "Africa/Kampala", "Africa/Khartoum", "Africa/Kigali", "Africa/Kinshasa", "Africa/Lagos", "Africa/Libreville", "Africa/Lome", "Africa/Luanda", "Africa/Lubumbashi", "Africa/Lusaka", "Africa/Malabo", "Africa/Maputo", "Africa/Maseru", "Africa/Mbabane", "Africa/Mogadishu", "Africa/Monrovia", "Africa/Nairobi", "Africa/Ndjamena", "Africa/Niamey", "Africa/Nouakchott", "Africa/Ouagadougou", "Africa/Porto-Novo", "Africa/Sao_Tome", "Africa/Tripoli", "Africa/Tunis", "Africa/Windhoek", "America/Adak", "America/Anchorage", "America/Anguilla", "America/Antigua", "America/Araguaina", "America/Argentina/Buenos_Aires", "America/Argentina/Catamarca", "America/Argentina/Cordoba", "America/Argentina/Jujuy", "America/Argentina/La_Rioja", "America/Argentina/Mendoza", "America/Argentina/Rio_Gallegos", "America/Argentina/Salta", "America/Argentina/San_Juan", "America/Argentina/San_Luis", "America/Argentina/Tucuman", "America/Argentina/Ushuaia", "America/Aruba", "America/Asuncion", "America/Atikokan", "America/Bahia", "America/Bahia_Banderas", "America/Barbados", "America/Belem", "America/Belize", "America/Blanc-Sablon", "America/Boa_Vista", "America/Bogota", "America/Boise", "America/Cambridge_Bay", "America/Campo_Grande", "America/Cancun", "America/Caracas", "America/Cayenne", "America/Cayman", "America/Chicago", "America/Chihuahua", "America/Costa_Rica", "America/Creston", "America/Cuiaba", "America/Curacao", "America/Danmarkshavn", "America/Dawson", "America/Dawson_Creek", "America/Denver", "America/Detroit", "America/Dominica", "America/Edmonton", "America/Eirunepe", "America/El_Salvador", "America/Fort_Nelson", "America/Fortaleza", "America/Glace_Bay", "America/Godthab", "America/Goose_Bay", "America/Grand_Turk", "America/Grenada", "America/Guadeloupe", "America/Guatemala", "America/Guayaquil", "America/Guyana", "America/Halifax", "America/Havana", "America/Hermosillo", "America/Indiana/Indianapolis", "America/Indiana/Knox", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Tell_City", "America/Indiana/Vevay", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Inuvik", "America/Iqaluit", "America/Jamaica", "America/Juneau", "America/Kentucky/Louisville", "America/Kentucky/Monticello", "America/Kralendijk", "America/La_Paz", "America/Lima", "America/Los_Angeles", "America/Lower_Princes", "America/Maceio", "America/Managua", "America/Manaus", "America/Marigot", "America/Martinique", "America/Matamoros", "America/Mazatlan", "America/Menominee", "America/Merida", "America/Metlakatla", "America/Mexico_City", "America/Miquelon", "America/Moncton", "America/Monterrey", "America/Montevideo", "America/Montserrat", "America/Nassau", "America/New_York", "America/Nipigon", "America/Nome", "America/Noronha", "America/North_Dakota/Beulah", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/Ojinaga", "America/Panama", "America/Pangnirtung", "America/Paramaribo", "America/Phoenix", "America/Port-au-Prince", "America/Port_of_Spain", "America/Porto_Velho", "America/Puerto_Rico", "America/Punta_Arenas", "America/Rainy_River", "America/Rankin_Inlet", "America/Recife", "America/Regina", "America/Resolute", "America/Rio_Branco", "America/Santarem", "America/Santiago", "America/Santo_Domingo", "America/Sao_Paulo", "America/Scoresbysund", "America/Sitka", "America/St_Barthelemy", "America/St_Johns", "America/St_Kitts", "America/St_Lucia", "America/St_Thomas", "America/St_Vincent", "America/Swift_Current", "America/Tegucigalpa", "America/Thule", "America/Thunder_Bay", "America/Tijuana", "America/Toronto", "America/Tortola", "America/Vancouver", "America/Whitehorse", "America/Winnipeg", "America/Yakutat", "America/Yellowknife", "Antarctica/Casey", "Antarctica/Davis", "Antarctica/DumontDUrville", "Antarctica/Macquarie", "Antarctica/Mawson", "Antarctica/McMurdo", "Antarctica/Palmer", "Antarctica/Rothera", "Antarctica/Syowa", "Antarctica/Troll", "Antarctica/Vostok", "Arctic/Longyearbyen", "Asia/Aden", "Asia/Almaty", "Asia/Amman", "Asia/Anadyr", "Asia/Aqtau", "Asia/Aqtobe", "Asia/Ashgabat", "Asia/Atyrau", "Asia/Baghdad", "Asia/Bahrain", "Asia/Baku", "Asia/Bangkok", "Asia/Barnaul", "Asia/Beirut", "Asia/Bishkek", "Asia/Brunei", "Asia/Chita", "Asia/Choibalsan", "Asia/Colombo", "Asia/Damascus", "Asia/Dhaka", "Asia/Dili", "Asia/Dubai", "Asia/Dushanbe", "Asia/Famagusta", "Asia/Gaza", "Asia/Hebron", "Asia/Ho_Chi_Minh", "Asia/Hong_Kong", "Asia/Hovd", "Asia/Irkutsk", "Asia/Jakarta", "Asia/Jayapura", "Asia/Jerusalem", "Asia/Kabul", "Asia/Kamchatka", "Asia/Karachi", "Asia/Kathmandu", "Asia/Khandyga", "Asia/Kolkata", "Asia/Krasnoyarsk", "Asia/Kuala_Lumpur", "Asia/Kuching", "Asia/Kuwait", "Asia/Macau", "Asia/Magadan", "Asia/Makassar", "Asia/Manila", "Asia/Muscat", "Asia/Nicosia", "Asia/Novokuznetsk", "Asia/Novosibirsk", "Asia/Omsk", "Asia/Oral", "Asia/Phnom_Penh", "Asia/Pontianak", "Asia/Pyongyang", "Asia/Qatar", "Asia/Qostanay", "Asia/Qyzylorda", "Asia/Riyadh", "Asia/Sakhalin", "Asia/Samarkand", "Asia/Seoul", "Asia/Shanghai", "Asia/Singapore", "Asia/Srednekolymsk", "Asia/Taipei", "Asia/Tashkent", "Asia/Tbilisi", "Asia/Tehran", "Asia/Thimphu", "Asia/Tokyo", "Asia/Tomsk", "Asia/Ulaanbaatar", "Asia/Urumqi", "Asia/Ust-Nera", "Asia/Vientiane", "Asia/Vladivostok", "Asia/Yakutsk", "Asia/Yangon", "Asia/Yekaterinburg", "Asia/Yerevan", "Atlantic/Azores", "Atlantic/Bermuda", "Atlantic/Canary", "Atlantic/Cape_Verde", "Atlantic/Faroe", "Atlantic/Madeira", "Atlantic/Reykjavik", "Atlantic/South_Georgia", "Atlantic/St_Helena", "Atlantic/Stanley", "Australia/Adelaide", "Australia/Brisbane", "Australia/Broken_Hill", "Australia/Currie", "Australia/Darwin", "Australia/Eucla", "Australia/Hobart", "Australia/Lindeman", "Australia/Lord_Howe", "Australia/Melbourne", "Australia/Perth", "Australia/Sydney", "Canada/Atlantic", "Canada/Central", "Canada/Eastern", "Canada/Mountain", "Canada/Newfoundland", "Canada/Pacific", "Europe/Amsterdam", "Europe/Andorra", "Europe/Astrakhan", "Europe/Athens", "Europe/Belgrade", "Europe/Berlin", "Europe/Bratislava", "Europe/Brussels", "Europe/Bucharest", "Europe/Budapest", "Europe/Busingen", "Europe/Chisinau", "Europe/Copenhagen", "Europe/Dublin", "Europe/Gibraltar", "Europe/Guernsey", "Europe/Helsinki", "Europe/Isle_of_Man", "Europe/Istanbul", "Europe/Jersey", "Europe/Kaliningrad", "Europe/Kiev", "Europe/Kirov", "Europe/Lisbon", "Europe/Ljubljana", "Europe/London", "Europe/Luxembourg", "Europe/Madrid", "Europe/Malta", "Europe/Mariehamn", "Europe/Minsk", "Europe/Monaco", "Europe/Moscow", "Europe/Oslo", "Europe/Paris", "Europe/Podgorica", "Europe/Prague", "Europe/Riga", "Europe/Rome", "Europe/Samara", "Europe/San_Marino", "Europe/Sarajevo", "Europe/Saratov", "Europe/Simferopol", "Europe/Skopje", "Europe/Sofia", "Europe/Stockholm", "Europe/Tallinn", "Europe/Tirane", "Europe/Ulyanovsk", "Europe/Uzhgorod", "Europe/Vaduz", "Europe/Vatican", "Europe/Vienna", "Europe/Vilnius", "Europe/Volgograd", "Europe/Warsaw", "Europe/Zagreb", "Europe/Zaporozhye", "Europe/Zurich", "GMT", "Indian/Antananarivo", "Indian/Chagos", "Indian/Christmas", "Indian/Cocos", "Indian/Comoro", "Indian/Kerguelen", "Indian/Mahe", "Indian/Maldives", "Indian/Mauritius", "Indian/Mayotte", "Indian/Reunion", "Pacific/Apia", "Pacific/Auckland", "Pacific/Bougainville", "Pacific/Chatham", "Pacific/Chuuk", "Pacific/Easter", "Pacific/Efate", "Pacific/Enderbury", "Pacific/Fakaofo", "Pacific/Fiji", "Pacific/Funafuti", "Pacific/Galapagos", "Pacific/Gambier", "Pacific/Guadalcanal", "Pacific/Guam", "Pacific/Honolulu", "Pacific/Kiritimati", "Pacific/Kosrae", "Pacific/Kwajalein", "Pacific/Majuro", "Pacific/Marquesas", "Pacific/Midway", "Pacific/Nauru", "Pacific/Niue", "Pacific/Norfolk", "Pacific/Noumea", "Pacific/Pago_Pago", "Pacific/Palau", "Pacific/Pitcairn", "Pacific/Pohnpei", "Pacific/Port_Moresby", "Pacific/Rarotonga", "Pacific/Saipan", "Pacific/Tahiti", "Pacific/Tarawa", "Pacific/Tongatapu", "Pacific/Wake", "Pacific/Wallis", "US/Alaska", "US/Arizona", "US/Central", "US/Eastern", "US/Hawaii", "US/Mountain", "US/Pacific", "UTC") CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT \"Europe/Amsterdam\",' \
|
|
93
|
-
'`frequency` varchar(255) DEFAULT \'{"month":0,"day":0,"hour":0,"minute":0}\',' \
|
|
94
|
-
'`start_after_task_id` int DEFAULT NULL,' \
|
|
95
|
-
'`start_after_preceding_task` enum("FAILED", "SUCCESS") DEFAULT NULL,' \
|
|
96
|
-
'`last_reload` timestamp NULL DEFAULT NULL,' \
|
|
97
|
-
'`last_error_message` varchar(255) DEFAULT NULL,' \
|
|
98
|
-
'`status` varchar(255) DEFAULT \'IDLE\',' \
|
|
99
|
-
'`disabled` tinyint(4) DEFAULT \'1\',' \
|
|
100
|
-
'`run_instant` tinyint(1) DEFAULT \'0\',' \
|
|
101
|
-
'`sftp_mapping` varchar(255) NOT NULL DEFAULT \'[]\',' \
|
|
102
|
-
'`step_nr` int NOT NULL DEFAULT \'0\',' \
|
|
103
|
-
'`stopped_by_user` tinyint(1) DEFAULT \'0\',' \
|
|
104
|
-
'`stop_is_allowed` bool NOT NULL DEFAULT \'0\',' \
|
|
105
|
-
'PRIMARY KEY (`id`),' \
|
|
106
|
-
'UNIQUE KEY `task_scheduler_id_uindex` (`id`),' \
|
|
107
|
-
'constraint task_scheduler_task_scheduler_id_fk foreign key (start_after_task_id) references task_scheduler (id)' \
|
|
108
|
-
') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'
|
|
109
|
-
self.mysql.raw_query(new_table_query)
|
|
110
|
-
|
|
111
|
-
# Check if the table task_scheduler_log exists. If not, create it
|
|
112
|
-
new_table_query = 'CREATE TABLE IF NOT EXISTS `task_scheduler_log` (' \
|
|
113
|
-
'`reload_id` bigint NOT NULL,' \
|
|
114
|
-
'`task_id` int NULL,' \
|
|
115
|
-
'`reload_status` varchar(255) NULL,' \
|
|
116
|
-
'`started_at` datetime NULL,' \
|
|
117
|
-
'`finished_at` datetime NULL' \
|
|
118
|
-
') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'
|
|
119
|
-
self.mysql.raw_query(new_table_query)
|
|
120
|
-
|
|
121
|
-
# Check if the table check_task_execution_log exists. If not, create it
|
|
122
|
-
new_table_query = 'CREATE TABLE IF NOT EXISTS `task_execution_log`(' \
|
|
123
|
-
'`reload_id` bigint NOT NULL,' \
|
|
124
|
-
'`task_id` int NULL,' \
|
|
125
|
-
'`log_level` varchar(255) NULL,' \
|
|
126
|
-
'`created_at` datetime NULL,' \
|
|
127
|
-
'`line_number` int NULL,' \
|
|
128
|
-
'`message` longtext NULL)' \
|
|
129
|
-
'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'
|
|
130
|
-
self.mysql.raw_query(new_table_query)
|
|
131
|
-
|
|
132
|
-
# Check if the table check_task_execution_steps exists. If not, create it
|
|
133
|
-
new_table_query = 'CREATE TABLE IF NOT EXISTS `task_execution_steps`(' \
|
|
134
|
-
'`id` bigint NOT NULL AUTO_INCREMENT,' \
|
|
135
|
-
'`task_id` int NULL,' \
|
|
136
|
-
'`nr` int DEFAULT 0 NOT NULL,' \
|
|
137
|
-
'`description` varchar(255) DEFAULT \'ZzZzZz...\' NOT NULL,' \
|
|
138
|
-
'PRIMARY KEY (`id`),' \
|
|
139
|
-
'UNIQUE KEY `task_execution_steps_id_uindex` (`id`),' \
|
|
140
|
-
'UNIQUE INDEX `task_execution_steps_task_id_nr_uindex` (`task_id`, `nr`))' \
|
|
141
|
-
'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'
|
|
142
|
-
self.mysql.raw_query(new_table_query)
|
|
143
|
-
|
|
144
|
-
new_table_query = 'CREATE TABLE IF NOT EXISTS `task_variables`(' \
|
|
145
|
-
'id INT NOT NULL AUTO_INCREMENT,' \
|
|
146
|
-
'task_id INT NOT NULL,' \
|
|
147
|
-
'name VARCHAR(150) NOT NULL,' \
|
|
148
|
-
'description VARCHAR(255) NULL,' \
|
|
149
|
-
'type ENUM(\'INT\', \'TINYINT\', \'BIGINT\', \'FLOAT\', \'DOUBLE\', \'DATETIME\', \'TIMESTAMP\', \'TIME\', \'VARCHAR\', \'BLOB\', \'TEXT\', \'LONGBLOB\') NOT NULL,' \
|
|
150
|
-
'value VARCHAR(600) NULL,' \
|
|
151
|
-
'temp_value VARCHAR(600) NULL,' \
|
|
152
|
-
'PRIMARY KEY (`id`),' \
|
|
153
|
-
'UNIQUE KEY `task_variables_id_uindex` (`id`),' \
|
|
154
|
-
'UNIQUE INDEX `task_variables_name_value_uindex` (`task_id`, `name`, `value`), ' \
|
|
155
|
-
'INDEX `task_variables_name_index` (`name`),' \
|
|
156
|
-
'CONSTRAINT task_variables_task_scheduler_id_fk ' \
|
|
157
|
-
'FOREIGN KEY (`task_id`) REFERENCES task_scheduler (`id`) ON DELETE CASCADE)' \
|
|
158
|
-
'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci'
|
|
159
|
-
self.mysql.raw_query(new_table_query)
|
|
160
|
-
|
|
161
|
-
# Add the variable 'email_errors_to' as default to the new added table if it doesn't exist for the current task
|
|
162
|
-
response = self.mysql.select('task_variables', 'temp_value',
|
|
163
|
-
f'WHERE name = \'email_errors_to\' AND task_id = {self.task_id}')
|
|
164
|
-
if len(response) == 0:
|
|
165
|
-
new_variables = f"-- INSERT INTO `task_variables` (`task_id`, `name`, `type`, `value`, `temp_value`) " \
|
|
166
|
-
f"VALUES ({self.task_id}, 'email_errors_to', 'TEXT', 'example@brynq.com, example2@brynq.com', 'example@brynq.com, example2@brynq.com')"
|
|
167
|
-
self.mysql.raw_query(new_variables, insert=True)
|
|
168
|
-
|
|
169
74
|
def create_task_execution_steps(self, step_details: list):
|
|
170
75
|
"""
|
|
171
76
|
Check if the given steps already exists in the task_execution_steps table. If not, update or insert the values in the table
|
|
@@ -405,7 +310,7 @@ class TaskScheduler(BrynQ):
|
|
|
405
310
|
error = str(e)[:400].replace('\'', '').replace('\"', '') + ' | Line: {}'.format(exc_tb.tb_lineno)
|
|
406
311
|
# Get scheduler task details for logging
|
|
407
312
|
task_details = \
|
|
408
|
-
self.mysql.select('task_scheduler', 'docker_image, runfile_path', 'WHERE id = {}'.format(self.task_id))[0]
|
|
313
|
+
self.mysql.select('task_scheduler, data_interfaces', 'data_interfaces.docker_image, data_interfaces.runfile_path', 'WHERE task_scheduler.data_interface_id = data_interfaces.id AND task_scheduler.id = {}'.format(self.task_id))[0]
|
|
409
314
|
taskname = task_details[0]
|
|
410
315
|
customer = task_details[1].split('/')[-1].split('.')[0]
|
|
411
316
|
|
|
@@ -3,7 +3,7 @@ from setuptools import setup
|
|
|
3
3
|
|
|
4
4
|
setup(
|
|
5
5
|
name='brynq_sdk_task_scheduler',
|
|
6
|
-
version='1.1.
|
|
6
|
+
version='1.1.4',
|
|
7
7
|
description='Code to execute tasks in BrynQ.com with the task scheduler',
|
|
8
8
|
long_description='Code to execute tasks in the BrynQ.com platform with the task scheduler',
|
|
9
9
|
author='BrynQ',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|