/// <summary>
        /// This interface is used to generate a quote from file URLs that will be loaded. A quote can contain multiple projects.
        /// </summary>
        /// <param name="service"></param>
        /// <param name="fileURLs"></param>
        /// <param name="fileNames"></param>
        /// <param name="options"></param>
        /// <param name="referenceFiles">If null, will not use reference files</param>
        /// <returns></returns>
        public Quote GenerateQuote(Service service, Uri[] fileURLs, String[] fileNames, QuoteOptions options, IEnumerable<File> referenceFiles = null)
        {
            // Check the service
            if (service == null)
            {
                throw new ArgumentNullException("service", "Must specify a Service to generate a quote");
            }

            if (fileURLs == null || fileNames == null)
            {
                throw new ArgumentNullException("files", "Must specify the fileURLs and fileNames");
            }

            if (!service.AcceptsFiles)
            {
                throw new ArgumentException("This service does not accept files.  Please use GenerateQuote with Products", "service");
            }

            if (options == null)
            {
                throw new ArgumentNullException("options", "Must specify options to generate a quote");
            }

            options.Initialize(this, service);

            // Check that the file extensions are valid
            foreach (String fileName in fileNames)
            {
                if (!service.AcceptsExtension(Path.GetExtension(fileName)))
                {
                    throw new ArgumentOutOfRangeException("fileNames", fileName, "Service does not accept files with this extension");
                }
            }

            // Upload the files
            List<File> addedFiles = new List<File>();

            for (int i = 0; i < fileNames.Length && i < fileURLs.Length; i++)
            {
                addedFiles.Add(this.AddFile(options.SourceLanguage.LanguageCode, fileNames[i], fileURLs[i]));
            }

            return this.GenerateQuote(service, addedFiles, options, referenceFiles);
        }
        /// <summary>
        /// This interface is used to generate a quote from file paths that will be loaded. A quote can contain multiple projects.
        /// </summary>
        /// <param name="service"></param>
        /// <param name="filePaths"></param>
        /// <param name="options"></param>
        /// <param name="referenceFilePaths">If null, will not use reference files</param>
        /// <returns></returns>
        public Quote GenerateQuote(Service service, string[] filePaths, QuoteOptions options, string[] referenceFilePaths = null)
        {
            // Check the service
            if (service == null)
            {
                throw new ArgumentNullException("service", "Must specify a Service to generate a quote");
            }

            if (!service.AcceptsFiles)
            {
                throw new ArgumentException("This service does not accept files.  Please use GenerateQuote with Products", "service");
            }

            if (options == null)
            {
                throw new ArgumentNullException("options", "Must specify options to generate a quote");
            }

            options.Initialize(this, service);

            // Check that the file extensions are valid
            foreach (String filePath in filePaths)
            {
                if (!service.AcceptsExtension(Path.GetExtension(filePath)))
                {
                    throw new ArgumentOutOfRangeException("filePaths", filePath, "Service does not accept files with this extension");
                }
            }

            // Upload the files
            List<File> addedFiles = new List<File>();

            foreach (String filePath in filePaths)
            {
                addedFiles.Add(this.AddFile(options.SourceLanguage.LanguageCode, filePath));
            }

            // Upload the reference
            List<File> referenceFiles = null;

            if (referenceFilePaths != null)
            {
                referenceFiles = new List<File>();
                foreach (String referenceFilePath in referenceFilePaths)
                {
                    referenceFiles.Add(this.AddFile(options.SourceLanguage.LanguageCode, referenceFilePath));
                }
            }

            return this.GenerateQuote(service, addedFiles, options, referenceFiles);
        }