public async Task ExtractMessage(
            string fileInputLocation,
            string password)
        {
            try
            {
                using (var input = new FileStream(fileInputLocation, FileMode.Open, FileAccess.Read))
                {
                    ConsoleLogger.LogMessage("Creating decoder instance...");
                    var decoder = await ImageDecoder.LoadAsync(
                        imageStream : input,
                        decodingConfiguration : new DecodingConfiguration
                        (
                            password: password,
                            tempStorageProvider: new MemoryStorageProvider(),
                            bufferSize: 81920)
                        );

                    ConsoleLogger.LogMessage("Creating decoder output handler...");
                    Output.FileDataOutputHandler handler = new Output.FileDataOutputHandler(
                        (directory, file, stream) =>
                    {
                        if (stream != null)
                        {
                            using (StreamReader reader = new StreamReader(stream))
                            {
                                ConsoleLogger.LogMessage("Decoding completed");
                                ConsoleLogger.LogMessage("Message payload: ");
                                ConsoleLogger.LogMessage(reader.ReadToEnd());
                            }
                        }
                        else
                        {
                            ConsoleLogger.ShowErrorMessage("Image doesn't contain any message payload");
                        }
                        return(Task.CompletedTask);
                    }
                        );
                    ConsoleLogger.LogMessage("Start decoding image, extracting payload...");
                    await decoder.DecodeAsync(outputHandler : handler);
                }
            }
            catch (InvalidPasswordException)
            {
                ConsoleLogger.ShowErrorMessage("Invalid password");
            }
            catch (Exception ex)
            {
                ConsoleLogger.ShowErrorMessage(ex.Message);
            }
        }
        public async Task ExtractFiles(
            string fileInputLocation,
            string password,
            string targetDirectory)
        {
            try
            {
                using (var input = new FileStream(fileInputLocation, FileMode.Open, FileAccess.Read))
                {
                    ConsoleLogger.LogMessage("Creating decoder instance...");
                    var decoder = await ImageDecoder.LoadAsync
                                  (
                        imageStream : input,
                        decodingConfiguration : new DecodingConfiguration
                        (
                            password: password,
                            tempStorageProvider: new MemoryStorageProvider(),
                            bufferSize: 81920
                        ));

                    ConsoleLogger.LogMessage("Creating decoder output handler...");
                    Output.FileDataOutputHandler handler = new Output.FileDataOutputHandler(
                        (directory, file, stream) =>
                    {
                        if (stream != null)
                        {
                            try
                            {
                                string fullName = Path.Combine(targetDirectory, file.Name);
                                if (File.Exists(fullName))
                                {
                                    File.Delete(fullName);
                                }
                                ConsoleLogger.LogMessage($"'{file.Name}' has been extracted to {fullName}");
                                using (FileStream saveStream = new FileStream(fullName, FileMode.OpenOrCreate, FileAccess.Write))
                                {
                                    stream.CopyTo(saveStream);
                                }
                            }
                            catch
                            {
                                ConsoleLogger.ShowErrorMessage($"Failed to process '{file.Name}' from the image container");
                            }
                        }
                        return(Task.CompletedTask);
                    }
                        );
                    ConsoleLogger.LogMessage("Start decoding image, extracting payload...");
                    await decoder.DecodeAsync(outputHandler : handler);
                }
            }

            catch (InvalidPasswordException)
            {
                ConsoleLogger.ShowErrorMessage("Invalid password");
            }
            catch (Exception ex)
            {
                ConsoleLogger.ShowErrorMessage(ex.Message);
            }
        }