/// <summary>
        /// Capitalizes characters on the password.
        /// </summary>
        /// <param name="password">The password.</param>
        /// <param name="capitalizationType">The capitalization type.</param>
        /// <returns>The capitalized password.</returns>
        private static string CapitalizePassword(string password, CapitalizationTypes capitalizationType, RandomNumber randomNumber)
        {
            if (capitalizationType == CapitalizationTypes.None)
                return password;

            char[] passwordChars = password.ToCharArray();

            if (capitalizationType == CapitalizationTypes.FirstLetter)
            {
                // Loop through charactes and make the first letter upercase.
                for (int i = 0; i < passwordChars.Length; i++)
                {
                    if (char.IsLetter(passwordChars[i]) && char.IsLower(passwordChars[i]))
                    {
                        passwordChars[i] = char.ToUpper(passwordChars[i]);
                        break;
                    }
                }
            }
            else
            {
                // First let's make sure this can be applied to the current string
                bool hasLetter = false;
                for (int i = 0; i < passwordChars.Length; i++)
                {
                    if (char.IsLetter(passwordChars[i]))
                    {
                        hasLetter = true;
                        break;
                    }
                }

                // Get a random letter from the password and make it uppercase
                if (hasLetter)
                {
                    while (true)
                    {
                        int i = randomNumber.Next(passwordChars.Length);
                        if (char.IsLetter(passwordChars[i]) && char.IsLower(passwordChars[i]))
                        {
                            passwordChars[i] = char.ToUpper(passwordChars[i]);
                            break;
                        }
                    }
                }
            }

            return new string(passwordChars);
        }
        /// <summary>
        /// Generate a random dictionary password.
        /// </summary>
        /// <param name="prf">The password profile to use.</param>
        /// <param name="crsRandomSource">The cryptographic stream.</param>
        /// <returns>A generated ProtectedString password.</returns>
        public override ProtectedString Generate(PwProfile prf, CryptoRandomStream crsRandomSource)
        {
            // Get the generator options.
            GeneratorOptions options = new GeneratorOptions(prf.CustomAlgorithmOptions);

            // Check if a word dictionary has already been loaded, if not, load it.
            if (_wordDictionary == null || _currentWordLength != options.WordLength)
            {
                _wordDictionary = ExtractWordDictionary(options.WordLength);
                _currentWordLength = options.WordLength;
            }

            // Get a random word from the dictionary
            RandomNumber randomNumber = new RandomNumber(crsRandomSource);
            string password = _wordDictionary.Count > 0 ? _wordDictionary[randomNumber.Next(_wordDictionary.Count)] : string.Empty;
            _wordDictionary.Remove(password);

            // Substitute characters if specified.
            if (options.SubstituteCharacters && !string.IsNullOrEmpty(options.SubstitutionList))
                password = SubstituteCharacters(password, options.SubstitutionList);

            // Capitalize if necessary
            if (options.CapitalizationType != CapitalizationTypes.None)
                password = CapitalizePassword(password, options.CapitalizationType, randomNumber);

            return new ProtectedString(false, password);
        }