public static void Main(string[] args)
        {
            var options = new CommandLineOptions();
            var parser  = new CommandLineParser();

            if (!parser.ParseArguments(args, options))
            {
                Console.WriteLine(options.GetUsage());
                Environment.Exit(1);
                return;
            }

            var timestamp = Math.Round((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds);

            var key = options.Key.Replace("__unix_timestamp__", timestamp.ToString());

            Console.WriteLine("Using key <{0}>", key);

            try
            {
                var s3Client        = new AmazonS3Client(options.AccessKey, options.SecretKey);
                var transferUtility = new TransferUtility(s3Client);
                var transferRequest = new TransferUtilityUploadRequest()
                                      .WithBucketName(options.Bucket)
                                      .WithFilePath(options.File)
                                      .WithKey(key);


                if (options.IsPublic)
                {
                    transferRequest.WithCannedACL(S3CannedACL.PublicRead);
                }

                if (options.ShouldShowProgress)
                {
                    Console.WriteLine();
                    transferRequest.WithSubscriber(new EventHandler <UploadProgressArgs>((obj, progress) =>
                    {
                        Console.Write("\r{0}% complete. Uploaded {1} / {2} bytes.                    ", progress.PercentDone, progress.TransferredBytes, progress.TotalBytes);
                    }));
                }

                transferUtility.Upload(transferRequest);

                Console.WriteLine();
                Console.WriteLine("Done!");
            }
            catch (Exception e)
            {
                Console.WriteLine("Error uploading: {0}", e.Message);
                Environment.Exit(1);
            }
        }