From 3c106d6957f9eeda22f29da4788b57f38f068d02 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Wed, 18 Dec 2024 10:27:59 -0300 Subject: [PATCH] WIP --- .../profile/data/data_sources/index.dart | 1 + .../profile_local_data_source.dart | 17 +- lib/features/storage/application/index.dart | 1 - .../storage/application/services/index.dart | 1 - .../storage/data/data_sources/index.dart | 3 - lib/features/storage/data/index.dart | 3 - .../storage/data/models/database_storage.dart | 160 ------------------ .../storage/data/repositories/index.dart | 1 - lib/features/storage/domain/index.dart | 3 - .../storage/enums/database_storage.dart | 47 +++++ .../storage/{data/models => enums}/index.dart | 0 .../models => enums}/secure_storage.dart | 0 .../models => enums}/shared_storage.dart | 0 .../{data/models => enums}/storage.dart | 0 .../dabase_storage_helper.dart} | 27 ++- lib/features/storage/helpers/index.dart | 3 + .../secure_storage_helper.dart} | 0 .../shared_storage_helper.dart} | 0 lib/features/storage/index.dart | 8 +- .../entities => interfaces}/base_storage.dart | 0 .../database_storage.dart | 0 .../entities => interfaces}/index.dart | 0 .../secure_storage.dart | 0 .../shared_storage.dart | 0 .../entities => interfaces}/storage.dart | 0 lib/features/storage/repositories/index.dart | 2 + .../storage_repository.dart | 0 .../storage_repository_impl.dart} | 15 +- .../database_storage_service.dart} | 0 lib/features/storage/services/index.dart | 4 + .../secure_storage_service.dart} | 0 .../shared_storage_service.dart} | 0 .../storage/services/storage_service.dart | 0 33 files changed, 90 insertions(+), 206 deletions(-) delete mode 100644 lib/features/storage/application/index.dart delete mode 100644 lib/features/storage/application/services/index.dart delete mode 100644 lib/features/storage/data/data_sources/index.dart delete mode 100644 lib/features/storage/data/index.dart delete mode 100644 lib/features/storage/data/models/database_storage.dart delete mode 100644 lib/features/storage/data/repositories/index.dart delete mode 100644 lib/features/storage/domain/index.dart create mode 100644 lib/features/storage/enums/database_storage.dart rename lib/features/storage/{data/models => enums}/index.dart (100%) rename lib/features/storage/{data/models => enums}/secure_storage.dart (100%) rename lib/features/storage/{data/models => enums}/shared_storage.dart (100%) rename lib/features/storage/{data/models => enums}/storage.dart (100%) rename lib/features/storage/{data/data_sources/database_data_source.dart => helpers/dabase_storage_helper.dart} (50%) create mode 100644 lib/features/storage/helpers/index.dart rename lib/features/storage/{data/data_sources/secure_data_source.dart => helpers/secure_storage_helper.dart} (100%) rename lib/features/storage/{data/data_sources/shared_data_source.dart => helpers/shared_storage_helper.dart} (100%) rename lib/features/storage/{domain/entities => interfaces}/base_storage.dart (100%) rename lib/features/storage/{domain/entities => interfaces}/database_storage.dart (100%) rename lib/features/storage/{domain/entities => interfaces}/index.dart (100%) rename lib/features/storage/{domain/entities => interfaces}/secure_storage.dart (100%) rename lib/features/storage/{domain/entities => interfaces}/shared_storage.dart (100%) rename lib/features/storage/{domain/entities => interfaces}/storage.dart (100%) create mode 100644 lib/features/storage/repositories/index.dart rename lib/features/storage/{domain/respositories => repositories}/storage_repository.dart (100%) rename lib/features/storage/{data/repositories/storage_repository.dart => repositories/storage_repository_impl.dart} (84%) rename lib/features/storage/{application/services/database_service.dart => services/database_storage_service.dart} (100%) create mode 100644 lib/features/storage/services/index.dart rename lib/features/storage/{domain/respositories/index.dart => services/secure_storage_service.dart} (100%) rename lib/features/storage/{domain/usecases/index.dart => services/shared_storage_service.dart} (100%) create mode 100644 lib/features/storage/services/storage_service.dart diff --git a/lib/features/profile/data/data_sources/index.dart b/lib/features/profile/data/data_sources/index.dart index e69de29b..df355299 100644 --- a/lib/features/profile/data/data_sources/index.dart +++ b/lib/features/profile/data/data_sources/index.dart @@ -0,0 +1 @@ +export 'profile_local_data_source.dart'; diff --git a/lib/features/profile/data/data_sources/profile_local_data_source.dart b/lib/features/profile/data/data_sources/profile_local_data_source.dart index 71788f92..481f5b67 100644 --- a/lib/features/profile/data/data_sources/profile_local_data_source.dart +++ b/lib/features/profile/data/data_sources/profile_local_data_source.dart @@ -5,18 +5,13 @@ import 'package:hub/shared/constants/index.dart'; import 'package:sqflite/sqflite.dart'; -abstract class ProfileLocalDataSource { - Future init(); - Future get(String key); - Future set(String key, T value); - Future delete(String key); - Future clearAll(); -} +abstract class ProfileLocalDataSource implements DatabaseStorage {} class ProfileLocalDataSourceImpl implements BaseStorage { ProfileLocalDataSourceImpl._(); - static final ProfileLocalDataSourceImpl instance = ProfileLocalDataSourceImpl._(); + static final ProfileLocalDataSourceImpl instance = + ProfileLocalDataSourceImpl._(); bool _isInitialized = false; @@ -29,7 +24,8 @@ class ProfileLocalDataSourceImpl implements BaseStorage { @override Future get(String key) async { - var response = await DatabaseService.database.query(tableKeychain, where: 'key = ?', whereArgs: [key]); + var response = await DatabaseService.database + .query(tableKeychain, where: 'key = ?', whereArgs: [key]); if (response.isEmpty) { return null; } @@ -56,7 +52,8 @@ class ProfileLocalDataSourceImpl implements BaseStorage { @override Future delete(String key) async { - await DatabaseService.database.delete(tableKeychain, where: 'key = ?', whereArgs: [key]); + await DatabaseService.database + .delete(tableKeychain, where: 'key = ?', whereArgs: [key]); } @override diff --git a/lib/features/storage/application/index.dart b/lib/features/storage/application/index.dart deleted file mode 100644 index 810de75e..00000000 --- a/lib/features/storage/application/index.dart +++ /dev/null @@ -1 +0,0 @@ -export 'services/index.dart'; diff --git a/lib/features/storage/application/services/index.dart b/lib/features/storage/application/services/index.dart deleted file mode 100644 index 43178711..00000000 --- a/lib/features/storage/application/services/index.dart +++ /dev/null @@ -1 +0,0 @@ -export 'database_service.dart'; diff --git a/lib/features/storage/data/data_sources/index.dart b/lib/features/storage/data/data_sources/index.dart deleted file mode 100644 index b66c53d7..00000000 --- a/lib/features/storage/data/data_sources/index.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'database_data_source.dart'; -export 'secure_data_source.dart'; -export 'shared_data_source.dart'; diff --git a/lib/features/storage/data/index.dart b/lib/features/storage/data/index.dart deleted file mode 100644 index 186dfac9..00000000 --- a/lib/features/storage/data/index.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'data_sources/index.dart'; -export 'repositories/index.dart'; -export 'models/index.dart'; diff --git a/lib/features/storage/data/models/database_storage.dart b/lib/features/storage/data/models/database_storage.dart deleted file mode 100644 index 5926cbf9..00000000 --- a/lib/features/storage/data/models/database_storage.dart +++ /dev/null @@ -1,160 +0,0 @@ -import 'package:hub/features/storage/index.dart'; - -abstract class DatabaseStorageKey implements IDatabaseStorage { - final String key; - const DatabaseStorageKey(this.key); - List get values => []; -} - -class ProfileStorageKey extends DatabaseStorageKey { - const ProfileStorageKey._(String key) : super(key); - - static const String table = 'profileTable'; - - static const ProfileStorageKey userEmail = ProfileStorageKey._('fre_userEmail'); - static const ProfileStorageKey devUUID = ProfileStorageKey._('fre_devUUID'); - static const ProfileStorageKey userUUID = ProfileStorageKey._('fre_userUUID'); - static const ProfileStorageKey userDevUUID = ProfileStorageKey._('fre_userDevUUID'); - static const ProfileStorageKey status = ProfileStorageKey._('fre_status'); - static const ProfileStorageKey userName = ProfileStorageKey._('fre_userName'); - static const ProfileStorageKey clientUUID = ProfileStorageKey._('fre_cliUUID'); - static const ProfileStorageKey ownerUUID = ProfileStorageKey._('fre_ownerUUID'); - static const ProfileStorageKey clientName = ProfileStorageKey._('fre_cliName'); - static const ProfileStorageKey ownerName = ProfileStorageKey._('fre_ownerName'); - - @override - List get values => [ - userEmail.key, - devUUID.key, - userUUID.key, - userDevUUID.key, - status.key, - userName.key, - clientUUID.key, - ownerUUID.key, - clientName.key, - ownerName.key, - ]; -} - -class LocalsStorageKey extends DatabaseStorageKey { - const LocalsStorageKey._(String key) : super(key); - - static const table = 'localTable'; - - static const LocalsStorageKey petAmount = LocalsStorageKey._('fre_petAmountRegister'); - static const LocalsStorageKey whatsapp = LocalsStorageKey._('fre_whatsapp'); - static const LocalsStorageKey provisional = LocalsStorageKey._('fre_provisional'); - static const LocalsStorageKey pets = LocalsStorageKey._('fre_pets'); - static const LocalsStorageKey local = LocalsStorageKey._('fre_local'); - static const LocalsStorageKey notify = LocalsStorageKey._('fre_notify'); - static const LocalsStorageKey fingerprint = LocalsStorageKey._('fre_fingerprint'); - static const LocalsStorageKey access = LocalsStorageKey._('fre_access'); - static const LocalsStorageKey panic = LocalsStorageKey._('fre_panic'); - static const LocalsStorageKey person = LocalsStorageKey._('fre_person'); - static const LocalsStorageKey requestOSNotification = LocalsStorageKey._('fre_requestOSnotification'); - static const LocalsStorageKey isNewVersion = LocalsStorageKey._('fre_isNewVersion'); - - @override - List get values => [ - petAmount.key, - whatsapp.key, - provisional.key, - pets.key, - local.key, - notify.key, - fingerprint.key, - access.key, - panic.key, - person.key, - requestOSNotification.key, - isNewVersion.key, - ]; -} - -// enum DatabaseStorageKey implements IDatabaseStorage { -// devUUID, -// userUUID, -// userDevUUID, -// status, -// userName, -// userEmail, -// clientUUID, -// ownerName, -// ownerUUID, -// clientName, -// petAmount, -// whatsapp, -// provisional, -// pets, -// local, -// notify, -// fingerprint, -// access, -// panic, -// person, -// requestOSNotification, -// isNewVersion, -// } - -// extension ProfileStorageKeyExtension on DatabaseStorageKey { -// String get profile { -// switch (this) { -// case DatabaseStorageKey.userEmail: -// return 'fre_userEmail'; -// case DatabaseStorageKey.devUUID: -// return 'fre_devUUID'; -// case DatabaseStorageKey.userUUID: -// return 'fre_userUUID'; -// case DatabaseStorageKey.userDevUUID: -// return 'fre_userDevUUID'; -// case DatabaseStorageKey.status: -// return 'fre_status'; -// case DatabaseStorageKey.userName: -// return 'fre_userName'; -// case DatabaseStorageKey.clientUUID: -// return 'fre_cliUUID'; -// case DatabaseStorageKey.ownerUUID: -// return 'fre_ownerUUID'; -// case DatabaseStorageKey.clientName: -// return 'fre_cliName'; -// case DatabaseStorageKey.ownerName: -// return 'fre_ownerName'; -// default: -// return ''; -// } -// } -// } - -// extension LocalsStorageKeyExtension on DatabaseStorageKey { -// String get locals { -// switch (this) { -// case DatabaseStorageKey.petAmount: -// return 'fre_petAmountRegister'; -// case DatabaseStorageKey.whatsapp: -// return 'fre_whatsapp'; -// case DatabaseStorageKey.provisional: -// return 'fre_provisional'; -// case DatabaseStorageKey.pets: -// return 'fre_pets'; -// case DatabaseStorageKey.local: -// return 'fre_local'; -// case DatabaseStorageKey.notify: -// return 'fre_notify'; -// case DatabaseStorageKey.fingerprint: -// return 'fre_fingerprint'; -// case DatabaseStorageKey.access: -// return 'fre_access'; -// case DatabaseStorageKey.panic: -// return 'fre_panic'; -// case DatabaseStorageKey.person: -// return 'fre_person'; -// case DatabaseStorageKey.requestOSNotification: -// return 'fre_requestOSnotification'; -// case DatabaseStorageKey.isNewVersion: -// return 'fre_isNewVersion'; -// default: -// return ''; -// } -// } -// } diff --git a/lib/features/storage/data/repositories/index.dart b/lib/features/storage/data/repositories/index.dart deleted file mode 100644 index 1a23c63f..00000000 --- a/lib/features/storage/data/repositories/index.dart +++ /dev/null @@ -1 +0,0 @@ -export 'storage_repository.dart'; diff --git a/lib/features/storage/domain/index.dart b/lib/features/storage/domain/index.dart deleted file mode 100644 index 00b76d59..00000000 --- a/lib/features/storage/domain/index.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'entities/index.dart'; -export 'respositories/index.dart'; -export 'usecases/index.dart'; diff --git a/lib/features/storage/enums/database_storage.dart b/lib/features/storage/enums/database_storage.dart new file mode 100644 index 00000000..9fab3420 --- /dev/null +++ b/lib/features/storage/enums/database_storage.dart @@ -0,0 +1,47 @@ +abstract class DatabaseStorageKey {} + +enum ProfileStorageKey implements DatabaseStorageKey { + userEmail('fre_userEmail'), + devUUID('fre_devUUID'), + userUUID('fre_userUUID'), + userDevUUID('fre_userDevUUID'), + status('fre_status'), + userName('fre_userName'), + clientUUID('fre_cliUUID'), + ownerUUID('fre_ownerUUID'), + clientName('fre_cliName'), + ownerName('fre_ownerName'); + + final String key; + + const ProfileStorageKey(this.key); + + static const String table = 'profileTable'; + + static List get values => + ProfileStorageKey.values.map((e) => e.key).toList(); +} + +enum LocalsStorageKey implements DatabaseStorageKey { + petAmount('fre_petAmountRegister'), + whatsapp('fre_whatsapp'), + provisional('fre_provisional'), + pets('fre_pets'), + local('fre_local'), + notify('fre_notify'), + fingerprint('fre_fingerprint'), + access('fre_access'), + panic('fre_panic'), + person('fre_person'), + requestOSNotification('fre_requestOSnotification'), + isNewVersion('fre_isNewVersion'); + + final String key; + + const LocalsStorageKey(this.key); + + static const String table = 'LocalsStorageKey'; + + static List get values => + LocalsStorageKey.values.map((e) => e.key).toList(); +} diff --git a/lib/features/storage/data/models/index.dart b/lib/features/storage/enums/index.dart similarity index 100% rename from lib/features/storage/data/models/index.dart rename to lib/features/storage/enums/index.dart diff --git a/lib/features/storage/data/models/secure_storage.dart b/lib/features/storage/enums/secure_storage.dart similarity index 100% rename from lib/features/storage/data/models/secure_storage.dart rename to lib/features/storage/enums/secure_storage.dart diff --git a/lib/features/storage/data/models/shared_storage.dart b/lib/features/storage/enums/shared_storage.dart similarity index 100% rename from lib/features/storage/data/models/shared_storage.dart rename to lib/features/storage/enums/shared_storage.dart diff --git a/lib/features/storage/data/models/storage.dart b/lib/features/storage/enums/storage.dart similarity index 100% rename from lib/features/storage/data/models/storage.dart rename to lib/features/storage/enums/storage.dart diff --git a/lib/features/storage/data/data_sources/database_data_source.dart b/lib/features/storage/helpers/dabase_storage_helper.dart similarity index 50% rename from lib/features/storage/data/data_sources/database_data_source.dart rename to lib/features/storage/helpers/dabase_storage_helper.dart index 83a0de90..aa04e1d7 100644 --- a/lib/features/storage/data/data_sources/database_data_source.dart +++ b/lib/features/storage/helpers/dabase_storage_helper.dart @@ -1,29 +1,24 @@ +import 'package:hub/features/profile/index.dart'; import 'package:hub/features/storage/index.dart'; -import 'package:sqflite/sqflite.dart'; class DatabaseStorage implements BaseStorage { DatabaseStorage._(); - static final DatabaseStorage instance = DatabaseStorage._(); - late final Database _database; - bool _isInitialized = false; + // static final DatabaseStorage instance = DatabaseStorage._(); + // late final Database _database; + // bool _isInitialized = false; - static DatabaseStorageKey getInstanceByKey(String key) { - if (ProfileStorageKey.values.map((e) => e.value).toList().contains(key)) { - return ProfileStorageKey.instance; - } else (SharedPreferencesKey.values.map((e) => e.value).toList().contains(key)) { - return LocalsStorageKey.instance; - + static BaseStorage getInstanceByKey(String key) { + if (ProfileStorageKey.values.contains(key)) + return ProfileLocalDataSourceImpl.instance(key); + else //if (LocalsStorageKey.values.contains(key)); + return LocalsStorageKey.instance(key); } - - - } - @override - Future clearAll() => throw UnimplementedError(); + Future clearAll() => throw UnimplementedError(); @override Future delete(String key) => throw UnimplementedError(); @override @@ -32,4 +27,4 @@ class DatabaseStorage implements BaseStorage { Future init() => throw UnimplementedError(); @override Future set(String key, T value) => throw UnimplementedError(); -} \ No newline at end of file +} diff --git a/lib/features/storage/helpers/index.dart b/lib/features/storage/helpers/index.dart new file mode 100644 index 00000000..56c9c91c --- /dev/null +++ b/lib/features/storage/helpers/index.dart @@ -0,0 +1,3 @@ +export 'dabase_storage_helper.dart'; +export 'secure_storage_helper.dart'; +export 'shared_storage_helper.dart'; diff --git a/lib/features/storage/data/data_sources/secure_data_source.dart b/lib/features/storage/helpers/secure_storage_helper.dart similarity index 100% rename from lib/features/storage/data/data_sources/secure_data_source.dart rename to lib/features/storage/helpers/secure_storage_helper.dart diff --git a/lib/features/storage/data/data_sources/shared_data_source.dart b/lib/features/storage/helpers/shared_storage_helper.dart similarity index 100% rename from lib/features/storage/data/data_sources/shared_data_source.dart rename to lib/features/storage/helpers/shared_storage_helper.dart diff --git a/lib/features/storage/index.dart b/lib/features/storage/index.dart index 65f22682..8ce9944e 100644 --- a/lib/features/storage/index.dart +++ b/lib/features/storage/index.dart @@ -1,3 +1,5 @@ -export 'data/index.dart'; -export 'domain/index.dart'; -export 'application/index.dart'; +export 'interfaces/index.dart'; +export 'enums/index.dart'; +export 'helpers/index.dart'; +export 'repositories/index.dart'; +export 'services/index.dart'; diff --git a/lib/features/storage/domain/entities/base_storage.dart b/lib/features/storage/interfaces/base_storage.dart similarity index 100% rename from lib/features/storage/domain/entities/base_storage.dart rename to lib/features/storage/interfaces/base_storage.dart diff --git a/lib/features/storage/domain/entities/database_storage.dart b/lib/features/storage/interfaces/database_storage.dart similarity index 100% rename from lib/features/storage/domain/entities/database_storage.dart rename to lib/features/storage/interfaces/database_storage.dart diff --git a/lib/features/storage/domain/entities/index.dart b/lib/features/storage/interfaces/index.dart similarity index 100% rename from lib/features/storage/domain/entities/index.dart rename to lib/features/storage/interfaces/index.dart diff --git a/lib/features/storage/domain/entities/secure_storage.dart b/lib/features/storage/interfaces/secure_storage.dart similarity index 100% rename from lib/features/storage/domain/entities/secure_storage.dart rename to lib/features/storage/interfaces/secure_storage.dart diff --git a/lib/features/storage/domain/entities/shared_storage.dart b/lib/features/storage/interfaces/shared_storage.dart similarity index 100% rename from lib/features/storage/domain/entities/shared_storage.dart rename to lib/features/storage/interfaces/shared_storage.dart diff --git a/lib/features/storage/domain/entities/storage.dart b/lib/features/storage/interfaces/storage.dart similarity index 100% rename from lib/features/storage/domain/entities/storage.dart rename to lib/features/storage/interfaces/storage.dart diff --git a/lib/features/storage/repositories/index.dart b/lib/features/storage/repositories/index.dart new file mode 100644 index 00000000..030753fc --- /dev/null +++ b/lib/features/storage/repositories/index.dart @@ -0,0 +1,2 @@ +export 'storage_repository.dart'; +export 'storage_repository_impl.dart'; diff --git a/lib/features/storage/domain/respositories/storage_repository.dart b/lib/features/storage/repositories/storage_repository.dart similarity index 100% rename from lib/features/storage/domain/respositories/storage_repository.dart rename to lib/features/storage/repositories/storage_repository.dart diff --git a/lib/features/storage/data/repositories/storage_repository.dart b/lib/features/storage/repositories/storage_repository_impl.dart similarity index 84% rename from lib/features/storage/data/repositories/storage_repository.dart rename to lib/features/storage/repositories/storage_repository_impl.dart index d71ee26c..56dc470c 100644 --- a/lib/features/storage/data/repositories/storage_repository.dart +++ b/lib/features/storage/repositories/storage_repository_impl.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:hub/features/profile/data/data_sources/profile_local_data_source.dart'; import 'package:hub/features/storage/index.dart'; -class StorageHelper { +class StorageHelper implements StorageRepository { static final StorageHelper _instance = StorageHelper._internal(); factory StorageHelper() => _instance; StorageHelper._internal(); @@ -22,11 +22,13 @@ class StorageHelper { await SharedPreferencesStorage.instance.init(); await ProfileLocalDataSourceImpl.instance.init(); - String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value); + String? isFirstRun = await SharedPreferencesStorage.instance + .get(SharedPreferencesKey.isFirstRun.value); if (isFirstRun != 'false') { log('First run'); - await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, false); + await SharedPreferencesStorage.instance + .set(SharedPreferencesKey.isFirstRun.value, false); await SecureStorage.instance.set(SecureStorageKey.isLogged.value, false); } } @@ -45,10 +47,13 @@ class StorageHelper { static BaseStorage getInstanceByKey(String key) { if (SecureStorageKey.values.map((e) => e.value).toList().contains(key)) { return SecureStorage.instance; - } else if (SharedPreferencesKey.values.map((e) => e.value).toList().contains(key)) { + } else if (SharedPreferencesKey.values + .map((e) => e.value) + .toList() + .contains(key)) { return SharedPreferencesStorage.instance; } else { - return ProfileLocalDataSourceImpl.instance; + return DatabaseStorage.instance; } } diff --git a/lib/features/storage/application/services/database_service.dart b/lib/features/storage/services/database_storage_service.dart similarity index 100% rename from lib/features/storage/application/services/database_service.dart rename to lib/features/storage/services/database_storage_service.dart diff --git a/lib/features/storage/services/index.dart b/lib/features/storage/services/index.dart new file mode 100644 index 00000000..d92898f1 --- /dev/null +++ b/lib/features/storage/services/index.dart @@ -0,0 +1,4 @@ +export 'database_storage_service.dart'; +export 'secure_storage_service.dart'; +export 'shared_storage_service.dart'; +export 'storage_service.dart'; diff --git a/lib/features/storage/domain/respositories/index.dart b/lib/features/storage/services/secure_storage_service.dart similarity index 100% rename from lib/features/storage/domain/respositories/index.dart rename to lib/features/storage/services/secure_storage_service.dart diff --git a/lib/features/storage/domain/usecases/index.dart b/lib/features/storage/services/shared_storage_service.dart similarity index 100% rename from lib/features/storage/domain/usecases/index.dart rename to lib/features/storage/services/shared_storage_service.dart diff --git a/lib/features/storage/services/storage_service.dart b/lib/features/storage/services/storage_service.dart new file mode 100644 index 00000000..e69de29b