)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Default (Ia.Ftn.Cl.Models.Ui.Administration)

Public general use code classes and xml files that we've compiled and used over the years:

Administration support class for Fixed Telecommunications Network (FTN) ui model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Data;
    4: using System.Linq;
    5: using System.Text;
    6:  
    7: namespace Ia.Ftn.Cl.Models.Ui.Administration
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     /// Administration support class for Fixed Telecommunications Network (FTN) ui model.
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2006-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   17:     ///
   18:     /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
   19:     /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
   20:     ///
   21:     /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   22:     /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
   23:     /// 
   24:     /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
   25:     /// 
   26:     /// Copyright notice: This notice may not be removed or altered from any source distribution.
   27:     /// </remarks> 
   28:     public class Default
   29:     {
   30:         ////////////////////////////////////////////////////////////////////////////
   31:  
   32:         /// <summary>
   33:         ///
   34:         /// </summary>
   35:         public Default() { }
   36:  
   37:         /////////////////////////////////////////////////////////////////////////////////
   38:  
   39:         /// <summary>
   40:         ///
   41:         /// </summary>
   42:         public static Ia.Cl.Models.Result EmailStatusReport(string name, string email)
   43:         {
   44:             //bool b;
   45:             int withinLastNMinutes;
   46:             string content, subject;
   47:             DateTime now;
   48:  
   49:             withinLastNMinutes = 20;
   50:             now = DateTime.UtcNow.AddHours(3);
   51:  
   52:             // subject can't have \r\n
   53:             subject = "Daily Fixed Telecommunications Network's Operations Support System (FTN OSS) Status Report (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
   54:  
   55:             content = "Daily Fixed Telecommunications Network's Operations Support System (FTN OSS) Status Report: " + now.ToString("yyyy-MM-dd HH:mm") + "\r\n"
   56:                 + "\r\n"
   57:                 + "Status:\r\n"
   58:                 + "\r\n"
   59:                 + "\r\n"
   60:                 + "System Monitor:\r\n"
   61:                 + "\r\n"
   62:                 + "System application status within the last " + withinLastNMinutes + " minutes:\r\n"
   63:                 + "\r\n"
   64:                 + "Application name(assembly) active status\r\n"
   65:                 + "\r\n"
   66:                 + Ia.Ftn.Cl.Models.Business.Heartbeat.HearbeatsWithinLastNMinutesTextAsync(withinLastNMinutes).Result + "\r\n"
   67:                 + "\r\n"
   68:                 + "\r\n"
   69:                 + "\r\n"
   70:  
   71:                + @"For help send ""help"" in an email." + "\r\n";
   72:  
   73:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, content);
   74:         }
   75:  
   76:         /////////////////////////////////////////////////////////////////////////////////
   77:  
   78:         /// <summary>
   79:         ///
   80:         /// </summary>
   81:         public static Ia.Cl.Models.Result EmailListWithOntListProvisionedAndReadyButDoNotExistInCustomerDepartmentDatabaseReport(string name, string email)
   82:         {
   83:             //bool b;
   84:             string content, subject;
   85:             DataTable accessDataTable;
   86:             DateTime now;
   87:  
   88:             now = DateTime.UtcNow.AddHours(3);
   89:  
   90:             subject = "Table of latest 100 ONTs that are provisioned and ready within FTN access network but do not exist in the Customer Department's database (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
   91:  
   92:             accessDataTable = Ia.Ftn.Cl.Models.Ui.Access.ReadListWithOntListProvisionedAndReadyButDoNotExistInCustomerDepartmentDatabaseDataTable(100);
   93:  
   94:             content = "Table of latest 100 ONTs that are provisioned and ready within FTN access network but do not exist in the Customer Department's database (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
   95:  
   96:             content += "\r\n";
   97:             content += "\r\n";
   98:  
   99:             content += Ia.Cl.Models.Default.GenerateTabSeparatedTextFromDataTable(accessDataTable);
  100:  
  101:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, content);
  102:         }
  103:  
  104:         /////////////////////////////////////////////////////////////////////////////////
  105:  
  106:         /// <summary>
  107:         ///
  108:         /// </summary>
  109:         public static Ia.Cl.Models.Result EmailStatisticReport(string name, string email)
  110:         {
  111:             //bool b;
  112:             string subject;
  113:             StringBuilder stringBuilder;
  114:             DateTime now;
  115:             List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site> siteList;
  116:             List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea> serviceList;
  117:  
  118:             now = DateTime.UtcNow.AddHours(3);
  119:             stringBuilder = new StringBuilder();
  120:  
  121:             subject = "Statistics of Site, Access, and Service usage within the Fixed Telecommunications Network's Operations Support System (FTN OSS) (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  122:  
  123:             siteList = Ia.Ftn.Cl.Models.Data.Administration.SiteStatistics();
  124:             serviceList = Ia.Ftn.Cl.Models.Data.Administration.ServiceAccessStatisticWithinKuwaitFtnArea();
  125:  
  126:             stringBuilder.AppendLine("Statistics of Site, Access, and Service usage within the Fixed Telecommunications Network's Operations Support System (FTN OSS) (" + now.ToString("yyyy-MM-dd HH:mm") + ")");
  127:  
  128:             stringBuilder.AppendLine();
  129:             stringBuilder.AppendLine("============================================================");
  130:  
  131:             foreach (var s in siteList)
  132:             {
  133:                 stringBuilder.AppendLine(s.ToSimpleTextString());
  134:             }
  135:  
  136:             stringBuilder.AppendLine("============================================================");
  137:  
  138:             foreach (var s in serviceList)
  139:             {
  140:                 stringBuilder.AppendLine(s.ToSimpleTextString());
  141:             }
  142:  
  143:             stringBuilder.AppendLine();
  144:  
  145:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, stringBuilder.ToString());
  146:         }
  147:  
  148:         /////////////////////////////////////////////////////////////////////////////////
  149:  
  150:         /// <summary>
  151:         ///
  152:         /// </summary>
  153:         public static Ia.Cl.Models.Result EmailListOfNumberOfAgcfGatewayRecordInGroupOfMgcIp(string name, string email)
  154:         {
  155:             string content, subject;
  156:             Dictionary<string, int> dictionary;
  157:             DateTime now;
  158:  
  159:             now = DateTime.UtcNow.AddHours(3);
  160:  
  161:             subject = "List of the number of AGCF gateway records in groups of MGC IP (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  162:  
  163:             dictionary = Ia.Ftn.Cl.Models.Business.Nokia.Ims.NumberOfAgcfGatewayRecordInGroupOfMgcIpDictionary.OrderBy(u => u.Key).ToDictionary(u => u.Key, u => u.Value);
  164:  
  165:             content = "List of the number of AGCF gateway records in groups of MGC IP  (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  166:  
  167:             content += "\r\n";
  168:             content += "\r\n";
  169:  
  170:             content += Ia.Cl.Models.Default.GenerateTabSeparatedTextFromDictionary(dictionary);
  171:  
  172:             content += "\r\n";
  173:             content += "Total number of AGCF gateway records: " + dictionary.Sum(u => u.Value) + ". ";
  174:  
  175:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, content);
  176:         }
  177:  
  178:         /////////////////////////////////////////////////////////////////////////////////
  179:  
  180:         /// <summary>
  181:         ///
  182:         /// </summary>
  183:         public static Ia.Cl.Models.Result EmailNokiaReport(string name, string email)
  184:         {
  185:             string content, subject;
  186:             DateTime now;
  187:             List<string> list;
  188:             SortedDictionary<string, int> sortedDictionary;
  189:  
  190:             now = DateTime.UtcNow.AddHours(3);
  191:  
  192:             // subject can't have \r\n
  193:             subject = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Nokia Report (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  194:  
  195:             content = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Nokia Report: " + now.ToString("yyyy-MM-dd HH:mm") + "\r\n"
  196:                 + "Status: Normal\r\n";
  197:  
  198:             content += "\r\n";
  199:             content += "\r\n";
  200:  
  201:  
  202:             content += "List of the number of AGCF gateway records in groups of MGC IP: ";
  203:  
  204:             content += "\r\n";
  205:             content += "\r\n";
  206:  
  207:             sortedDictionary = new SortedDictionary<string, int>(Ia.Ftn.Cl.Models.Business.Nokia.Ims.NumberOfAgcfGatewayRecordInGroupOfMgcIpDictionary);
  208:  
  209:             content += Ia.Cl.Models.Default.GenerateTabSeparatedTextFromDictionary(sortedDictionary);
  210:  
  211:             content += "\r\n";
  212:             content += "\r\n";
  213:  
  214:  
  215:             content += "List of the number of AGCF gateway records in IMS pairs of MGC IP: ";
  216:  
  217:             content += "\r\n";
  218:             content += "\r\n";
  219:  
  220:             foreach (Ia.Ftn.Cl.Models.Business.Nokia.Ims.ImsBasicService imsBasicService in Ia.Ftn.Cl.Models.Business.Nokia.Ims.ImsBasicServiceList)
  221:             {
  222:                 content += imsBasicService.MgcIp + ", " + imsBasicService.MgcSecondaryIp + "\t" + (sortedDictionary[imsBasicService.MgcIp] + sortedDictionary[imsBasicService.MgcSecondaryIp]);
  223:                 content += "\r\n";
  224:             }
  225:  
  226:             content += "\r\n";
  227:             content += "\r\n";
  228:  
  229:  
  230:             content += "Number of Nokia H.248 subscribers per FSDB: ";
  231:  
  232:             content += "\r\n";
  233:             content += "\r\n";
  234:  
  235:             list = Ia.Ftn.Cl.Models.Business.Nokia.Ims.NumberOfNokiaH248SubsribersPerFsdb();
  236:  
  237:             content += string.Join("\r\n", list.ToArray());
  238:             content += "\r\n";
  239:  
  240:             content += "\r\n";
  241:             content += "\r\n";
  242:  
  243:  
  244:             content += "Number of Nokia SIP subscribers per FSDB: ";
  245:  
  246:             content += "\r\n";
  247:             content += "\r\n";
  248:  
  249:             list = Ia.Ftn.Cl.Models.Business.Nokia.Ims.NumberOfNokiaSipSubsribersPerFsdb();
  250:  
  251:             content += string.Join("\r\n", list.ToArray());
  252:             content += "\r\n";
  253:  
  254:             content += "\r\n";
  255:             content += "\r\n";
  256:  
  257:  
  258:             content += "Service and access name list where subscriber's AlternateOtasRealm group number is not equal to subparties AssocOtasRealm group number: ";
  259:  
  260:             content += "\r\n";
  261:             content += "\r\n";
  262:  
  263:             list.Clear();
  264:  
  265:             foreach (var s in Ia.Ftn.Cl.Models.Data.Nokia.Ims.ServiceWhereSubscriberAlternateOtasRealmGroupNumberDoesNotEqualSubPartyAssocOtasRealmGroupNumberList())
  266:             {
  267:                 list.Add(Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s));
  268:             }
  269:  
  270:             if (list.Count > 0)
  271:             {
  272:                 content += string.Join("\r\n", list.ToArray());
  273:             }
  274:             else content += "None";
  275:  
  276:             content += "\r\n";
  277:  
  278:             content += "\r\n";
  279:             content += "\r\n";
  280:  
  281:  
  282:             content += "AGCF gateway records within NDD ONT list with wrong secondary IP: ";
  283:  
  284:             content += "\r\n";
  285:             content += "\r\n";
  286:  
  287:             list.Clear();
  288:  
  289:             var agcfGatewayRecordsWithinNddOntListWithWrongSecondaryIpList = Ia.Ftn.Cl.Models.Data.Nokia.Ims.AgcfGatewayRecordsWithinNddOntListWithWrongSecondaryIpList();
  290:  
  291:             foreach (var w in agcfGatewayRecordsWithinNddOntListWithWrongSecondaryIpList)
  292:             {
  293:                 list.Add(w.GwId.ToString());
  294:             }
  295:  
  296:             content += string.Join(", ", list.ToArray());
  297:  
  298:             content += "\r\n";
  299:             content += "\r\n";
  300:             content += "\r\n";
  301:  
  302:  
  303:             content += "SubParties' PrimaryPUIDCPEProfileNumber count distribution: ";
  304:  
  305:             content += "\r\n";
  306:             content += "\r\n";
  307:  
  308:             list.Clear();
  309:  
  310:             foreach (KeyValuePair<int, int> w in Ia.Ftn.Cl.Models.Data.Nokia.SubParty.PrimaryPuidCpeProfileNumberCountDistributionDictionary)
  311:             {
  312:                 list.Add(w.Key + "\t" + w.Value);
  313:             }
  314:  
  315:             content += string.Join("\r\n", list.ToArray());
  316:  
  317:             content += "\r\n";
  318:             content += "\r\n";
  319:  
  320:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, content);
  321:         }
  322:  
  323:         /////////////////////////////////////////////////////////////////////////////////
  324:  
  325:         /// <summary>
  326:         ///
  327:         /// </summary>
  328:         public static Ia.Cl.Models.Result EmailHuaweiReport(string name, string email)
  329:         {
  330:             string content, subject;
  331:             DateTime now;
  332:  
  333:             now = DateTime.UtcNow.AddHours(3);
  334:  
  335:             // subject can't have \r\n
  336:             subject = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Huawei Report (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  337:  
  338:             content = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Huawei Report: " + now.ToString("yyyy-MM-dd HH:mm") + "\r\n"
  339:                 + "Status:.\r\n";
  340:  
  341:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(name, email, subject, content);
  342:         }
  343:  
  344:         /////////////////////////////////////////////////////////////////////////////////
  345:  
  346:         /// <summary>
  347:         ///
  348:         /// </summary>
  349:         public static Ia.Cl.Models.Result EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string emailRecipientName, string email)
  350:         {
  351:             return EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string.Empty, emailRecipientName, email);
  352:         }
  353:  
  354:         /////////////////////////////////////////////////////////////////////////////////
  355:  
  356:         /// <summary>
  357:         ///
  358:         /// </summary>
  359:         public static Ia.Cl.Models.Result EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string pstnName, string emailRecipientName, string email)
  360:         {
  361:             string title, content, subject;
  362:             StringBuilder stringBuilder;
  363:             DateTime now;
  364:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Pstn pstn;
  365:             Dictionary<string, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Site> dictionary;
  366:  
  367:             now = DateTime.UtcNow.AddHours(3);
  368:  
  369:             var dictionary0 = Ia.Ftn.Cl.Models.Data.Service.ImsServiceToOntAndMsanSiteInAllowedToBeMigratedOltAndDomainDictionary;
  370:  
  371:             if (string.IsNullOrEmpty(pstnName))
  372:             {
  373:                 // all sites
  374:  
  375:                 dictionary = dictionary0;
  376:  
  377:                 title = "قائمة بأرقام المقاسم المحلية المرحّلة إلى شبكة الألياف الضوئية والأرقام التي تتبع نطاق المقاسم المحلية وتم تركيبها حديثاً على أجهزة نهايات رقمية أو أمسان";
  378:  
  379:                 subject = title + " " + now.ToString("yyyy-MM-dd HH:mm");
  380:  
  381:                 content = title + "\r\n";
  382:                 content += "\r\n";
  383:                 content += "List of local PSTN domain services migrated or provisioned into IMS fiber or IMS MSAN services";
  384:                 content += "\r\n";
  385:                 content += "\r\n";
  386:                 content += now.ToString("yyyy-MM-dd HH:mm");
  387:  
  388:                 content += "\r\n";
  389:                 content += "\r\n";
  390:             }
  391:             else
  392:             {
  393:                 pstn = (from s in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnList where s.Name == pstnName select s).Single();
  394:  
  395:                 dictionary = (from d in dictionary0
  396:                               where d.Value == pstn.Site && pstn.DomainList.Any(u => d.Key.StartsWith(u.ToString()))
  397:                               select d).ToDictionary(u => u.Key, u => u.Value);
  398:  
  399:                 title = "قائمة بأرقام مقسم " + pstn.ArabicName + " المرحّلة إلى شبكة الألياف الضوئية والأرقام التي تتبع نطاق المقسم وتم تركيبها حديثاً على أجهزة نهايات رقمية أو أمسان";
  400:  
  401:                 subject = title + " " + now.ToString("yyyy-MM-dd HH:mm");
  402:  
  403:                 content = title + "\r\n";
  404:                 content += "\r\n";
  405:                 content += "List of " + pstn.Name + " PSTN domain services migrated or provisioned into IMS fiber or IMS MSAN services";
  406:                 content += "\r\n";
  407:                 content += "\r\n";
  408:                 content += now.ToString("yyyy-MM-dd HH:mm");
  409:  
  410:                 content += "\r\n";
  411:                 content += "\r\n";
  412:             }
  413:  
  414:             stringBuilder = new StringBuilder(dictionary.Count * 64);
  415:  
  416:             if (dictionary.Count > 0)
  417:             {
  418:                 stringBuilder.AppendLine("List count: " + dictionary.Count);
  419:                 stringBuilder.AppendLine(" ");
  420:  
  421:                 stringBuilder.Append(string.Join(", ", dictionary.Keys));
  422:             }
  423:             else
  424:             {
  425:                 stringBuilder.AppendLine("List count: zero");
  426:                 stringBuilder.AppendLine(" ");
  427:             }
  428:  
  429:             content += stringBuilder.ToString().Trim();
  430:  
  431:             content += "\r\n";
  432:             content += "\r\n";
  433:  
  434:             return Ia.Ftn.Cl.Models.Ui.Mail.SendPlainMail(emailRecipientName, email, subject, content);
  435:         }
  436:  
  437:         /////////////////////////////////////////////////////////////////////////////////
  438:         /////////////////////////////////////////////////////////////////////////////////
  439:  
  440:         /// <summary>
  441:         ///
  442:         /// </summary>
  443:         public static void StatisticsListForTelegramBotApi(Ia.Ftn.Cl.Models.Business.Administration.Framework framework, string opcode, out string subject, out string content)
  444:         {
  445:             string inputType, horizontalRule;
  446:             StringBuilder stringBuilder;
  447:             DateTime now;
  448:  
  449:             inputType = string.Empty;
  450:             horizontalRule = " ";
  451:  
  452:             now = DateTime.UtcNow.AddHours(3);
  453:  
  454:             // subject can't have \r\n
  455:             subject = string.Empty; // "Fixed Telecommunications Network's Operations Support System (FTN OSS) TNMD list: ";
  456:  
  457:             if (Ia.Ftn.Cl.Models.Business.Authority.FrameworkCanReadStatistics(framework))
  458:             {
  459:                 opcode = opcode.ToLower();
  460:  
  461:                 StatisticListForTelegramBotApiAndMailSimpleText(opcode, inputType, horizontalRule, out stringBuilder);
  462:  
  463:                 stringBuilder.AppendLine(horizontalRule);
  464:                 stringBuilder.AppendLine(Ia.Ftn.Cl.Models.Data.Help.Text(Ia.Ftn.Cl.Models.Data.Help.TelegramString.NeedHelpSendCommandSlashHelp));
  465:                 stringBuilder.AppendLine(horizontalRule);
  466:                 stringBuilder.AppendLine();
  467:  
  468:                 content = stringBuilder.ToString();
  469:             }
  470:             else
  471:             {
  472:                 content = "\r\n";
  473:                 content += "You are not authorized to modify this value. ";
  474:                 content += "\r\n";
  475:             }
  476:         }
  477:  
  478:         ////////////////////////////////////////////////////////////////////////////
  479:  
  480:         /// <summary>
  481:         ///
  482:         /// </summary>
  483:         public static void StatisticListForTelegramBotApiAndMailSimpleText(string opcode, string inputType, string horizontalRule, out StringBuilder contentStringBuilder)
  484:         {
  485:             StringBuilder stringBuilder;
  486:             DateTime now;
  487:             List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea> statisticList;
  488:  
  489:             stringBuilder = new StringBuilder();
  490:             now = DateTime.UtcNow.AddHours(3);
  491:  
  492:             //stringBuilder.AppendLine("Fixed Telecommunications Network's Operations Support System (FTN OSS) Find Result: " + now.ToString("yyyy-MM-dd HH:mm"));
  493:  
  494:             //stringBuilder.AppendLine(@"Opcode: """ + opcode + @""".");
  495:             //responseContent += @"Operand: """ + operand + @"""." + "\r\n";
  496:             //stringBuilder.AppendLine();
  497:  
  498:             if (opcode.Contains("statistics"))
  499:             {
  500:                 statisticList = Ia.Ftn.Cl.Models.Data.Administration.ServiceAccessStatisticWithinKuwaitFtnAreaCachedDaily;
  501:  
  502:                 if (statisticList != null && statisticList.Count > 0)
  503:                 {
  504:                     stringBuilder.AppendLine(horizontalRule);
  505:                     stringBuilder.AppendLine("Statistics:");
  506:                     stringBuilder.AppendLine();
  507:                     foreach (var s in statisticList) stringBuilder.AppendLine(s.ToSimpleTextString());
  508:                     stringBuilder.AppendLine(horizontalRule);
  509:                     stringBuilder.AppendLine();
  510:                 }
  511:                 else
  512:                 {
  513:                     stringBuilder.AppendLine(horizontalRule);
  514:                     stringBuilder.AppendLine();
  515:                 }
  516:             }
  517:             else
  518:             {
  519:                 stringBuilder.AppendLine(horizontalRule);
  520:                 stringBuilder.AppendLine("Error: opcode: [" + opcode + "] is unrecognized. ");
  521:                 stringBuilder.AppendLine(horizontalRule);
  522:                 stringBuilder.AppendLine();
  523:             }
  524:  
  525:             contentStringBuilder = stringBuilder.Replace(Environment.NewLine + horizontalRule, horizontalRule);
  526:         }
  527:  
  528:         ////////////////////////////////////////////////////////////////////////////
  529:         ////////////////////////////////////////////////////////////////////////////    
  530:     }
  531:  
  532:     ////////////////////////////////////////////////////////////////////////////
  533:     ////////////////////////////////////////////////////////////////////////////   
  534: }