10 #include <QCoreApplication>
26 m_rbuf(new unsigned char[sizeof(
ccsubtitle)+255])
29 for (
uint i = 0; i < 128; i++)
58 auto then = SystemClock::now() - seconds;
59 for (
uint i = 0; i < 4; i++)
63 static const std::array<const int,16>
rowdata =
65 11, -1, 1, 2, 3, 4, 12, 13,
66 14, 15, 5, 6, 7, 8, 9, 10
71 QLatin1Char(0xAE), QLatin1Char(0xB0), QLatin1Char(0xBD), QLatin1Char(0xBF),
72 QChar(0x2122), QLatin1Char(0xA2), QLatin1Char(0xA3), QChar(0x266A),
73 QLatin1Char(0xE0), QLatin1Char(
' '), QLatin1Char(0xE8), QLatin1Char(0xE2),
74 QLatin1Char(0xEA), QLatin1Char(0xEE), QLatin1Char(0xF4), QLatin1Char(0xFB)
79 QLatin1Char(0xC1), QLatin1Char(0xC9), QLatin1Char(0xD3), QLatin1Char(0xDA),
80 QLatin1Char(0xDC), QLatin1Char(0xFC), QLatin1Char(
'`'), QLatin1Char(0xA1),
81 QLatin1Char(
'*'), QLatin1Char(
'\''), QChar(0x2014), QLatin1Char(0xA9),
82 QChar(0x2120), QLatin1Char(0xB7), QChar(0x201C), QChar(0x201D),
83 QLatin1Char(0xC0), QLatin1Char(0xC2), QLatin1Char(0xC7), QLatin1Char(0xC8),
84 QLatin1Char(0xCA), QLatin1Char(0xCB), QLatin1Char(0xEB), QLatin1Char(0xCE),
85 QLatin1Char(0xCF), QLatin1Char(0xEF), QLatin1Char(0xD4), QLatin1Char(0xD9),
86 QLatin1Char(0xF9), QLatin1Char(0xDB), QLatin1Char(0xAB), QLatin1Char(0xBB)
91 QLatin1Char(0xC3), QLatin1Char(0xE3), QLatin1Char(0xCD), QLatin1Char(0xCC),
92 QLatin1Char(0xEC), QLatin1Char(0xD2), QLatin1Char(0xF2), QLatin1Char(0xD5),
93 QLatin1Char(0xF5), QLatin1Char(
'{'), QLatin1Char(
'}'), QLatin1Char(
'\\'),
94 QLatin1Char(
'^'), QLatin1Char(
'_'), QLatin1Char(0xA6), QLatin1Char(
'~'),
95 QLatin1Char(0xC4), QLatin1Char(0xE4), QLatin1Char(0xD6), QLatin1Char(0xF6),
96 QLatin1Char(0xDF), QLatin1Char(0xA5), QLatin1Char(0xA4), QLatin1Char(
'|'),
97 QLatin1Char(0xC5), QLatin1Char(0xE5), QLatin1Char(0xD8), QLatin1Char(0xF8),
98 QChar(0x250C), QChar(0x2510), QChar(0x2514), QChar(0x2518)
111 for (mode = field*4; mode < (field*4 + 4); mode++)
125 LOG(VB_VBI, LOG_DEBUG,
"Format CC -- Duplicate");
132 int b1 = data & 0x7f;
133 int b2 = (data >> 8) & 0x7f;
135 LOG(VB_VBI, LOG_DEBUG,
136 QString(
"Format CC @%1/%2 = %3 %4, %5/%6 = '%7' '%8'")
137 .arg(tc.count()).arg(field)
138 .arg((data&0xff), 2, 16)
139 .arg((data&0xff00)>>8, 2, 16)
140 .arg(b1, 2, 16, QChar(
'0'))
141 .arg(b2, 2, 16, QChar(
'0'))
142 .arg(QChar((b1 & 0x60) ? b1 :
'_'))
143 .arg(QChar((b2 & 0x60) ? b2 :
'_')));
150 if (mode != std::numeric_limits<std::size_t>::max())
157 mode = std::numeric_limits<std::size_t>::max();
175 if (mode != std::numeric_limits<std::size_t>::max())
195 else if ((b1 & 0x10) && (b2 > 0x1F))
201 int newccmode = (b1 >> 3) & 1;
202 int newtxtmode =
m_txtMode[(field*2) + newccmode];
203 if ((b1 & 0x06) == 0x04)
225 m_txtMode[(field*2) + newccmode] = newtxtmode;
226 mode = (field << 2) | (newtxtmode << 1) |
m_ccMode[field];
248 LOG(VB_VBI, LOG_INFO,
249 QString(
"cc608 preamble indent, b2=%1")
258 LOG(VB_VBI, LOG_INFO,
259 QString(
"cc608 preamble color change, b2=%1")
272 LOG(VB_VBI, LOG_DEBUG,
273 QString(
"<ATTRIBUTE %1 %2>").arg(b1).arg(b2));
283 LOG(VB_VBI, LOG_INFO,
284 QString(
"cc608 mid-row color change, b2=%1")
289 m_ccBuf[mode] += QChar(0x7000 + (b2 & 0xf));
306 m_ccBuf[mode].remove(len - 1, 1);
319 m_ccBuf[mode].remove(len - 1, 1);
327 LOG(VB_VBI, LOG_DEBUG,
328 QString(
"ccmode %1 cmd %2").arg(
m_ccMode)
329 .arg(b2, 2, 16,
'0'));
339 m_ccBuf[mode].startsWith(
"\b"))
346 m_ccBuf[mode].remove(len - 1, 1);
379 (!newtxtmode ||
m_row[mode] >= 16)))
386 if (
m_row[mode] < 16)
420 if (
m_row[mode] == 0)
511 for (
int x = 0; x < (b2 & 0x03); x++)
523 for (mode = field*4; mode < (field*4 + 4); mode++)
549 int b1 = data & 0x7f;
550 int b2 = (data >> 8) & 0x7f;
558 ((b1 & 0x70) == 0x10))
570 std::chrono::milliseconds dup_text_fudge = 0ms;
571 std::chrono::milliseconds dup_ctrl_fudge = 0ms;
572 if (
m_badVbi[field] < 100 && b1 != 0 && b2 != 0)
574 std::chrono::milliseconds
d = tc -
m_lastTc[field];
575 if (d < 25ms || d > 42ms)
583 dup_text_fudge = -2ms;
585 dup_ctrl_fudge = 33ms - 4ms;
589 dup_text_fudge = 4ms;
590 dup_ctrl_fudge = 33ms - 4ms;
595 if ((b1 & 0x70) == 0x10)
633 for (
const auto& cp : std::as_const(cc608str))
635 int cpu = cp.unicode();
640 case 0x2120 : ret +=
"(SM)";
break;
641 case 0x2122 : ret +=
"(TM)";
break;
642 case 0x2014 : ret +=
"(--)";
break;
643 case 0x201C : ret +=
"``";
break;
644 case 0x201D : ret +=
"''";
break;
645 case 0x250C : ret +=
"|-";
break;
646 case 0x2510 : ret +=
"-|";
break;
647 case 0x2514 : ret +=
"|_";
break;
648 case 0x2518 : ret +=
"_|";
break;
649 case 0x2588 : ret +=
"[]";
break;
650 case 0x266A : ret +=
"o/~";
break;
651 case '\b' : ret +=
"\\b";
break;
653 if (cpu >= 0x7000 && cpu < 0x7000 + 0x30)
655 if (!suppress_unknown)
656 ret += QString(
"[%1]").arg(cpu, 2, 16);
658 else if (cpu <= 0x80)
660 ret += QString(cp.toLatin1());
662 else if (!suppress_unknown)
664 ret += QString(
"{%1}").arg(cpu, 2, 16);
678 tmpbuf =
m_ccBuf[mode].toUtf8();
679 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
680 len = std::min(tmpbuf.length(), 255);
682 len = std::min(tmpbuf.length(), 255LL);
686 unsigned char *bp =
m_rbuf;
687 *(bp++) =
m_row[mode];
712 LOG(VB_VBI, LOG_INFO, QString(
"### %1 %2 %3 %4 %5 %6 %7 - '%8'")
715 .arg(
m_style[mode]).arg(f, 2, 16)
716 .arg(clr).arg(len, 3)
717 .arg(
ToASCII(QString::fromUtf8(tmpbuf.constData(), len),
false)));
725 case CC_CC1: stream = 0;
break;
726 case CC_CC2: stream = 1;
break;
727 case CC_CC3: stream = 2;
break;
728 case CC_CC4: stream = 3;
break;
731 m_lastSeen[stream] = std::chrono::system_clock::now();
759 if (
m_row[mode] == 0)
769 if (
m_row[mode] == 0)
822 for (
int x = 0; x < limit; x++)
844 return ((c) & 0x7F) >= 0x20 && ((c) & 0x7F) <= 0x7E;
853 static int OddParity(
unsigned char c)
855 c ^= (c >> 4); c ^= (c >> 2); c ^= (c >> 1);
864 static constexpr
int PIL_TIME(
int day,
int mon,
int hour,
int min)
865 {
return (day << 15) + (mon << 11) + (hour << 6) + min; }
869 int day = (pil >> 15);
870 int mon = (pil >> 11) & 0xF;
871 int hour = (pil >> 6 ) & 0x1F;
872 int min = (pil ) & 0x3F;
875 LOG(VB_VBI, LOG_INFO,
" PDC: Timer-control (no PDC)");
876 else if (pil ==
PIL_TIME(0, 15, 30, 63))
877 LOG(VB_VBI, LOG_INFO,
" PDC: Recording inhibit/terminate");
878 else if (pil ==
PIL_TIME(0, 15, 29, 63))
879 LOG(VB_VBI, LOG_INFO,
" PDC: Interruption");
880 else if (pil ==
PIL_TIME(0, 15, 28, 63))
881 LOG(VB_VBI, LOG_INFO,
" PDC: Continue");
882 else if (pil ==
PIL_TIME(31, 15, 31, 63))
883 LOG(VB_VBI, LOG_INFO,
" PDC: No time");
885 LOG(VB_VBI, LOG_INFO, QString(
" PDC: %1, 200X-%2-%3 %4:%5")
886 .arg(pil).arg(mon).arg(day).arg(hour).arg(min));
904 LOG(VB_VBI, LOG_INFO, QString(
"VPS: 3-10: %1 %2 %3 %4 %5 %6 %7 %8 (\"%9\")")
905 .arg(buf[0]).arg(buf[1]).arg(buf[2]).arg(buf[3]).arg(buf[4])
906 .arg(buf[5]).arg(buf[6]).arg(buf[7]).arg(
m_vpsPrLabel.data()));
908 int pcs = buf[2] >> 6;
909 int cni = + ((buf[10] & 3) << 10)
910 + ((buf[11] & 0xC0) << 2)
911 + ((buf[8] & 0xC0) << 0)
913 int pil = ((buf[8] & 0x3F) << 14) + (buf[9] << 6) + (buf[10] >> 2);
916 LOG(VB_VBI, LOG_INFO, QString(
"CNI: %1 PCS: %2 PTY: %3 ")
917 .arg(cni).arg(pcs).arg(pty));
930 static const std::array<const int,8> kWssBits { 0, 0, 0, 1, 0, 1, 1, 1 };
933 for (
uint i = 0; i < 16; i++)
935 uint b1 = kWssBits[buf[i] & 7];
936 uint b2 = kWssBits[(buf[i] >> 3) & 7];
942 unsigned char parity = wss & 0xf;
943 parity ^= parity >> 2;
944 parity ^= parity >> 1;
946 LOG(VB_VBI, LOG_INFO,
947 QString(
"WSS: %1; %2 mode; %3 color coding;\n\t\t\t"
948 " %4 helper; reserved b7=%5; %6\n\t\t\t"
949 " open subtitles: %7; %scopyright %8; copying %9")
950 .arg(QString::fromStdString(
formats[wss & 7]),
951 (wss & 0x0010) ?
"film" :
"camera",
952 (wss & 0x0020) ?
"MA/CP" :
"standard",
953 (wss & 0x0040) ?
"modulated" :
"no",
954 (wss & 0x0080) ?
"1" :
"0",
955 (wss & 0x0100) ?
"have TTX subtitles; " :
"",
956 QString::fromStdString(
subtitles[(wss >> 9) & 3]),
957 (wss & 0x0800) ?
"surround sound; " :
"",
958 (wss & 0x1000) ?
"asserted" :
"unknown")
960 .arg((wss & 0x2000) ?
"restricted" :
"not restricted"));
973 for (
uint i = start; (i < buf.size()) && (i < end); i++)
975 LOG(VB_VBI, LOG_INFO, QString(
"%1: 0x%2 -> 0x%3 %4")
977 .arg(buf[i],2,16,QChar(
'0'))
984 for (
uint i = start; (i < buf.size()) && (i < end); i++)
991 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecodeString: '%1'").arg(
tmp));
994 return tmp.trimmed();
997 static bool is_better(
const QString &newStr,
const QString &oldStr)
999 if (!newStr.isEmpty() && newStr != oldStr &&
1000 (newStr != oldStr.left(newStr.length())))
1002 if (oldStr.isEmpty())
1006 return std::all_of(newStr.cbegin(), newStr.cend(),
1007 [](
auto ch){ return ch.toLatin1() >= 0x20; } );
1028 const std::array<const QString,4>
prefix {
"MPAA-",
"TV-",
"CE-",
"CF-" };
1029 const std::array<const std::array<const QString,8>,4> mainStr
1031 {
"NR",
"G",
"PG",
"PG-13",
"R",
"NC-17",
"X",
"NR" },
1032 {
"NR",
"Y",
"Y7",
"G",
"PG",
"14",
"MA",
"NR" },
1033 {
"E",
"C",
"C8+",
"G",
"PG",
"14+",
"18+",
"NR" },
1034 {
"E",
"G",
"8+",
"13+",
"16+",
"18+",
"NR",
"NR" },
1041 uint cf = (future) ? 1 : 0;
1069 const std::vector<uint> &program_type =
m_xdsProgramType[(future) ? 1 : 0];
1072 for (
size_t i = 0; i < program_type.size(); i++)
1086 if (key ==
"ratings")
1088 if (key.startsWith(
"has_rating_"))
1090 if (key.startsWith(
"rating_"))
1093 if (key ==
"future_ratings")
1095 if (key.startsWith(
"has_future_rating_"))
1097 if (key.startsWith(
"future_rating_"))
1100 if (key ==
"programname")
1102 if (key ==
"future_programname")
1105 if (key ==
"programtype")
1107 if (key ==
"future_programtype")
1110 if (key ==
"callsign")
1112 if (key ==
"channame")
1138 LOG(VB_VBI, LOG_INFO,
1139 QString(
"XDSDecode: 0x%1 0x%2 '%3%4' xds[%5]=%6 in XDS %7")
1140 .arg(b1,2,16,QChar(
'0')).arg(b2,2,16,QChar(
'0'))
1143 .arg(field).arg(
m_xds[field])
1165 else if ((0
x0 < b1) && (b1 < 0x0f))
1189 else if ((0x10 <= b1) && (b1 <= 0x1f))
1192 LOG(VB_VBI, LOG_INFO, QString(
"XDSDecode: Suspending XDS %1 on 0x%2")
1205 bool handled =
false;
1206 int xds_class = xds_buf[0];
1211 if ((xds_class == 0x01) || (xds_class == 0x03))
1213 else if (xds_class == 0x05)
1215 else if ((xds_class == 0x07) ||
1216 (xds_class == 0x09) ||
1217 (xds_class == 0x0b))
1219 else if (xds_class == 0x0d)
1225 LOG(VB_VBI, LOG_INFO, QString(
"XDS: ") +
1226 QString(
"Unhandled packet (0x%1 0x%2) sz(%3) '%4'")
1227 .arg(xds_buf[0],0,16).arg(xds_buf[1],0,16)
1228 .arg(xds_buf.size())
1238 for (
size_t i = 0; i < xds_buf.size() - 1; i++)
1241 if ((((~sum) & 0x7f) + 1) != xds_buf[xds_buf.size() - 1])
1245 LOG(VB_VBI, LOG_ERR, QString(
"XDS: failed CRC %1 of %2")
1256 const std::vector<unsigned char> &xds_buf,
bool future)
1258 bool handled =
true;
1259 int b2 = xds_buf[1];
1260 int cf = (future) ? 1 : 0;
1261 QString loc = (future) ?
"XDS: Future " :
"XDS: Current ";
1263 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1265 uint min = xds_buf[2] & 0x3f;
1266 uint hour = xds_buf[3] & 0x0f;
1267 uint day = xds_buf[4] & 0x1f;
1268 uint month = xds_buf[5] & 0x0f;
1269 month = (month < 1 || month > 12) ? 0 : month;
1271 LOG(VB_VBI, LOG_INFO, loc +
1272 QString(
"Start Time %1/%2 %3:%4%5")
1273 .arg(month).arg(day).arg(hour).arg(min / 10).arg(min % 10));
1275 else if ((b2 == 0x02) && (xds_buf.size() >= 4))
1277 uint length_min = xds_buf[2] & 0x3f;
1278 uint length_hour = xds_buf[3] & 0x3f;
1279 uint length_elapsed_min = 0;
1280 uint length_elapsed_hour = 0;
1281 uint length_elapsed_secs = 0;
1282 if (xds_buf.size() > 6)
1284 length_elapsed_min = xds_buf[4] & 0x3f;
1285 length_elapsed_hour = xds_buf[5] & 0x3f;
1287 if (xds_buf.size() > 8 && xds_buf[7] == 0x40)
1288 length_elapsed_secs = xds_buf[6] & 0x3f;
1290 QString msg = QString(
"Program Length %1:%2%3 "
1291 "Time in Show %4:%5%6.%7%8")
1292 .arg(length_hour).arg(length_min / 10).arg(length_min % 10)
1293 .arg(length_elapsed_hour)
1294 .arg(length_elapsed_min / 10).arg(length_elapsed_min % 10)
1295 .arg(length_elapsed_secs / 10).arg(length_elapsed_secs % 10);
1297 LOG(VB_VBI, LOG_INFO, loc + msg);
1299 else if ((b2 == 0x03) && (xds_buf.size() >= 6))
1305 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Name: '%1'")
1309 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1311 std::vector<uint> program_type;
1312 for (
size_t i = 2; i < xds_buf.size() - 2; i++)
1314 int cur = xds_buf[i] - 0x20;
1315 if (cur >= 0 && cur < 96)
1316 program_type.push_back(cur);
1320 for (
uint i = 0; (i < program_type.size()) && unchanged; i++)
1326 LOG(VB_VBI, LOG_INFO, loc + QString(
"Program Type '%1'")
1330 else if ((b2 == 0x05) && (xds_buf.size() >= 4))
1332 uint movie_rating = xds_buf[2] & 0x7;
1333 uint rating_system = (xds_buf[2] >> 3) & 0x7;
1334 uint tv_rating = xds_buf[3] & 0x7;
1335 uint VSL = xds_buf[3] & (0x7 << 3);
1336 uint sel = VSL | rating_system;
1344 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1355 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1359 else if (sel == 0x13 || sel == 0x1f)
1363 else if ((rating_system & 0
x3) == 1)
1368 uint f = ((xds_buf[0]<<3) & 0x80) | ((xds_buf[1]<<1) & 0x70);
1371 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1375 else if (rating_system == 0)
1382 LOG(VB_VBI, LOG_INFO, loc + QString(
"VChip %1")
1388 LOG(VB_VBI, LOG_ERR, loc +
1389 QString(
"VChip Unhandled -- rs(%1) rating(%2:%3)")
1390 .arg(rating_system).arg(tv_rating).arg(movie_rating));
1394 else if (b2 == 0x07)
1396 else if (b2 == 0x08)
1398 else if (b2 == 0x09)
1400 else if (b2 == 0x0c)
1402 else if (b2 == 0x10 || b2 == 0x13 || b2 == 0x15 || b2 == 0x16 ||
1403 b2 == 0x91 || b2 == 0x92 || b2 == 0x94 || b2 == 0x97)
1405 else if (b2 == 0x86)
1407 else if (b2 == 0x89)
1409 else if (b2 == 0x8c)
1422 bool handled =
true;
1424 int b2 = xds_buf[1];
1425 if ((b2 == 0x01) && (xds_buf.size() >= 6))
1430 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Name '%1'").arg(
tmp));
1434 else if ((b2 == 0x02) && (xds_buf.size() >= 6))
1439 LOG(VB_VBI, LOG_INFO, QString(
"XDS: Network Call '%1'").arg(
tmp));
1443 else if ((b2 == 0x04) && (xds_buf.size() >= 6))
1445 uint tsid = (xds_buf[2] << 24 | xds_buf[3] << 16 |
1446 xds_buf[4] << 8 | xds_buf[5]);
1449 LOG(VB_VBI, LOG_INFO, QString(
"XDS: TSID 0x%1").arg(tsid,0,16));
1463 xds_program_type[0] = QCoreApplication::translate(
"(Categories)",
1465 xds_program_type[1] = QCoreApplication::translate(
"(Categories)",
1467 xds_program_type[2] = QCoreApplication::translate(
"(Categories)",
1469 xds_program_type[3] = QCoreApplication::translate(
"(Categories)",
1471 xds_program_type[4] = QCoreApplication::translate(
"(Categories)",
1473 xds_program_type[5] = QCoreApplication::translate(
"(Categories)",
1475 xds_program_type[6] = QCoreApplication::translate(
"(Categories)",
1477 xds_program_type[7] = QCoreApplication::translate(
"(Categories)",
1479 xds_program_type[8] = QCoreApplication::translate(
"(Categories)",
1481 xds_program_type[9] = QCoreApplication::translate(
"(Categories)",
1483 xds_program_type[10] = QCoreApplication::translate(
"(Categories)",
1485 xds_program_type[11] = QCoreApplication::translate(
"(Categories)",
1487 xds_program_type[12] = QCoreApplication::translate(
"(Categories)",
1489 xds_program_type[13] = QCoreApplication::translate(
"(Categories)",
1491 xds_program_type[14] = QCoreApplication::translate(
"(Categories)",
1493 xds_program_type[15] = QCoreApplication::translate(
"(Categories)",
1495 xds_program_type[16] = QCoreApplication::translate(
"(Categories)",
1497 xds_program_type[17] = QCoreApplication::translate(
"(Categories)",
1499 xds_program_type[18] = QCoreApplication::translate(
"(Categories)",
1501 xds_program_type[19] = QCoreApplication::translate(
"(Categories)",
1503 xds_program_type[20] = QCoreApplication::translate(
"(Categories)",
1505 xds_program_type[21] = QCoreApplication::translate(
"(Categories)",
1507 xds_program_type[22] = QCoreApplication::translate(
"(Categories)",
1509 xds_program_type[23] = QCoreApplication::translate(
"(Categories)",
1511 xds_program_type[24] = QCoreApplication::translate(
"(Categories)",
1513 xds_program_type[25] = QCoreApplication::translate(
"(Categories)",
1515 xds_program_type[26] = QCoreApplication::translate(
"(Categories)",
1517 xds_program_type[27] = QCoreApplication::translate(
"(Categories)",
1519 xds_program_type[28] = QCoreApplication::translate(
"(Categories)",
1521 xds_program_type[29] = QCoreApplication::translate(
"(Categories)",
1523 xds_program_type[30] = QCoreApplication::translate(
"(Categories)",
1525 xds_program_type[31] = QCoreApplication::translate(
"(Categories)",
1527 xds_program_type[32] = QCoreApplication::translate(
"(Categories)",
1529 xds_program_type[33] = QCoreApplication::translate(
"(Categories)",
1531 xds_program_type[34] = QCoreApplication::translate(
"(Categories)",
1533 xds_program_type[35] = QCoreApplication::translate(
"(Categories)",
1535 xds_program_type[36] = QCoreApplication::translate(
"(Categories)",
1537 xds_program_type[37] = QCoreApplication::translate(
"(Categories)",
1539 xds_program_type[38] = QCoreApplication::translate(
"(Categories)",
1541 xds_program_type[39] = QCoreApplication::translate(
"(Categories)",
1543 xds_program_type[40] = QCoreApplication::translate(
"(Categories)",
1545 xds_program_type[41] = QCoreApplication::translate(
"(Categories)",
1547 xds_program_type[42] = QCoreApplication::translate(
"(Categories)",
1549 xds_program_type[43] = QCoreApplication::translate(
"(Categories)",
1551 xds_program_type[44] = QCoreApplication::translate(
"(Categories)",
1553 xds_program_type[45] = QCoreApplication::translate(
"(Categories)",
1555 xds_program_type[46] = QCoreApplication::translate(
"(Categories)",
1557 xds_program_type[47] = QCoreApplication::translate(
"(Categories)",
1559 xds_program_type[48] = QCoreApplication::translate(
"(Categories)",
1561 xds_program_type[49] = QCoreApplication::translate(
"(Categories)",
1563 xds_program_type[50] = QCoreApplication::translate(
"(Categories)",
1565 xds_program_type[51] = QCoreApplication::translate(
"(Categories)",
1567 xds_program_type[52] = QCoreApplication::translate(
"(Categories)",
1569 xds_program_type[53] = QCoreApplication::translate(
"(Categories)",
1571 xds_program_type[54] = QCoreApplication::translate(
"(Categories)",
1573 xds_program_type[55] = QCoreApplication::translate(
"(Categories)",
1575 xds_program_type[56] = QCoreApplication::translate(
"(Categories)",
1577 xds_program_type[57] = QCoreApplication::translate(
"(Categories)",
1579 xds_program_type[58] = QCoreApplication::translate(
"(Categories)",
1581 xds_program_type[59] = QCoreApplication::translate(
"(Categories)",
1583 xds_program_type[60] = QCoreApplication::translate(
"(Categories)",
1585 xds_program_type[61] = QCoreApplication::translate(
"(Categories)",
1587 xds_program_type[62] = QCoreApplication::translate(
"(Categories)",
1589 xds_program_type[63] = QCoreApplication::translate(
"(Categories)",
1591 xds_program_type[64] = QCoreApplication::translate(
"(Categories)",
1593 xds_program_type[65] = QCoreApplication::translate(
"(Categories)",
1595 xds_program_type[66] = QCoreApplication::translate(
"(Categories)",
1597 xds_program_type[67] = QCoreApplication::translate(
"(Categories)",
1599 xds_program_type[68] = QCoreApplication::translate(
"(Categories)",
1601 xds_program_type[69] = QCoreApplication::translate(
"(Categories)",
1603 xds_program_type[70] = QCoreApplication::translate(
"(Categories)",
1605 xds_program_type[71] = QCoreApplication::translate(
"(Categories)",
1607 xds_program_type[72] = QCoreApplication::translate(
"(Categories)",
1609 xds_program_type[73] = QCoreApplication::translate(
"(Categories)",
1611 xds_program_type[74] = QCoreApplication::translate(
"(Categories)",
1613 xds_program_type[75] = QCoreApplication::translate(
"(Categories)",
1615 xds_program_type[76] = QCoreApplication::translate(
"(Categories)",
1617 xds_program_type[77] = QCoreApplication::translate(
"(Categories)",
1619 xds_program_type[78] = QCoreApplication::translate(
"(Categories)",
1621 xds_program_type[79] = QCoreApplication::translate(
"(Categories)",
1623 xds_program_type[80] = QCoreApplication::translate(
"(Categories)",
1625 xds_program_type[81] = QCoreApplication::translate(
"(Categories)",
1627 xds_program_type[82] = QCoreApplication::translate(
"(Categories)",
1629 xds_program_type[83] = QCoreApplication::translate(
"(Categories)",
1631 xds_program_type[84] = QCoreApplication::translate(
"(Categories)",
1633 xds_program_type[85] = QCoreApplication::translate(
"(Categories)",
1635 xds_program_type[86] = QCoreApplication::translate(
"(Categories)",
1637 xds_program_type[87] = QCoreApplication::translate(
"(Categories)",
1639 xds_program_type[88] = QCoreApplication::translate(
"(Categories)",
1641 xds_program_type[89] = QCoreApplication::translate(
"(Categories)",
1643 xds_program_type[90] = QCoreApplication::translate(
"(Categories)",
1645 xds_program_type[91] = QCoreApplication::translate(
"(Categories)",
1647 xds_program_type[92] = QCoreApplication::translate(
"(Categories)",
1649 xds_program_type[93] = QCoreApplication::translate(
"(Categories)",
1651 xds_program_type[94] = QCoreApplication::translate(
"(Categories)",
1653 xds_program_type[95] = QCoreApplication::translate(
"(Categories)",