public override ProtectedString Generate(PwProfile prf, CryptoRandomStream crsRandomSource)
        {
            var words   = GetWords();
            var options = GeneratorOptions.FromString(prf.CustomAlgorithmOptions);

            var strings = new List <string>();


            //Handle digits
            var digitStrs = new string[options.DigitCount];

            for (var i = 0; i < options.DigitCount; i++)
            {
                digitStrs[i] = crsRandomSource.GetRandomInt(10).ToString();
            }
            if (options.KeepDigitsTogether)
            {
                strings.Add(string.Concat(digitStrs));
            }
            else
            {
                strings.AddRange(digitStrs);
            }


            //Handle words
            if (options.MaxLength == 0)
            {
                if (options.MinLength == 0)
                {
                    for (var i = 0; i < 3; i++)
                    {
                        strings.Add(crsRandomSource.GetRandomElement(words));
                    }
                }
                else
                {
                    var tmpLength = (int)options.DigitCount;
                    while (tmpLength < options.MinLength)
                    {
                        var str = crsRandomSource.GetRandomElement(words);
                        strings.Add(str);
                        tmpLength += str.Length;
                    }
                }
            }
            else
            {
                var left = (int)options.MaxLength - (int)options.DigitCount;
                while (true)
                {
                    var validWords = words.Where(o => o.Length <= left);
                    if (!validWords.Any())
                    {
                        break;
                    }

                    var str = crsRandomSource.GetRandomElement(validWords);
                    strings.Add(str);
                    left -= str.Length;

                    if (options.MinLength != 0 && options.MinLength <= options.MaxLength - left)
                    {
                        break;
                    }
                }
            }

            //Permutate and concatenate
            var permutation = crsRandomSource.GetRandomPermutation(strings);

            return(new ProtectedString(true, string.Concat(permutation)));
        }