)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Default (Ia.Ftn.Cl.Model.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.Model.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 void EmailStatusReport(string name, string email, out Ia.Cl.Models.Result result)
   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.Model.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:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, content, out result);
   74:         }
   75:  
   76:         /////////////////////////////////////////////////////////////////////////////////
   77:  
   78:         /// <summary>
   79:         ///
   80:         /// </summary>
   81:         public static void EmailListWithOntListProvisionedAndReadyButDoNotExistInCustomerDepartmentDatabaseReport(string name, string email, out Ia.Cl.Models.Result result)
   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.Model.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:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, content, out result);
  102:         }
  103:  
  104:         /////////////////////////////////////////////////////////////////////////////////
  105:  
  106:         /// <summary>
  107:         ///
  108:         /// </summary>
  109:         public static void EmailStatisticReport(string name, string email, out Ia.Cl.Models.Result result)
  110:         {
  111:             //bool b;
  112:             string subject;
  113:             StringBuilder stringBuilder;
  114:             DateTime now;
  115:             List<Ia.Ftn.Cl.Model.Business.Administration.Statistic.Site> siteList;
  116:             List<Ia.Ftn.Cl.Model.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.Model.Data.Administration.SiteStatistic();
  124:             serviceList = Ia.Ftn.Cl.Model.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:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, stringBuilder.ToString(), out result);
  146:         }
  147:  
  148:         /////////////////////////////////////////////////////////////////////////////////
  149:  
  150:         /// <summary>
  151:         ///
  152:         /// </summary>
  153:         public static void EmailListOfNumberOfAgcfGatewayRecordInGroupOfMgcIp(string name, string email, out Ia.Cl.Models.Result result)
  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.Model.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:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, content, out result);
  176:         }
  177:  
  178:         /////////////////////////////////////////////////////////////////////////////////
  179:  
  180:         /// <summary>
  181:         ///
  182:         /// </summary>
  183:         public static void EmailNokiaReport(string name, string email, out Ia.Cl.Models.Result result)
  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.Model.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.Model.Business.Nokia.Ims.ImsBasicService imsBasicService in Ia.Ftn.Cl.Model.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.Model.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.Model.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.Model.Data.Nokia.Ims.ServiceWhereSubscriberAlternateOtasRealmGroupNumberDoesNotEqualSubPartyAssocOtasRealmGroupNumberList())
  266:             {
  267:                 list.Add(Ia.Ftn.Cl.Model.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.Model.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.Model.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:  
  321:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, content, out result);
  322:         }
  323:  
  324:         /////////////////////////////////////////////////////////////////////////////////
  325:  
  326:         /// <summary>
  327:         ///
  328:         /// </summary>
  329:         public static void EmailHuaweiReport(string name, string email, out Ia.Cl.Models.Result result)
  330:         {
  331:             string content, subject;
  332:             DateTime now;
  333:  
  334:             now = DateTime.UtcNow.AddHours(3);
  335:  
  336:             // subject can't have \r\n
  337:             subject = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Huawei Report (" + now.ToString("yyyy-MM-dd HH:mm") + ")";
  338:  
  339:             content = "Weekly Fixed Telecommunications Network's Operations Support System (FTN OSS) Huawei Report: " + now.ToString("yyyy-MM-dd HH:mm") + "\r\n"
  340:                 + "Status:.\r\n";
  341:  
  342:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(name, email, subject, content, out result);
  343:         }
  344:  
  345:         /////////////////////////////////////////////////////////////////////////////////
  346:  
  347:         /// <summary>
  348:         ///
  349:         /// </summary>
  350:         public static void EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string emailRecipientName, string email, out Ia.Cl.Models.Result result)
  351:         {
  352:             EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string.Empty, emailRecipientName, email, out result);
  353:         }
  354:  
  355:         /////////////////////////////////////////////////////////////////////////////////
  356:  
  357:         /// <summary>
  358:         ///
  359:         /// </summary>
  360:         public static void EmailListOfPreviouslyPstnDomainServicesMigratedOrProvisionedIntoImsFiberOrImsMsanServicesInAllowedToBeMigratedOltsReport(string pstnName, string emailRecipientName, string email, out Ia.Cl.Models.Result result)
  361:         {
  362:             string title, content, subject;
  363:             StringBuilder stringBuilder;
  364:             DateTime now;
  365:             Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Pstn pstn;
  366:             Dictionary<string, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Site> dictionary;
  367:  
  368:             now = DateTime.UtcNow.AddHours(3);
  369:  
  370:             var dictionary0 = Ia.Ftn.Cl.Model.Data.Service.ImsServiceToOntAndMsanSiteInAllowedToBeMigratedOltAndDomainDictionary;
  371:  
  372:             if (string.IsNullOrEmpty(pstnName))
  373:             {
  374:                 // all sites
  375:  
  376:                 dictionary = dictionary0;
  377:  
  378:                 title = "قائمة بأرقام المقاسم المحلية المرحّلة إلى شبكة الألياف الضوئية والأرقام التي تتبع نطاق المقاسم المحلية وتم تركيبها حديثاً على أجهزة نهايات رقمية أو أمسان";
  379:  
  380:                 subject = title + " " + now.ToString("yyyy-MM-dd HH:mm");
  381:  
  382:                 content = title + "\r\n";
  383:                 content += "\r\n";
  384:                 content += "List of local PSTN domain services migrated or provisioned into IMS fiber or IMS MSAN services";
  385:                 content += "\r\n";
  386:                 content += "\r\n";
  387:                 content += now.ToString("yyyy-MM-dd HH:mm");
  388:  
  389:                 content += "\r\n";
  390:                 content += "\r\n";
  391:             }
  392:             else
  393:             {
  394:                 pstn = (from s in Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.PstnList where s.Name == pstnName select s).Single();
  395:  
  396:                 dictionary = (from d in dictionary0
  397:                               where d.Value == pstn.Site && pstn.DomainList.Any(u => d.Key.StartsWith(u.ToString()))
  398:                               select d).ToDictionary(u => u.Key, u => u.Value);
  399:  
  400:                 title = "قائمة بأرقام مقسم " + pstn.ArabicName + " المرحّلة إلى شبكة الألياف الضوئية والأرقام التي تتبع نطاق المقسم وتم تركيبها حديثاً على أجهزة نهايات رقمية أو أمسان";
  401:  
  402:                 subject = title + " " + now.ToString("yyyy-MM-dd HH:mm");
  403:  
  404:                 content = title + "\r\n";
  405:                 content += "\r\n";
  406:                 content += "List of " + pstn.Name + " PSTN domain services migrated or provisioned into IMS fiber or IMS MSAN services";
  407:                 content += "\r\n";
  408:                 content += "\r\n";
  409:                 content += now.ToString("yyyy-MM-dd HH:mm");
  410:  
  411:                 content += "\r\n";
  412:                 content += "\r\n";
  413:             }
  414:  
  415:             stringBuilder = new StringBuilder(dictionary.Count * 64);
  416:  
  417:             if (dictionary.Count > 0)
  418:             {
  419:                 stringBuilder.AppendLine("List count: " + dictionary.Count);
  420:                 stringBuilder.AppendLine(" ");
  421:  
  422:                 stringBuilder.Append(string.Join(", ", dictionary.Keys));
  423:             }
  424:             else
  425:             {
  426:                 stringBuilder.AppendLine("List count: zero");
  427:                 stringBuilder.AppendLine(" ");
  428:             }
  429:  
  430:             content += stringBuilder.ToString().Trim();
  431:  
  432:             content += "\r\n";
  433:             content += "\r\n";
  434:  
  435:             Ia.Ftn.Cl.Model.Ui.Mail.SendPlainMail(emailRecipientName, email, subject, content, out result);
  436:         }
  437:  
  438:         /////////////////////////////////////////////////////////////////////////////////
  439:         /////////////////////////////////////////////////////////////////////////////////
  440:  
  441:         /// <summary>
  442:         ///
  443:         /// </summary>
  444:         public static void StatisticsListForTelegramBotApi(Ia.Ftn.Cl.Model.Business.Administration.Framework framework, string opcode, out string subject, out string content)
  445:         {
  446:             string inputType, horizontalRule;
  447:             StringBuilder stringBuilder;
  448:             DateTime now;
  449:  
  450:             inputType = string.Empty;
  451:             horizontalRule = " ";
  452:  
  453:             now = DateTime.UtcNow.AddHours(3);
  454:  
  455:             // subject can't have \r\n
  456:             subject = string.Empty; // "Fixed Telecommunications Network's Operations Support System (FTN OSS) TNMD list: ";
  457:  
  458:             if (Ia.Ftn.Cl.Model.Business.Authority.FrameworkCanReadStatistics(framework))
  459:             {
  460:                 opcode = opcode.ToLower();
  461:  
  462:                 StatisticListForTelegramBotApiAndMailSimpleText(opcode, inputType, horizontalRule, out stringBuilder);
  463:  
  464:                 stringBuilder.AppendLine(horizontalRule);
  465:                 stringBuilder.AppendLine(Ia.Ftn.Cl.Model.Data.Help.Text(Ia.Ftn.Cl.Model.Data.Help.TelegramString.NeedHelpSendCommandSlashHelp));
  466:                 stringBuilder.AppendLine(horizontalRule);
  467:                 stringBuilder.AppendLine();
  468:  
  469:                 content = stringBuilder.ToString();
  470:             }
  471:             else
  472:             {
  473:                 content = "\r\n";
  474:                 content += "You are not authorized to modify this value. ";
  475:                 content += "\r\n";
  476:             }
  477:         }
  478:  
  479:         ////////////////////////////////////////////////////////////////////////////
  480:  
  481:         /// <summary>
  482:         ///
  483:         /// </summary>
  484:         public static void StatisticListForTelegramBotApiAndMailSimpleText(string opcode, string inputType, string horizontalRule, out StringBuilder contentStringBuilder)
  485:         {
  486:             StringBuilder stringBuilder;
  487:             DateTime now;
  488:             List<Ia.Ftn.Cl.Model.Business.Administration.Statistic.KuwaitArea> statisticList;
  489:  
  490:             stringBuilder = new StringBuilder();
  491:             now = DateTime.UtcNow.AddHours(3);
  492:  
  493:             //stringBuilder.AppendLine("Fixed Telecommunications Network's Operations Support System (FTN OSS) Find Result: " + now.ToString("yyyy-MM-dd HH:mm"));
  494:  
  495:             //stringBuilder.AppendLine(@"Opcode: """ + opcode + @""".");
  496:             //responseContent += @"Operand: """ + operand + @"""." + "\r\n";
  497:             //stringBuilder.AppendLine();
  498:  
  499:             if (opcode.Contains("statistics"))
  500:             {
  501:                 statisticList = Ia.Ftn.Cl.Model.Data.Administration.ServiceAccessStatisticWithinKuwaitFtnAreaCachedDaily;
  502:  
  503:                 if (statisticList != null && statisticList.Count > 0)
  504:                 {
  505:                     stringBuilder.AppendLine(horizontalRule);
  506:                     stringBuilder.AppendLine("Statistics:");
  507:                     stringBuilder.AppendLine();
  508:                     foreach (var s in statisticList) stringBuilder.AppendLine(s.ToSimpleTextString());
  509:                     stringBuilder.AppendLine(horizontalRule);
  510:                     stringBuilder.AppendLine();
  511:                 }
  512:                 else
  513:                 {
  514:                     stringBuilder.AppendLine(horizontalRule);
  515:                     stringBuilder.AppendLine();
  516:                 }
  517:             }
  518:             else
  519:             {
  520:                 stringBuilder.AppendLine(horizontalRule);
  521:                 stringBuilder.AppendLine("Error: opcode: [" + opcode + "] is unrecognized. ");
  522:                 stringBuilder.AppendLine(horizontalRule);
  523:                 stringBuilder.AppendLine();
  524:             }
  525:  
  526:             contentStringBuilder = stringBuilder.Replace(Environment.NewLine + horizontalRule, horizontalRule);
  527:         }
  528:  
  529:         ////////////////////////////////////////////////////////////////////////////
  530:         ////////////////////////////////////////////////////////////////////////////    
  531:     }
  532:  
  533:     ////////////////////////////////////////////////////////////////////////////
  534:     ////////////////////////////////////////////////////////////////////////////   
  535: }