Compare commits

..

No commits in common. "master" and "origin/master" have entirely different histories.

513 changed files with 10986 additions and 44009 deletions

10
.gitignore vendored
View File

@ -130,13 +130,3 @@ imgui.ini
/skyscraper8.Manual/skyscraper8.Manual.pdf /skyscraper8.Manual/skyscraper8.Manual.pdf
/skyscraper8.Manual/skyscraper8.Manual.synctex.gz /skyscraper8.Manual/skyscraper8.Manual.synctex.gz
/.vs/skyscraper8/CopilotIndices/17.14.1231.31060 /.vs/skyscraper8/CopilotIndices/17.14.1231.31060
/.vs/skyscraper8/CopilotIndices/17.14.1290.42047
/Documentation/TSDuck-Samples/experiment2/*.ts
/.vs/skyscraper8/CopilotIndices/17.14.1431.25910
/.vs
/skyscraper8/bin/Debug/satip
/skyscraper8.Tests.NUnit/bin/Debug/net8.0
/skyscraper8.Tests.NUnit/obj/Debug/net8.0
/skyscraper8.Tests.NUnit/obj
.idea/.idea.skyscraper8/.idea
/skyscraper8/bin/Release/net8.0/linux-x64

View File

@ -515,32 +515,5 @@ namespace skyscraper5.Data
byte[] bytes = GetObject(filename); byte[] bytes = GetObject(filename);
return bytes; return bytes;
} }
public bool TestForSisDsaci(int value1, int value2, ushort groupId, int versionNumber)
{
string filename = String.Format("DVB-SIS/{0}/{1}/Group{2}_Version{3}.xml");
return FileExists(filename);
}
public void StoreSisDsaci(int value1, int value2, ushort currentDsaGroupId, int versionNumber, Stream dsaci)
{
string filename = String.Format("DVB-SIS/{0}/{1}/Group{2}_Version{3}.xml");
WriteObject(filename, dsaci);
}
public bool TestForObjectCarouselFileArrival(string vfsFile, int transportStreamId, int pid, int networkId)
{
throw new NotImplementedException();
}
public byte[] GetObjectCarouselFileArrival(string vfsFile, int transportStreamId, int pid, int networkId)
{
throw new NotImplementedException();
}
public byte[] DvbNipGetFile(string path)
{
throw new NotImplementedException();
}
} }
} }

View File

@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Minio" Version="6.0.4" /> <PackageReference Include="Minio" Version="6.0.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -18,13 +18,9 @@ using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities; using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using skyscraper5.src.InteractionChannel.Model.Descriptors; using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.InteractionChannel.Model; using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model2;
using skyscraper5.src.Skyscraper.FrequencyListGenerator; using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.src.Skyscraper.Scraper.Dns; using skyscraper5.src.Skyscraper.Scraper.Dns;
using skyscraper5.Teletext; using skyscraper5.Teletext;
using skyscraper8.InteractionChannel.Model;
using skyscraper8.InteractionChannel.Model2;
using skyscraper8.InteractionChannel.Model2.Descriptors;
using skyscraper8.Skyscraper.Scraper.Storage; using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper5.Data.MySql namespace skyscraper5.Data.MySql
@ -107,12 +103,12 @@ namespace skyscraper5.Data.MySql
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void UiSatellitesAdd(SatellitePositionEntity newPosition) public void UiSatellitesAdd(SatellitePosition newPosition)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void UiSatellitesDelete(SatellitePositionEntity satellitePosition) public void UiSatellitesDelete(SatellitePosition satellitePosition)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -233,22 +229,22 @@ namespace skyscraper5.Data.MySql
throw new NotImplementedException(); throw new NotImplementedException();
} }
public List<LnbEntity> UiLnbTypesListAll() public List<LnbType> UiLnbTypesListAll()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void UiLnbTypesAdd(LnbEntity defaultLnbType) public void UiLnbTypesAdd(LnbType defaultLnbType)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public List<DishEntity> UiDishTypesListAll() public List<DishType> UiDishTypesListAll()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void UiDishTypesAdd(DishEntity defaultDishType) public void UiDishTypesAdd(DishType defaultDishType)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -263,152 +259,6 @@ namespace skyscraper5.Data.MySql
throw new NotImplementedException(); throw new NotImplementedException();
} }
public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
{
throw new NotImplementedException();
}
public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
{
throw new NotImplementedException();
}
public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
{
throw new NotImplementedException();
}
public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
{
throw new NotImplementedException();
}
public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
{
throw new NotImplementedException();
}
public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
{
throw new NotImplementedException();
}
public bool TestForRcs2Nit(RcsNit nit)
{
throw new NotImplementedException();
}
public void InsertRcs2Nit(RcsNit nit)
{
throw new NotImplementedException();
}
public bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp)
{
throw new NotImplementedException();
}
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
{
throw new NotImplementedException();
}
public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
{
throw new NotImplementedException();
}
public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress,
_0xb1_CorrectionMessageExtensionDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimControlAssignment(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForLowerLayerService(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
{
throw new NotImplementedException();
}
public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
{
throw new NotImplementedException();
}
public bool TestForTimLogonResponse(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
{
throw new NotImplementedException();
}
public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
{
throw new NotImplementedException();
}
public bool TestForRmt(Rmt rmt)
{
return true;
}
public void InsertRmt(Rmt rmt)
{
throw new NotImplementedException();
}
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt() public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -50,9 +50,9 @@ namespace skyscraper5.Data.MySql
} }
public List<SatellitePositionEntity> UiSatellitesListAll() public List<SatellitePosition> UiSatellitesListAll()
{ {
List<SatellitePositionEntity> result = new List<SatellitePositionEntity>(); List<SatellitePosition> result = new List<SatellitePosition>();
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{ {
connection.Open(); connection.Open();
@ -62,9 +62,9 @@ namespace skyscraper5.Data.MySql
MySqlDataReader dataReader = command.ExecuteReader(); MySqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read()) while (dataReader.Read())
{ {
SatellitePositionEntity satellitePosition = new SatellitePositionEntity(); SatellitePosition satellitePosition = new SatellitePosition();
satellitePosition.angle = dataReader.GetFloat(2); satellitePosition.angle = dataReader.GetFloat(2);
//satellitePosition.cardinalDirection = dataReader.GetBoolean(3) ? 0 : 1; satellitePosition.cardinalDirection = dataReader.GetBoolean(3) ? 0 : 1;
satellitePosition.name = dataReader.GetString(4); satellitePosition.name = dataReader.GetString(4);
result.Add(satellitePosition); result.Add(satellitePosition);
} }

View File

@ -328,7 +328,7 @@ namespace skyscraper5.Data.PostgreSql
string note = null; string note = null;
if (!dataReader.IsDBNull(15)) if (!dataReader.IsDBNull(15))
note = dataReader.GetString(15); note = dataReader.GetString(15);
result = new DbBlindscanJob(uuid, tuner_mac, (STD_TYPE)tuner_std, diseqc_index, new DummyGpsReceiver(true,(float)gps_lat,(float)gps_lon), SatellitePositionEntity.FromChecksum(sat_position)); result = new DbBlindscanJob(uuid, tuner_mac, (STD_TYPE)tuner_std, diseqc_index, new DummyGpsReceiver(true,(float)gps_lat,(float)gps_lon), SatellitePosition.FromChecksum(sat_position));
result.DateAdded = date_added; result.DateAdded = date_added;
result.HorizontalHighState = (DbBlindscanJobPolarizationStatus)horizontal_high; result.HorizontalHighState = (DbBlindscanJobPolarizationStatus)horizontal_high;
result.HorizontalLowState = (DbBlindscanJobPolarizationStatus)horizontal_low; result.HorizontalLowState = (DbBlindscanJobPolarizationStatus)horizontal_low;
@ -546,11 +546,11 @@ namespace skyscraper5.Data.PostgreSql
dgr = new DummyGpsReceiver(true, gpsLat, gpsLon); dgr = new DummyGpsReceiver(true, gpsLat, gpsLon);
} }
SatellitePositionEntity satPositionObj = null; SatellitePosition satPositionObj = null;
if (!dataReader.IsDBNull("sat_position")) if (!dataReader.IsDBNull("sat_position"))
{ {
int satPosition = dataReader.GetInt32("sat_position"); int satPosition = dataReader.GetInt32("sat_position");
satPositionObj = SatellitePositionEntity.FromChecksum(satPosition); satPositionObj = SatellitePosition.FromChecksum(satPosition);
} }
int diseqcIndex = dataReader.GetInt32("diseqc_index"); int diseqcIndex = dataReader.GetInt32("diseqc_index");
int version = dataReader.GetInt32("version"); int version = dataReader.GetInt32("version");

View File

@ -18,7 +18,7 @@ namespace skyscraper5.Data.PostgreSql
if (_knownInts == null) if (_knownInts == null)
_knownInts = new HashSet<DatabaseKeyInt>(); _knownInts = new HashSet<DatabaseKeyInt>();
DatabaseKeyInt key = new DatabaseKeyInt(notification.Platform.PlatformId, notification.Target.GenerateId()); DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
if (_knownInts.Contains(key)) if (_knownInts.Contains(key))
return true; return true;
@ -28,7 +28,7 @@ namespace skyscraper5.Data.PostgreSql
conn.Open(); conn.Open();
NpgsqlCommand cmd = conn.CreateCommand(); NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT dateadded FROM dvb_int WHERE platform_id = @id"; cmd.CommandText = "SELECT dateadded FROM dvb_int WHERE platform_id = @id";
cmd.Parameters.AddWithValue("@id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.Platform.PlatformId); cmd.Parameters.AddWithValue("@id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
NpgsqlDataReader reader = cmd.ExecuteReader(); NpgsqlDataReader reader = cmd.ExecuteReader();
result = reader.Read(); result = reader.Read();
reader.Close(); reader.Close();
@ -43,7 +43,7 @@ namespace skyscraper5.Data.PostgreSql
public void StoreIpMacNotification(IpMacNotification notification) public void StoreIpMacNotification(IpMacNotification notification)
{ {
EnqueueTask(x => WriteIpMacNotification(x, notification)); EnqueueTask(x => WriteIpMacNotification(x, notification));
DatabaseKeyInt key = new DatabaseKeyInt(notification.Platform.PlatformId, notification.Target.GenerateId()); DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
_knownInts.Add(key); _knownInts.Add(key);
} }
@ -53,28 +53,28 @@ namespace skyscraper5.Data.PostgreSql
cmd.CommandText = "insert into dvb_int (platform_id, platform_name, platform_provider_name,\r\n platform_provider_name_language_code, platform_action_type, platform_name_language_code,\r\n platform_processing_order, target_type, target_name, operational_network_id,\r\n operational_mpe_fec_algorithm, operational_component_tag, operational_transport_stream_id,\r\n operational_time_slice_fec_id, operational_time_slicing, operational_onid, operational_sid,\r\n operational_time_slice_frame_size, operational_time_slice_max_average_rate,\r\n operational_time_slice_max_bust_duration) " + cmd.CommandText = "insert into dvb_int (platform_id, platform_name, platform_provider_name,\r\n platform_provider_name_language_code, platform_action_type, platform_name_language_code,\r\n platform_processing_order, target_type, target_name, operational_network_id,\r\n operational_mpe_fec_algorithm, operational_component_tag, operational_transport_stream_id,\r\n operational_time_slice_fec_id, operational_time_slicing, operational_onid, operational_sid,\r\n operational_time_slice_frame_size, operational_time_slice_max_average_rate,\r\n operational_time_slice_max_bust_duration) " +
"values " + "values " +
"(@platform_id,@platform_name,@platform_provider_name,@platform_provider_name_language_code,@platform_action_type,@platform_name_language_code,@platform_processing_order,@target_type,@target_name,@operational_network_id,@operational_mpe_fec_algorithm, @operational_component_tag, @operational_transport_stream_id,\r\n @operational_time_slice_fec_id, @operational_time_slicing, @operational_onid, @operational_sid,\r\n @operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )"; "(@platform_id,@platform_name,@platform_provider_name,@platform_provider_name_language_code,@platform_action_type,@platform_name_language_code,@platform_processing_order,@target_type,@target_name,@operational_network_id,@operational_mpe_fec_algorithm, @operational_component_tag, @operational_transport_stream_id,\r\n @operational_time_slice_fec_id, @operational_time_slicing, @operational_onid, @operational_sid,\r\n @operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
cmd.Parameters.AddWithValue("@platform_id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.Platform.PlatformId); cmd.Parameters.AddWithValue("@platform_id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
cmd.Parameters.AddWithValue("@platform_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Platform.Name); cmd.Parameters.AddWithValue("@platform_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformName);
cmd.Parameters.AddWithValue("@platform_provider_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Platform.ProviderName); cmd.Parameters.AddWithValue("@platform_provider_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformProviderName);
cmd.Parameters.AddWithValue("@platform_provider_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.Platform.ProviderNameLanguageCode); cmd.Parameters.AddWithValue("@platform_provider_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformProviderNameLanguageCode);
cmd.Parameters.AddWithValue("@platform_action_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.Platform.ActionType); cmd.Parameters.AddWithValue("@platform_action_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformActionType);
cmd.Parameters.AddWithValue("@platform_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.Platform.NameLanguageCode); cmd.Parameters.AddWithValue("@platform_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformNameLanguageCode);
cmd.Parameters.AddWithValue("@platform_processing_order", NpgsqlTypes.NpgsqlDbType.Integer, notification.Platform.ProcessingOrder); cmd.Parameters.AddWithValue("@platform_processing_order", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformProcessingOrder);
cmd.Parameters.AddWithValue("@target_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.Target.GenerateId()); cmd.Parameters.AddWithValue("@target_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.TargetType);
cmd.Parameters.AddWithValue("@target_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Target.GenerateName()); cmd.Parameters.AddWithValue("@target_name", NpgsqlTypes.NpgsqlDbType.Text, notification.TargetName);
//@operational_network_id,@operational_mpe_fec_algorithm,@operational_component_tag,@operational_transport_stream_id,@operational_time_slice_fec_id,@operational_time_slicing,@operational_onid,@operational_sid,@operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )"; //@operational_network_id,@operational_mpe_fec_algorithm,@operational_component_tag,@operational_transport_stream_id,@operational_time_slice_fec_id,@operational_time_slicing,@operational_onid,@operational_sid,@operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
cmd.Parameters.AddWithValue("@operational_network_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.NetworkId); cmd.Parameters.AddWithValue("@operational_network_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalNetworkId);
cmd.Parameters.AddWithValue("@operational_mpe_fec_algorithm", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.MpeFecAlgorithm); cmd.Parameters.AddWithValue("@operational_mpe_fec_algorithm", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalMpeFecAlgorithm);
cmd.Parameters.AddWithValue("@operational_component_tag", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.ComponentTag); cmd.Parameters.AddWithValue("@operational_component_tag", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalComponentTag);
cmd.Parameters.AddWithValue("@operational_transport_stream_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TransportStreamId); cmd.Parameters.AddWithValue("@operational_transport_stream_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTransportStreamId);
cmd.Parameters.AddWithValue("@operational_time_slice_fec_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceFecId); cmd.Parameters.AddWithValue("@operational_time_slice_fec_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFecId);
cmd.Parameters.AddWithValue("@operational_time_slicing", NpgsqlTypes.NpgsqlDbType.Boolean, (bool?)notification.Operational.TimeSlicing); cmd.Parameters.AddWithValue("@operational_time_slicing", NpgsqlTypes.NpgsqlDbType.Boolean, (bool?)notification.OperationalTimeSlicing);
cmd.Parameters.AddWithValue("@operational_onid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.OriginalNetworkId); cmd.Parameters.AddWithValue("@operational_onid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalOriginalNetworkId);
cmd.Parameters.AddWithValue("@operational_sid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.ServiceId); cmd.Parameters.AddWithValue("@operational_sid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalServiceId);
//@operational_time_slice_frame_size,@operational_time_slice_max_average_rate,@operational_time_slice_max_bust_duration //@operational_time_slice_frame_size,@operational_time_slice_max_average_rate,@operational_time_slice_max_bust_duration
cmd.Parameters.AddWithValue("@operational_time_slice_frame_size", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceFrameSize); cmd.Parameters.AddWithValue("@operational_time_slice_frame_size", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFrameSize);
cmd.Parameters.AddWithValue("@operational_time_slice_max_average_rate", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceMaxAverageRate); cmd.Parameters.AddWithValue("@operational_time_slice_max_average_rate", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxAverageRate);
cmd.Parameters.AddWithValue("@operational_time_slice_max_bust_duration", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceMaxBurstDuration); cmd.Parameters.AddWithValue("@operational_time_slice_max_bust_duration", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxBurstDuration);
cmd.Parameters.CheckNulls(); cmd.Parameters.CheckNulls();
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
} }

View File

@ -2,17 +2,13 @@
using Npgsql; using Npgsql;
using skyscraper5.src.InteractionChannel.Model; using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model.Descriptors; using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.InteractionChannel.Model2;
using skyscraper5.src.Skyscraper.Scraper.Storage.Utilities; using skyscraper5.src.Skyscraper.Scraper.Storage.Utilities;
using skyscraper8.InteractionChannel.Model2;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Security.Cryptography; using System.Security.Cryptography;
using skyscraper8.InteractionChannel.Model;
using skyscraper8.InteractionChannel.Model2.Descriptors;
namespace skyscraper5.Data.PostgreSql namespace skyscraper5.Data.PostgreSql
{ {
@ -951,112 +947,6 @@ namespace skyscraper5.Data.PostgreSql
return false; return false;
} }
public bool TestForRcs2Nit(RcsNit nit)
{
throw new NotImplementedException();
}
public void InsertRcs2Nit(RcsNit nit)
{
throw new NotImplementedException();
}
public bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp)
{
throw new NotImplementedException();
}
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
{
throw new NotImplementedException();
}
public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
{
throw new NotImplementedException();
}
public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
{
throw new NotImplementedException();
}
public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress,
_0xb1_CorrectionMessageExtensionDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimControlAssignment(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForLowerLayerService(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
{
throw new NotImplementedException();
}
public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
{
throw new NotImplementedException();
}
public bool TestForTimLogonResponse(PhysicalAddress macAddress)
{
throw new NotImplementedException();
}
public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
{
throw new NotImplementedException();
}
public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
{
throw new NotImplementedException();
}
private bool AreArraysEqual(byte[] l, byte[] r) private bool AreArraysEqual(byte[] l, byte[] r)
{ {
if (l.Length != r.Length) if (l.Length != r.Length)
@ -1079,7 +969,5 @@ namespace skyscraper5.Data.PostgreSql
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1); command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1);
command.ExecuteNonQuery(); command.ExecuteNonQuery();
} }
} }
} }

View File

@ -6,10 +6,7 @@ using NpgsqlTypes;
using skyscraper5.Dvb.Psi.Model; using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Dvb.TvAnytime; using skyscraper5.Dvb.TvAnytime;
using skyscraper5.Skyscraper.Headless; using skyscraper5.Skyscraper.Headless;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model2;
using skyscraper8.DvbNip; using skyscraper8.DvbNip;
using skyscraper8.InteractionChannel.Model2;
using skyscraper8.Skyscraper.Scraper.Storage; using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper5.Data.PostgreSql namespace skyscraper5.Data.PostgreSql
@ -227,46 +224,6 @@ namespace skyscraper5.Data.PostgreSql
return result; return result;
} }
} }
public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
{
throw new NotImplementedException();
}
public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
{
throw new NotImplementedException();
}
public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
{
throw new NotImplementedException();
}
public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
{
throw new NotImplementedException();
}
public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
{
throw new NotImplementedException();
}
public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
{
throw new NotImplementedException();
}
public bool TestForRmt(Rmt rmt)
{
return true;
}
public void InsertRmt(Rmt rmt)
{
throw new NotImplementedException();
}
} }
} }

View File

@ -19,9 +19,9 @@ namespace skyscraper5.Data.PostgreSql
this.uiVersion = version; this.uiVersion = version;
} }
public List<LnbEntity> UiLnbTypesListAll() public List<LnbType> UiLnbTypesListAll()
{ {
List<LnbEntity> lnbTypes = new List<LnbEntity>(); List<LnbType> lnbTypes = new List<LnbType>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
conn.Open(); conn.Open();
@ -38,7 +38,7 @@ namespace skyscraper5.Data.PostgreSql
int lofSw = dataReader.GetInt32(5); int lofSw = dataReader.GetInt32(5);
int minFreq = dataReader.GetInt32(6); int minFreq = dataReader.GetInt32(6);
int maxFreq = dataReader.GetInt32(7); int maxFreq = dataReader.GetInt32(7);
lnbTypes.Add(new LnbEntity("", name, lof1, lof2, lofSw, minFreq, maxFreq) { DateAdded = added, Id = id }); lnbTypes.Add(new LnbType(name, lof1, lof2, lofSw, minFreq, maxFreq) { DateAdded = added, Id = id });
} }
dataReader.Close(); dataReader.Close();
@ -49,7 +49,7 @@ namespace skyscraper5.Data.PostgreSql
return lnbTypes; return lnbTypes;
} }
public void UiLnbTypesAdd(LnbEntity defaultLnbType) public void UiLnbTypesAdd(LnbType defaultLnbType)
{ {
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
@ -69,9 +69,9 @@ namespace skyscraper5.Data.PostgreSql
} }
} }
public List<DishEntity> UiDishTypesListAll() public List<DishType> UiDishTypesListAll()
{ {
List<DishEntity> result = new List<DishEntity>(); List<DishType> result = new List<DishType>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
conn.Open(); conn.Open();
@ -85,14 +85,14 @@ namespace skyscraper5.Data.PostgreSql
string name = dataReader.GetString(2); string name = dataReader.GetString(2);
int diameter = dataReader.GetInt32(3); int diameter = dataReader.GetInt32(3);
DishShape shape = (DishShape)dataReader.GetInt32(4); DishShape shape = (DishShape)dataReader.GetInt32(4);
result.Add(new DishEntity("", name, diameter, shape) { DateAdded = added, Id = id }); result.Add(new DishType(name, diameter, shape) { DateAdded = added, Id = id });
} }
} }
return result; return result;
} }
public void UiDishTypesAdd(DishEntity defaultDishType) public void UiDishTypesAdd(DishType defaultDishType)
{ {
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
@ -109,9 +109,9 @@ namespace skyscraper5.Data.PostgreSql
} }
public List<SatellitePositionEntity> UiSatellitesListAll() public List<SatellitePosition> UiSatellitesListAll()
{ {
List<SatellitePositionEntity> positions = new List<SatellitePositionEntity>(); List<SatellitePosition> positions = new List<SatellitePosition>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
conn.Open(); conn.Open();
@ -123,7 +123,7 @@ namespace skyscraper5.Data.PostgreSql
float angle = (float)reader.GetDouble(0); float angle = (float)reader.GetDouble(0);
int cardinal = reader.GetInt32(1); int cardinal = reader.GetInt32(1);
string name = reader.GetString(2); string name = reader.GetString(2);
SatellitePositionEntity child = new SatellitePositionEntity(angle, name); SatellitePosition child = new SatellitePosition(angle, cardinal, name);
positions.Add(child); positions.Add(child);
} }
@ -135,7 +135,7 @@ namespace skyscraper5.Data.PostgreSql
return positions; return positions;
} }
public void UiSatellitesAdd(SatellitePositionEntity newPosition) public void UiSatellitesAdd(SatellitePosition newPosition)
{ {
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {
@ -145,7 +145,7 @@ namespace skyscraper5.Data.PostgreSql
"insert into skyscraper5_satellite_positions (angle, cardinal, name, keyversion, key) " + "insert into skyscraper5_satellite_positions (angle, cardinal, name, keyversion, key) " +
"values (@angle, @cardinal, @name, @keyversion, @key)"; "values (@angle, @cardinal, @name, @keyversion, @key)";
cmd.Parameters.AddWithValue("@angle", NpgsqlDbType.Real, newPosition.angle); cmd.Parameters.AddWithValue("@angle", NpgsqlDbType.Real, newPosition.angle);
cmd.Parameters.AddWithValue("@cardinal", NpgsqlDbType.Integer, newPosition.GetCardinalDirectionAsInt()); cmd.Parameters.AddWithValue("@cardinal", NpgsqlDbType.Integer, newPosition.cardinalDirection);
cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, newPosition.name); cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, newPosition.name);
cmd.Parameters.AddWithValue("@keyversion", NpgsqlDbType.Integer, uiVersion); cmd.Parameters.AddWithValue("@keyversion", NpgsqlDbType.Integer, uiVersion);
cmd.Parameters.AddWithValue("@key", NpgsqlDbType.Text, newPosition.Checksum.ToString()); cmd.Parameters.AddWithValue("@key", NpgsqlDbType.Text, newPosition.Checksum.ToString());
@ -155,7 +155,7 @@ namespace skyscraper5.Data.PostgreSql
} }
} }
public void UiSatellitesDelete(SatellitePositionEntity satellitePosition) public void UiSatellitesDelete(SatellitePosition satellitePosition)
{ {
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString())) using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{ {

View File

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="10.0.2" /> <PackageReference Include="Npgsql" Version="9.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,18 +0,0 @@
I'm trying to parse the subtitles from a Brazilian live ISDB-T Capture.
I parsed the PMT, and it had a Data Component Descriptor present for the corresponding PID.
The Data Component Descriptor said 0x0012 for it's data_component_id.
According to Annex J in ARIB STD-B10, Part 3 this means "Subtitle coding for digital terrestrial broadcasting (C profile)" and points to ARIB STD-B24, Part 3, Volume 1.
So I checked ARIB STD-B24 Version 6.4 Fascicle 1, Part 3, Chapter 9.
This states that the captions are transmitted in PES packets, so I coded my program to attach a PES listener to the corresponding PID.
As expected, I get valid PES packets from it.
But the structure from the payload does not match what I find in ARIB STD-B24 Version 6.4 Fascicle 1, Part 3, Clause 9.2
The first bytes I got are 0x80 0xFF 0xF0 0x04 0x00 0x00 0x00 0x87
Bytes 1 & 2 in the standard say that they're data_group_link_number and last_data_group_link_number.
But that doesn't fit. 0x0F0 would be the last data group link number, but it's smaller than 0xFF.
I think I am looking in the wrong spot. Could you give me a small push in the right direction?
-
Okay, I think I got a few bytes.
The first three bytes 0x80, 0xFF, 0xF0 can be explained using ARIB TR-B14 Fascicle 3, clause 6.2.2 and ARIB STD-B37, clause 2.2.3.6
These are indeed a data_identifier, private_stream_id, reserved bits, and pes_data_packet_header_length, but now I still need to figure out the next four bytes: 0x00, 0x00, 0x00, 0x87. The 0x87 seems to indeed be the length of the packet.

View File

@ -1,86 +0,0 @@
byte1 in Hex;unkn1 in hex;unkn1 in Binary;byte2 in Hex;Times occurred;smallest seen packet;largest seen packet
0x01;0x10;0b00010000;0x00;1941;18;18
0x01;0x18;0b00011000;0x00;2898;24;24
0x01;0xC8;0b11001000;0x00;268;200;200
0x01;0xD4;0b11010100;0x00;286;212;212
0x01;0x38;0b00111000;0x01;24;312;312
0x01;0x3A;0b00111010;0x01;84;314;314
0x01;0x42;0b01000010;0x01;9;322;322
0x01;0x44;0b01000100;0x01;163;324;324
0x01;0x46;0b01000110;0x01;295;326;326
0x01;0x48;0b01001000;0x01;480;328;328
0x01;0x4A;0b01001010;0x01;143;330;330
0x01;0x4C;0b01001100;0x01;129;332;332
0x01;0x4E;0b01001110;0x01;86;334;334
0x01;0x50;0b01010000;0x01;102;336;336
0x01;0x52;0b01010010;0x01;145;338;338
0x01;0x54;0b01010100;0x01;149;340;340
0x01;0x56;0b01010110;0x01;444;342;342
0x01;0x58;0b01011000;0x01;93;344;344
0x01;0x5A;0b01011010;0x01;5;346;346
0x01;0x5C;0b01011100;0x01;69;348;348
0x01;0x5E;0b01011110;0x01;238;350;350
0x01;0x60;0b01100000;0x01;191;352;352
0x01;0x62;0b01100010;0x01;395;354;354
0x01;0x64;0b01100100;0x01;145;356;356
0x01;0x66;0b01100110;0x01;170;358;358
0x01;0x68;0b01101000;0x01;308;360;360
0x01;0x6A;0b01101010;0x01;262;362;362
0x01;0x6C;0b01101100;0x01;81;364;364
0x01;0x6E;0b01101110;0x01;153;366;366
0x01;0x70;0b01110000;0x01;177;368;368
0x01;0x72;0b01110010;0x01;207;370;370
0x01;0x74;0b01110100;0x01;158;372;372
0x01;0x76;0b01110110;0x01;285;374;374
0x01;0x78;0b01111000;0x01;421;376;376
0x01;0x7A;0b01111010;0x01;107;378;378
0x01;0x7C;0b01111100;0x01;59;380;380
0x01;0x7E;0b01111110;0x01;54;382;382
0x01;0x80;0b10000000;0x01;33;384;384
0x01;0x82;0b10000010;0x01;45;386;386
0x01;0x84;0b10000100;0x01;5;388;388
0x01;0x86;0b10000110;0x01;10;390;390
0x01;0x88;0b10001000;0x01;15;392;392
0x01;0x8A;0b10001010;0x01;15;394;394
0x01;0x8E;0b10001110;0x01;10;398;398
0x01;0x90;0b10010000;0x01;10;400;400
0x01;0x92;0b10010010;0x01;5;402;402
0x01;0x96;0b10010110;0x01;5;406;406
0x01;0x9A;0b10011010;0x01;10;410;410
0x01;0x9C;0b10011100;0x01;10;412;412
0x01;0x9E;0b10011110;0x01;5;414;414
0x01;0xA2;0b10100010;0x01;10;418;418
0x01;0xAE;0b10101110;0x01;10;430;430
0x01;0xB6;0b10110110;0x01;5;438;438
0x01;0x90;0b10010000;0x05;17020001;1424;1424
0x01;0xA0;0b10100000;0x05;257300;1440;1440
0x03;0x42;0b01000010;0x00;789;66;66
0x03;0x3E;0b00111110;0x01;2494;318;318
0x03;0x40;0b01000000;0x01;6732;320;320
0x03;0x42;0b01000010;0x01;674;322;322
0x03;0x44;0b01000100;0x01;654;324;324
0x03;0x46;0b01000110;0x01;1182;326;326
0x03;0x48;0b01001000;0x01;696;328;328
0x03;0x4A;0b01001010;0x01;2046;330;330
0x03;0x4C;0b01001100;0x01;843;332;332
0x03;0x4E;0b01001110;0x01;4130;334;334
0x03;0x50;0b01010000;0x01;2032;336;336
0x03;0x54;0b01010100;0x01;1121;340;340
0x03;0x56;0b01010110;0x01;2686;342;342
0x03;0x58;0b01011000;0x01;6191;344;344
0x03;0x5A;0b01011010;0x01;533;346;346
0x03;0x5C;0b01011100;0x01;1102;348;348
0x03;0x5E;0b01011110;0x01;2777;350;350
0x03;0x60;0b01100000;0x01;3290;352;352
0x03;0x62;0b01100010;0x01;4831;354;354
0x03;0x64;0b01100100;0x01;140;356;356
0x03;0x66;0b01100110;0x01;2485;358;358
0x03;0x68;0b01101000;0x01;4622;360;360
0x03;0x6A;0b01101010;0x01;3865;362;362
0x03;0x6C;0b01101100;0x01;5000;364;364
0x03;0x70;0b01110000;0x01;305;368;368
0x03;0x72;0b01110010;0x01;372;370;370
0x03;0x74;0b01110100;0x01;1106;372;372
0x03;0x78;0b01111000;0x01;1969;376;376
0x03;0xBA;0b10111010;0x05;4037;1466;1466
0xFF;0x08;0b00001000;0x00;421;18;18
1 byte1 in Hex unkn1 in hex unkn1 in Binary byte2 in Hex Times occurred smallest seen packet largest seen packet
2 0x01 0x10 0b00010000 0x00 1941 18 18
3 0x01 0x18 0b00011000 0x00 2898 24 24
4 0x01 0xC8 0b11001000 0x00 268 200 200
5 0x01 0xD4 0b11010100 0x00 286 212 212
6 0x01 0x38 0b00111000 0x01 24 312 312
7 0x01 0x3A 0b00111010 0x01 84 314 314
8 0x01 0x42 0b01000010 0x01 9 322 322
9 0x01 0x44 0b01000100 0x01 163 324 324
10 0x01 0x46 0b01000110 0x01 295 326 326
11 0x01 0x48 0b01001000 0x01 480 328 328
12 0x01 0x4A 0b01001010 0x01 143 330 330
13 0x01 0x4C 0b01001100 0x01 129 332 332
14 0x01 0x4E 0b01001110 0x01 86 334 334
15 0x01 0x50 0b01010000 0x01 102 336 336
16 0x01 0x52 0b01010010 0x01 145 338 338
17 0x01 0x54 0b01010100 0x01 149 340 340
18 0x01 0x56 0b01010110 0x01 444 342 342
19 0x01 0x58 0b01011000 0x01 93 344 344
20 0x01 0x5A 0b01011010 0x01 5 346 346
21 0x01 0x5C 0b01011100 0x01 69 348 348
22 0x01 0x5E 0b01011110 0x01 238 350 350
23 0x01 0x60 0b01100000 0x01 191 352 352
24 0x01 0x62 0b01100010 0x01 395 354 354
25 0x01 0x64 0b01100100 0x01 145 356 356
26 0x01 0x66 0b01100110 0x01 170 358 358
27 0x01 0x68 0b01101000 0x01 308 360 360
28 0x01 0x6A 0b01101010 0x01 262 362 362
29 0x01 0x6C 0b01101100 0x01 81 364 364
30 0x01 0x6E 0b01101110 0x01 153 366 366
31 0x01 0x70 0b01110000 0x01 177 368 368
32 0x01 0x72 0b01110010 0x01 207 370 370
33 0x01 0x74 0b01110100 0x01 158 372 372
34 0x01 0x76 0b01110110 0x01 285 374 374
35 0x01 0x78 0b01111000 0x01 421 376 376
36 0x01 0x7A 0b01111010 0x01 107 378 378
37 0x01 0x7C 0b01111100 0x01 59 380 380
38 0x01 0x7E 0b01111110 0x01 54 382 382
39 0x01 0x80 0b10000000 0x01 33 384 384
40 0x01 0x82 0b10000010 0x01 45 386 386
41 0x01 0x84 0b10000100 0x01 5 388 388
42 0x01 0x86 0b10000110 0x01 10 390 390
43 0x01 0x88 0b10001000 0x01 15 392 392
44 0x01 0x8A 0b10001010 0x01 15 394 394
45 0x01 0x8E 0b10001110 0x01 10 398 398
46 0x01 0x90 0b10010000 0x01 10 400 400
47 0x01 0x92 0b10010010 0x01 5 402 402
48 0x01 0x96 0b10010110 0x01 5 406 406
49 0x01 0x9A 0b10011010 0x01 10 410 410
50 0x01 0x9C 0b10011100 0x01 10 412 412
51 0x01 0x9E 0b10011110 0x01 5 414 414
52 0x01 0xA2 0b10100010 0x01 10 418 418
53 0x01 0xAE 0b10101110 0x01 10 430 430
54 0x01 0xB6 0b10110110 0x01 5 438 438
55 0x01 0x90 0b10010000 0x05 17020001 1424 1424
56 0x01 0xA0 0b10100000 0x05 257300 1440 1440
57 0x03 0x42 0b01000010 0x00 789 66 66
58 0x03 0x3E 0b00111110 0x01 2494 318 318
59 0x03 0x40 0b01000000 0x01 6732 320 320
60 0x03 0x42 0b01000010 0x01 674 322 322
61 0x03 0x44 0b01000100 0x01 654 324 324
62 0x03 0x46 0b01000110 0x01 1182 326 326
63 0x03 0x48 0b01001000 0x01 696 328 328
64 0x03 0x4A 0b01001010 0x01 2046 330 330
65 0x03 0x4C 0b01001100 0x01 843 332 332
66 0x03 0x4E 0b01001110 0x01 4130 334 334
67 0x03 0x50 0b01010000 0x01 2032 336 336
68 0x03 0x54 0b01010100 0x01 1121 340 340
69 0x03 0x56 0b01010110 0x01 2686 342 342
70 0x03 0x58 0b01011000 0x01 6191 344 344
71 0x03 0x5A 0b01011010 0x01 533 346 346
72 0x03 0x5C 0b01011100 0x01 1102 348 348
73 0x03 0x5E 0b01011110 0x01 2777 350 350
74 0x03 0x60 0b01100000 0x01 3290 352 352
75 0x03 0x62 0b01100010 0x01 4831 354 354
76 0x03 0x64 0b01100100 0x01 140 356 356
77 0x03 0x66 0b01100110 0x01 2485 358 358
78 0x03 0x68 0b01101000 0x01 4622 360 360
79 0x03 0x6A 0b01101010 0x01 3865 362 362
80 0x03 0x6C 0b01101100 0x01 5000 364 364
81 0x03 0x70 0b01110000 0x01 305 368 368
82 0x03 0x72 0b01110010 0x01 372 370 370
83 0x03 0x74 0b01110100 0x01 1106 372 372
84 0x03 0x78 0b01111000 0x01 1969 376 376
85 0x03 0xBA 0b10111010 0x05 4037 1466 1466
86 0xFF 0x08 0b00001000 0x00 421 18 18

View File

@ -1,24 +0,0 @@
0000 00 01 80 01 e1 91 85 92 eb 7c 00 00 00 20 71 01 ・・・・・・・・ ・|・・・ q・
0010 00 03 70 01 a9 96 24 a7 68 01 00 00 58 01 00 00 ・・p・・・$・ h・・・X・・・
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0030 97 12 0a 00 00 00 00 00 02 00 00 00 44 01 00 00 ・・・・・・・・ ・・・・D・・・
0040 17 00 00 00 00 00 00 00 80 05 00 00 8b 47 d9 69 ・・・・・・・・ ・・・・・G・i
0050 24 00 00 00 00 00 00 00 24 00 00 00 00 00 00 00 $・・・・・・・ $・・・・・・・
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
0070 38 35 31 32 35 5a 5f 33 5f 52 57 31 35 34 38 31 85125Z_3 _RW15481
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 4d 41 0042026R P1_RTRMA
0090 44 43 5f 30 5f 48 55 4e 47 41 52 59 2d 45 4c 45 DC_0_HUN GARY-ELE
00A0 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e CTION-OP POSITION
00B0 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e 58 4d -CONCERT -MORE.XM
00C0 4c 00 83 01 00 00 00 c1 10 65 79 84 53 b5 87 72 L・・・・・・・ ・ey・S・・r
00D0 48 9a c0 a7 5d 0b 6d 6a 58 a7 00 00 00 00 00 00 H・・・]・mj X・・・・・・・
00E0 00 0c 00 00 00 24 00 00 00 00 00 00 00 02 00 00 ・・・・・$・・ ・・・・・・・・
00F0 00 d2 46 d9 69 00 00 00 00 11 ba 00 00 00 00 00 ・・F・i・・・ ・・・・・・・・
0100 00 00 c6 00 00 00 00 00 00 5c 52 56 4e 2d 53 43 ・・・・・・・・ ・\RVN-SC
0110 52 49 50 54 53 5c 32 30 32 36 2d 30 34 2d 31 30 RIPTS\20 26-04-10
0120 54 31 38 35 31 32 35 5a 5f 33 5f 52 57 31 35 34 T185125Z _3_RW154
0130 38 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 81004202 6RP1_RTR
0140 4d 41 44 43 5f 30 5f 48 55 4e 47 41 52 59 2d 45 MADC_0_H UNGARY-E
0150 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 LECTION- OPPOSITI
0160 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e ON-CONCE RT-MORE.
0170 58 4d 4c 00 01 00 00 00 01 00 04 00 22 24 00 80 XML・・・・・ ・・・・"$・・

View File

@ -1,24 +0,0 @@
0000 00 01 7e 01 e1 91 85 92 f1 7c 00 04 00 00 6f 01 ・・~・・・・・ ・|・・・・o・
0010 00 03 6e 01 3f 0e c2 9e 66 01 00 00 56 01 00 00 ・・n・?・・・ f・・・V・・・
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0030 97 12 0a 00 00 00 00 00 02 00 00 00 42 01 00 00 ・・・・・・・・ ・・・・B・・・
0040 17 00 00 00 00 00 00 00 80 05 00 00 8b 47 d9 69 ・・・・・・・・ ・・・・・G・i
0050 11 00 00 00 00 00 00 00 11 00 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
0070 38 35 31 32 35 5a 5f 33 5f 57 44 31 35 34 38 31 85125Z_3 _WD15481
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 4e 0042026R P1_RTRWN
0090 45 43 5f 30 5f 31 35 34 38 2d 48 55 4e 47 41 52 EC_0_154 8-HUNGAR
00A0 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 Y-ELECTI ON-OPPOS
00B0 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f ITION-CO NCERT-MO
00C0 52 45 2e 58 4d 4c 00 83 01 00 00 00 c1 10 3d 83 RE.XML・・ ・・・・・・=・
00D0 f8 ba dc 14 a1 48 80 25 a3 05 be a5 b1 ab a0 00 ・・・・・H・% ・・・・・・・・
00E0 00 00 00 00 00 00 0c 00 00 00 11 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
00F0 00 00 02 00 00 00 d2 46 d9 69 00 00 00 00 64 53 ・・・・・・・F ・i・・・・dS
0100 00 00 00 00 00 00 80 5d 00 00 00 00 00 00 5c 32 ・・・・・・・] ・・・・・・\2
0110 30 32 36 2d 30 34 2d 31 30 54 31 38 35 31 32 35 026-04-1 0T185125
0120 5a 5f 33 5f 57 44 31 35 34 38 31 30 30 34 32 30 Z_3_WD15 48100420
0130 32 36 52 50 31 5f 52 54 52 57 4e 45 43 5f 30 5f 26RP1_RT RWNEC_0_
0140 31 35 34 38 2d 48 55 4e 47 41 52 59 2d 45 4c 45 1548-HUN GARY-ELE
0150 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e CTION-OP POSITION
0160 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e 58 4d -CONCERT -MORE.XM
0170 4c 00 01 00 00 00 01 00 04 00 10 11 00 80 L・・・・・・・ ・・・・・・

View File

@ -1,25 +0,0 @@
0000 00 01 8a 01 e1 91 85 92 fa 7c 00 00 00 21 7b 01 ・・・・・・・・ ・|・・・!{・
0010 00 03 7a 01 d5 85 5f 96 72 01 00 00 62 01 00 00 ・・z・・・_・ r・・・b・・・
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0030 97 12 0a 00 00 00 00 00 02 00 00 00 4e 01 00 00 ・・・・・・・・ ・・・・N・・・
0040 17 00 00 00 00 00 00 00 80 05 00 00 c7 47 d9 69 ・・・・・・・・ ・・・・・G・i
0050 0b 00 00 00 00 00 00 00 0b 00 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
0070 38 35 31 32 35 5a 5f 31 5f 57 44 31 35 34 38 31 85125Z_1 _WD15481
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 4e 0042026R P1_RTRWN
0090 45 43 5f 30 5f 31 35 34 38 2d 48 55 4e 47 41 52 EC_0_154 8-HUNGAR
00A0 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 Y-ELECTI ON-OPPOS
00B0 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f ITION-CO NCERT-MO
00C0 52 45 2e 63 61 73 00 83 01 00 00 00 c1 10 a5 7c RE.cas・・ ・・・・・・・|
00D0 ce b3 91 90 a1 47 81 54 96 43 55 36 a2 b1 ac 00 ・・・・・G・T ・CU6・・・・
00E0 00 00 00 00 00 00 0c 00 00 00 0b 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
00F0 00 00 02 00 00 00 0e 47 d9 69 00 00 00 00 7a 36 ・・・・・・・G ・i・・・・z6
0100 00 00 00 00 00 00 80 3c 00 00 00 00 00 00 5c 52 ・・・・・・・< ・・・・・・\R
0110 56 4e 2d 53 43 52 49 50 54 53 5c 32 30 32 36 2d VN-SCRIP TS\2026-
0120 30 34 2d 31 30 54 31 38 35 31 32 35 5a 5f 31 5f 04-10T18 5125Z_1_
0130 57 44 31 35 34 38 31 30 30 34 32 30 32 36 52 50 WD154810 042026RP
0140 31 5f 52 54 52 57 4e 45 43 5f 30 5f 31 35 34 38 1_RTRWNE C_0_1548
0150 2d 48 55 4e 47 41 52 59 2d 45 4c 45 43 54 49 4f -HUNGARY -ELECTIO
0160 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e 2d 43 4f 4e N-OPPOSI TION-CON
0170 43 45 52 54 2d 4d 4f 52 45 2e 63 61 73 00 01 00 CERT-MOR E.cas・・・
0180 00 00 01 00 04 00 0a 0b 00 80 ・・・・・・・・ ・・

View File

@ -1,24 +0,0 @@
0000 00 03 78 01 cc 30 69 01 70 01 00 00 60 01 00 00 ・・x・・0i・ p・・・`・・・
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0020 97 12 0a 00 00 00 00 00 02 00 00 00 4c 01 00 00 ・・・・・・・・ ・・・・L・・・
0030 17 00 00 00 00 00 00 00 80 05 00 00 db 47 d9 69 ・・・・・・・・ ・・・・・G・i
0040 00 90 02 00 00 00 00 00 00 90 02 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
0050 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
0060 38 34 34 31 34 5a 5f 31 5f 4c 57 44 31 35 34 38 84414Z_1 _LWD1548
0070 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
0080 4e 45 56 5f 42 5f 31 35 34 38 2d 48 55 4e 47 41 NEV_B_15 48-HUNGA
0090 52 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f RY-ELECT ION-OPPO
00A0 53 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d SITION-C ONCERT-M
00B0 4f 52 45 2e 4d 50 47 2e 65 6e 63 00 83 01 00 00 ORE.MPG. enc・・・・・
00C0 00 c1 10 de b4 12 f2 c5 cb d8 47 a7 10 17 e4 bb ・・・・・・・・ ・・G・・・・・
00D0 7e 62 1c a5 00 00 00 00 00 00 00 0c 00 00 00 00 ~b・・・・・・ ・・・・・・・・
00E0 90 02 00 00 00 00 00 02 00 00 00 13 47 d9 69 00 ・・・・・・・・ ・・・・G・i・
00F0 00 00 00 00 40 5c 0d 00 00 00 00 00 00 18 0e 00 ・・・・@\・・ ・・・・・・・・
0100 00 00 00 5c 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・\2026 -04-10T1
0110 38 34 34 31 34 5a 5f 31 5f 4c 57 44 31 35 34 38 84414Z_1 _LWD1548
0120 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
0130 4e 45 56 5f 42 5f 31 35 34 38 2d 48 55 4e 47 41 NEV_B_15 48-HUNGA
0140 52 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f RY-ELECT ION-OPPO
0150 53 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d SITION-C ONCERT-M
0160 4f 52 45 2e 4d 50 47 2e 65 6e 63 00 01 00 00 00 ORE.MPG. enc・・・・・
0170 01 00 04 00 f3 00 00 80 ・・・・・・・・

View File

@ -1,22 +0,0 @@
0000 00 03 54 01 12 65 f2 b5 4c 01 00 00 3c 01 00 00 ・・T・・e・・ L・・・<・・・
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0020 97 12 0a 00 00 00 00 00 02 00 00 00 28 01 00 00 ・・・・・・・・ ・・・・(・・・
0030 17 00 00 00 00 00 00 00 80 05 00 00 b4 48 d9 69 ・・・・・・・・ ・・・・・H・i
0040 d8 13 00 00 00 00 00 00 d8 13 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
0050 01 00 00 00 32 30 31 32 2d 31 32 2d 30 36 54 31 ・・・・2012 -12-06T1
0060 37 32 34 34 31 5a 5f 37 36 5f 4c 57 44 30 30 30 72441Z_7 6_LWD000
0070 52 54 54 49 4f 4f 44 5f 52 54 52 57 4e 45 56 5f RTTIOOD_ RTRWNEV_
0080 42 5f 54 39 39 39 2d 50 4c 45 41 53 45 2d 49 47 B_T999-P LEASE-IG
0090 4e 4f 52 45 2d 32 36 30 34 31 30 30 30 30 37 35 NORE-260 41000075
00A0 33 2e 4d 50 47 2e 65 6e 63 00 83 01 00 00 00 c1 3.MPG.en c・・・・・・・
00B0 10 eb d9 18 9c ea 9a af 48 8b 2c 06 c4 25 6a 2c ・・・・・・・・ H・,・・%j,
00C0 bf 93 00 00 00 00 00 00 00 0c 00 00 00 d8 13 00 ・・・・・・・・ ・・・・・・・・
00D0 00 00 00 00 00 02 00 00 00 85 47 d9 69 00 00 00 ・・・・・・・・ ・・G・i・・・
00E0 00 00 20 67 00 00 00 00 00 00 24 6d 00 00 00 00 ・・ g・・・・ ・・$m・・・・
00F0 00 5c 32 30 31 32 2d 31 32 2d 30 36 54 31 37 32 ・\2012-1 2-06T172
0100 34 34 31 5a 5f 37 36 5f 4c 57 44 30 30 30 52 54 441Z_76_ LWD000RT
0110 54 49 4f 4f 44 5f 52 54 52 57 4e 45 56 5f 42 5f TIOOD_RT RWNEV_B_
0120 54 39 39 39 2d 50 4c 45 41 53 45 2d 49 47 4e 4f T999-PLE ASE-IGNO
0130 52 45 2d 32 36 30 34 31 30 30 30 30 37 35 33 2e RE-26041 0000753.
0140 4d 50 47 2e 65 6e 63 00 01 00 00 00 01 00 04 00 MPG.enc・ ・・・・・・・・
0150 f1 fe 00 80 ・・・・

View File

@ -1,21 +0,0 @@
0000 00 03 4c 01 11 ab 5d bc 44 01 00 00 34 01 00 00 ・・L・・・]・ D・・・4・・・
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0020 97 12 0a 00 00 00 00 00 02 00 00 00 20 01 00 00 ・・・・・・・・ ・・・・ ・・・
0030 17 00 00 00 00 00 00 00 80 05 00 00 af 49 d9 69 ・・・・・・・・ ・・・・・I・i
0040 00 4f 01 00 00 00 00 00 00 4f 01 00 00 00 00 00 ・O・・・・・・ ・O・・・・・・
0050 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
0060 38 35 34 34 31 5a 5f 31 5f 4c 57 44 31 35 32 30 85441Z_1 _LWD1520
0070 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
0080 4e 45 56 5f 42 5f 31 35 32 30 2d 53 50 41 43 45 NEV_B_15 20-SPACE
0090 2d 4d 4f 4f 4e 2d 41 52 54 45 4d 49 53 2e 4d 50 -MOON-AR TEMIS.MP
00A0 47 2e 65 6e 63 00 83 01 00 00 00 c1 10 e5 8c 5f G.enc・・・ ・・・・・・・_
00B0 e0 01 87 38 48 bf be 18 db b0 93 27 d7 8f 00 00 ・・・8H・・・ ・・・'・・・・
00C0 00 00 00 00 00 0c 00 00 00 00 4f 01 00 00 00 00 ・・・・・・・・ ・・O・・・・・
00D0 00 02 00 00 00 f0 48 d9 69 00 00 00 00 00 c8 d0 ・・・・・・H・ i・・・・・・・
00E0 06 00 00 00 00 00 80 32 07 00 00 00 00 5c 32 30 ・・・・・・・2 ・・・・・\20
00F0 32 36 2d 30 34 2d 31 30 54 31 38 35 34 34 31 5a 26-04-10 T185441Z
0100 5f 31 5f 4c 57 44 31 35 32 30 31 30 30 34 32 30 _1_LWD15 20100420
0110 32 36 52 50 31 5f 52 54 52 57 4e 45 56 5f 42 5f 26RP1_RT RWNEV_B_
0120 31 35 32 30 2d 53 50 41 43 45 2d 4d 4f 4f 4e 2d 1520-SPA CE-MOON-
0130 41 52 54 45 4d 49 53 2e 4d 50 47 2e 65 6e 63 00 ARTEMIS. MPG.enc・
0140 01 00 00 00 01 00 04 00 f3 00 00 80 ・・・・・・・・ ・・・・

View File

@ -1,13 +0,0 @@
0000 00 01 c8 00 e1 91 85 92 f9 7d 00 02 00 00 b9 00 ・・・・・・・・ ・}・・・・・・
0010 00 03 b8 00 2b f0 ab 81 b0 00 00 00 a0 00 00 00 ・・・・+・・・ ・・・・・・・・
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
0030 97 12 0a 00 00 00 00 00 02 00 00 00 8c 00 00 00 ・・・・・・・・ ・・・・・・・・
0040 17 00 00 00 00 00 00 00 80 05 00 00 5c 4a d9 69 ・・・・・・・・ ・・・・\J・i
0050 61 02 00 00 00 00 00 00 61 02 00 00 00 00 00 00 a・・・・・・・ a・・・・・・・
0060 01 00 00 00 77 6e 65 2e 64 61 74 00 83 01 00 00 ・・・・wne. dat・・・・・
0070 00 c1 10 97 70 db bc 3e 3a 9e 45 9f 03 8d 2a fb ・・・・p・・> :・E・・・*・
0080 ea eb ce 45 00 00 00 00 00 00 00 0c 00 00 00 61 ・・・E・・・・ ・・・・・・・a
0090 02 00 00 00 00 00 00 02 00 00 00 a2 49 d9 69 00 ・・・・・・・・ ・・・・I・i・
00A0 00 00 00 6b 5e 0c 00 00 00 00 00 80 15 0d 00 00 ・・・k^・・・ ・・・・・・・・
00B0 00 00 00 5c 77 6e 65 2e 64 61 74 00 01 00 00 00 ・・・\wne. dat・・・・・
00C0 01 00 04 00 c0 cb 00 80 ・・・・・・・・

View File

@ -1,61 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:rrt="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/" elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="W3C/xml.xsd"/>
<xs:element name="RatingRegionTables" type="rrt:RRsType"/>
<xs:complexType name="RRsType">
<xs:sequence>
<xs:element name="RatingRegionTable" type="rrt:RatingRegionTableType" maxOccurs="2"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:complexType name="RatingRegionTableType">
<xs:sequence>
<xs:element name="RegionIdText" type="rrt:TextType" maxOccurs="unbounded"/>
<xs:element name="Dimension" type="rrt:DimensionType" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="regionIdentifier" type="rrt:RIType" use="required"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:simpleType name="RIType">
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="DimensionType">
<xs:sequence>
<xs:element name="DimensionTitle" type="rrt:TextType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Rating" type="rrt:RatingType" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="dimensionLevels" type="rrt:DimLevelType" use="required"/>
<xs:attribute name="dimensionGraduated" type="xs:boolean" default="false"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:simpleType name="DimLevelType">
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="RatingType">
<xs:sequence>
<xs:element name="RatingValueAbbrev" type="rrt:TextType" maxOccurs="unbounded"/>
<xs:element name="RatingValueString" type="rrt:TextType" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="ratingValue" type="xs:unsignedByte" use="required"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:complexType name="TextType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" default="EN"/>
<xs:anyAttribute processContents="strict"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>

View File

@ -1,225 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sa="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/"
xmlns:rrt="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/"
elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="W3C/xml.xsd"/>
<xs:import namespace="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
schemaLocation="RRT-1.0-20170209.xsd"/>
<xs:annotation>
<xs:documentation>
The definition of this schema can also be found in an XML schema file, SA-1.0-20170921.xsd at the ATSC website.The XML schema file RRT-1.0-20170209.xsd can also be found at the ATSC website.
</xs:documentation>
</xs:annotation>
<xs:element name="Capabilities" type="sa:CapabilitiesType" />
<xs:simpleType name="CapabilitiesType"><xs:restriction base="xs:string"/></xs:simpleType>
<xs:annotation>
<xs:documentation>
Name and Description elements in Service and Content Fragments of OMA BCAST service guide will be replaced with following extended elements
</xs:documentation>
</xs:annotation>
<xs:element name="Name" type="sa:NameDescriptionType" />
<xs:element name="Description" type="sa:NameDescriptionType" />
<xs:complexType name="NameDescriptionType">
<xs:sequence>
<xs:element name="SpeechInfoURI" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="content-type" type="xs:string" use="optional"/>
<xs:attribute name="content-enc" type="xs:string" use="optional"/>
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="SpeechInfo" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="content-type" type="xs:string" use="optional"/>
<xs:attribute name="content-enc" type="xs:string" use="optional"/>
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="text" type="xs:string" use="required" />
<xs:attribute ref="xml:lang" use="optional"/>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:element name="ContentAdvisoryRatings" type="sa:CARatingType"/>
<xs:complexType name="CARatingType">
<xs:sequence>
<xs:element name="RegionIdentifier" type="xs:unsignedByte"
minOccurs="0" maxOccurs="1"/>
<xs:element name="RatingDescription" maxOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" use="optional"
default="en"/>
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="RatedDimensions" type="xs:unsignedByte"
minOccurs="0" maxOccurs="1"/>
<xs:element name="RatingDimVal" type="sa:RatingDimValType"
minOccurs="1" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:complexType name="RatingDimValType">
<xs:sequence>
<xs:element name="RatingDimension" type="xs:unsignedByte"
minOccurs="0" maxOccurs="1"/>
<xs:element name="RatingValueString" type="xs:string"
minOccurs="1"/>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:element name="OtherRatings" type="sa:OtherRatingType"/>
<xs:complexType name="OtherRatingType">
<xs:sequence>
<xs:choice>
<xs:element name="RatingInformationString" type="xs:string" minOccurs="1"/>
<xs:element name="RatingInformationData" type="sa:RatingContainerType" minOccurs="1"/>
</xs:choice>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="ratingScheme" type="xs:anyURI" use="required" />
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:complexType name="RatingContainerType">
<xs:sequence>
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:element name="ATSC3ServiceExtension" type="sa:ATSC3ServiceExtensionType" >
<xs:annotation>
<xs:documentation>
This element is a wrapper for ATSC service extensions to OMA BCAST SG Service fragments. It shall only be used inside a PrivateExt element within a Service fragment.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ATSC3ServiceExtensionType">
<xs:sequence>
<xs:element name="Icon" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="MajorChannelNum" type="sa:LangString" minOccurs="0" maxOccurs="1"/>
<xs:element name="MinorChannelNum" type="sa:LangString" minOccurs="0" maxOccurs="1"/>
<xs:element name="RatingRegionTables" type="rrt:RRsType" minOccurs="0" maxOccurs="1"/>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Components" type="sa:ComponentsType" >
<xs:annotation>
<xs:documentation>
This element is a wrapper for ATSC media extensions to OMA BCAST SG Content fragments. It shall only be used inside a PrivateExt element within a Content fragment.
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="ComponentsType">
<xs:sequence>
<xs:element name="VideoComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="AudioComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="CCComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="AppComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
<xs:complexType name="IndividualComponentType">
<xs:complexContent>
<xs:extension base="sa:LangString">
<xs:attribute name="language" type="xs:string" use="optional" default="en"/>
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="LangString">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="xml:lang" use="optional" default="en"/>
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="ContentIcon" >
<xs:annotation><xs:documentation>This element is only used inside a PrivateExt element within a Content fragment as defined in Table 5.7 and its cardinality is defined in Table 5.9. </xs:documentation></xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Preview" type="sa:PreviewType" />
<xs:complexType name="PreviewType">
<xs:sequence>
<xs:element name="PreviewIcon" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Description" type="sa:NameDescriptionType" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="PreviewContent" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
<xs:anyAttribute processContents="skip"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="usage" type="xs:string" use="optional" default="promo"/>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
</xs:schema>

View File

@ -1,91 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:slt="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SLT/1.0/" xmlns:sa="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/" targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SLT/1.0/" elementFormDefault="qualified">
<xs:import namespace="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/" schemaLocation="SA-1.0-20170921.xsd"/>
<xs:element name="SLT" type="slt:sltType"/>
<xs:complexType name="sltType">
<xs:sequence>
<xs:element name="SLTCapabilities" type="sa:CapabilitiesType" minOccurs="0"/>
<xs:element name="SLTInetUrl" type="slt:URLType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Service" type="slt:serviceType" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="bsid" type="slt:listOfUnsignedShortType" use="required"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:complexType name="serviceType">
<xs:sequence>
<xs:element name="SimulcastTSID" type="slt:SimulcastTSIDType" minOccurs="0"/>
<xs:element name="SvcCapabilities" type="sa:CapabilitiesType" minOccurs="0"/>
<xs:element name="BroadcastSvcSignaling" type="slt:broadcastSigType" minOccurs="0"/>
<xs:element name="SvcInetUrl" type="slt:URLType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="OtherBsid" type="slt:OtherBsidType" minOccurs="0" maxOccurs="unbounded"/>
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="serviceId" type="xs:unsignedShort" use="required"/>
<xs:attribute name="globalServiceID" type="xs:anyURI"/>
<xs:attribute name="sltSvcSeqNum" type="xs:unsignedByte" use="required"/>
<xs:attribute name="protected" type="xs:boolean" default="false"/>
<xs:attribute name="majorChannelNo" type="slt:ChannelNumType"/>
<xs:attribute name="minorChannelNo" type="slt:ChannelNumType"/>
<xs:attribute name="serviceCategory" type="xs:unsignedByte" use="required"/>
<xs:attribute name="shortServiceName" type="xs:string"/>
<xs:attribute name="hidden" type="xs:boolean" default="false"/>
<xs:attribute name="broadbandAccessRequired" type="xs:boolean" default="false"/>
<xs:attribute name="essential" type="xs:boolean"/>
<xs:attribute name="drmSystemID" type="xs:anyURI"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:complexType name="SimulcastTSIDType">
<xs:simpleContent>
<xs:extension base="xs:unsignedShort">
<xs:attribute name="simulcastMajorChannelNo" type="slt:ChannelNumType"/>
<xs:attribute name="simulcastMinorChannelNo" type="slt:ChannelNumType"/>
<xs:anyAttribute processContents="strict"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="broadcastSigType">
<xs:attribute name="slsProtocol" type="xs:unsignedByte" use="required"/>
<xs:attribute name="slsMajorProtocolVersion" type="xs:unsignedByte" default="1"/>
<xs:attribute name="slsMinorProtocolVersion" type="xs:unsignedByte" default="0"/>
<xs:attribute name="slsDestinationIpAddress" type="slt:IPv4addressType" use="required"/>
<xs:attribute name="slsDestinationUdpPort" type="slt:PortType" use="required"/>
<xs:attribute name="slsSourceIpAddress" type="slt:IPv4addressType"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:complexType name="URLType">
<xs:simpleContent>
<xs:extension base="xs:anyURI">
<xs:attribute name="urlType" type="xs:unsignedByte" use="required"/>
<xs:anyAttribute processContents="strict"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="OtherBsidType">
<xs:simpleContent>
<xs:extension base="slt:listOfUnsignedShortType">
<xs:attribute name="type" type="xs:unsignedByte" use="required"/>
<xs:anyAttribute processContents="strict"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="ChannelNumType">
<xs:restriction base="xs:unsignedShort">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="999"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IPv4addressType">
<xs:restriction base="xs:token">
<xs:pattern value="(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PortType">
<xs:restriction base="xs:unsignedShort">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="listOfUnsignedShortType">
<xs:list itemType="xs:unsignedShort"/>
</xs:simpleType>
</xs:schema>

View File

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:time="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SYSTIME/1.0/" targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SYSTIME/1.0/" elementFormDefault="qualified">
<xs:element name="SystemTime" type="time:SysTimeType"/>
<xs:complexType name="SysTimeType">
<xs:attribute name="currentUtcOffset" type="xs:short" use="required"/>
<xs:attribute name="ptpPrepend" type="xs:unsignedShort" default="0"/>
<xs:attribute name="leap59" type="xs:boolean" default="false"/>
<xs:attribute name="leap61" type="xs:boolean" default="false"/>
<xs:attribute name="utcLocalOffset" type="xs:duration" use="required"/>
<xs:attribute name="dsStatus" type="xs:boolean" default="false"/>
<xs:attribute name="dsDayOfMonth" type="time:dayType"/>
<xs:attribute name="dsHour" type="time:hourType"/>
<xs:anyAttribute processContents="strict"/>
</xs:complexType>
<xs:simpleType name="dayType">
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="31"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="hourType">
<xs:restriction base="xs:unsignedByte">
<xs:maxInclusive value="24"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

View File

@ -1,3 +0,0 @@
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes SLT-1.0-20180228.xsd SA-1.0-20170921.xsd RRT-1.0-20170209.xsd /out:. /namespace:skyscraper8.Atsc.A331.Schema
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes SYSTIME-1.0-20170921.xsd /out:. /namespace:skyscraper8.Atsc.A331.Schema
pause

View File

@ -1,319 +0,0 @@
# Das namen- und staatenlose Dorf
* Das Dorf um das es geht ist rein fiktiv!
* Ort: relativ genau auf dem Dreiländereck zwischen der Schweiz, Frankreich und Italien.
* Genre: Mischung aus Sci-Fi und weichgespülter Fantasy
* Zeitgeist: Etwa 2025-2027
---
## Charaktere
### Hauptcharaktere
#### Alpha Aoki
- **Name:** Alpha Aoki
- **Alter:** 34 Jahre
- **Beziehungen:** Sie ist die ältere zweieiige Zwillingsschwester von Sophia Aoki. Ihre Mutter ist Alexandra.
- **Wohnort:** Zusammen mit Sophia In einer viel zu kleinen Wohnung über der Metzgerei des Dorfes. Später in der Aoki-Villa
- **Rasse:** Menschenbrut
- **Fähigkeit als Menschenbrut:** Sie kann instinktiv den Fluss von Finanzen spüren. Dieses Gespür kommt in Form eines zusätzlichen Sinnesorgans. Wenn sie die Augen schließt und sich transportiert, gaukelt ihr dieses Sinnesorgan ihren anderen Sinnen einen Ozean vor, dessen Wasserströmungen die Finanzströme sind. Der Ozean ist auch nicht wirklich aus Wasser, sondern aus Zahlen und Daten, die sich in ihrem Verstand verhalten wie Wasser.
- **Arbeit:** Sie ist Junior Analystin bei einer kleinen Schweizer Bank. Mithilfe ihrer Fähigkeit hat sie schon mehrere Kunden dieser Bank zu Reichtum verholfen.
- **Bildung:** Da es im Dorf kein richtiges Bildungssystem gibt, hat Alexandra Alpha & Sophia von recht teuren Privatlehren homeschoolen lassen.
#### Sophia Aoki
- **Name:** Sophia Aoki
- **Alter:** 34 Jahre
- **Beziehungen:** Sie ist die jüngere zweieiige Zwillingsschwester von Alpha Aoki. Ihr Chef ist Herr Moreau. Ihre Mutter ist Alexandra.
- **Wohnort:** Zusammen mit Alpha In einer viel zu kleinen Wohnung über der Metzgerei des Dorfes. Später in der Aoki-Villa.
- **Arbeit:** Sie arbeitet im Laden von Herrn Moreau. Hauptsächlich kümmert sie sich um die Reperatur von allen möglichen, was Kunden so abgeben.
- **Rasse:** Menschenbrut
- **Fähigkeit als Menschenbrut:** Sie verfügt über eine übermenschliche Intelligenz
- **Hobbies:** Sie hat sich von kleinauf für Technik begeistert. Bereits mit sieben Jahren konnte sie flüssig in Assemblersprache programmieren, und sie geht mit einem Lötkolben so sicher um, wie ein Herzchirug mit seinen Instrumenten.
- **Bildung:** Da es im Dorf kein richtiges Bildungssystem gibt, hat Alexandra Alpha & Sophia von recht teuren Privatlehren homeschoolen lassen.
#### Alexandra Aoki:
- **Name:** Alexandra Aoki (oder unter Hexen einfach nur "Alexandra")
- **Alter:** 835 Jahre
- **Beziehungen:** Sie ist die Mutter von Alpha und Sophia. Als die beiden volljährig geworden sind, hat Alexandra sie alleine im Dorf zurückgelassen. Nicht weil sie ihre Töchter hasst, nein, ganz im Gegenteil. Sie liebt ihre Töchter, und wollte dass diese schnell lernen auf eigenen Füßen zu stehen.
- **Wohnort:** irgendwo in Florenz, Italien - später in der Aoki-Villo
- **Arbeit:** unbekannt
- **Rasse:** Hexe
- **Bildung:** Im Hexenwald hat sie die übliche Grundausbildung erhalten, die alle Hexen bekommen. Später hat sie Italienisch gelernt, um den Hexenwald verlassen zu können.
- Auch wenn sie eine Hexe ist, und über starke Magie verfügt, hat sie vor etwa 150 Jahren beschlossen, keinerlei Magie mehr einzusetzen, und ihr Leben so menschlich wie möglich zu führen.
#### Chloe Lindberg
- **Name:** Chloe Lindberg
- **Alter:** 34 Jahre
- **Beziehungen:** Sie war vor vielen Jahren mal mit Sophia zusammen. Nun lebt Chloe in Finnland und pflegt dort gute Beziehungen zu ihren Schüler*innnen.
- **Wohnort:** Helsinki, Finnland
- **Arbeit:** Sie arbeitet in einer Sprachschule in Helsinki und unterrichtet Finnisch für Einwanderer.
- **Rasse:** Mensch
- **Bildung:** Chloe hat das Gemeinschaftslernzentrum des Dorfes besucht. Einen formellen Schulabschluss hat sie deshalb nicht, kann aber vom Bildungsgrad etwa mit jemanden mithalten, der ein Schweizer Matura hat.
- Als Chloe volljährig wurde, hat sie das Dorf verlassen um in Paris ihre Glück zu suchen.
- In Paris hat sie mehrere Indie-Games entwickelt, die alle sehr gute Kritiken erhalten haben, aber ein Kassenschlager wurden diese nicht.
- In Paris hat sie sich in einen Mann verliebt, mit dem sie eine kleine Tochter hat, die ihr zum Verwechseln ähnlich sieht.
- Da sich der gewünschte Erfolg in Paris nicht gezeigt hat, hat sie beschlossen noch einmal von vorne anzufangen und zwar in Finnland.
- Das Einwanderungsverfahren empfand sie als sehr schwierig. Sobald sie fließend in Finnisch ist, entschließt sie sich dazu, Sprachlehrerin zu werden, um anderen Einwanderern bei ähnlichen Problemen zu helfen.
#### Valérie Beaumont
- **Name:** Valérie Beaumont
- **Alter:** 32 Jahre
- **Beziehungen:** Im Laufe der Story sind Valérie und Sophia zusammengekommen. Auch wenn sie adoptiert ist, schätzt sie ihre "Maman" und ihren "Papa" sehr, und pflegt auch ein gutes Verhältnis zu ihrer älteren Schwester, die nicht adoptiert, sondern ein leibliches Kind von Madame Beaumont ist.
- **Wohnort:** Auf einem großen Bauernhof in Frankreich, wenige Minuten Fahrradweg von der Grenze zum Dorf entfernt.
- **Arbeit:** Sie arbeitet auf dem Bauernhof ihrer ihrer Adoptiveltern und ist gleichzeitig auch Eventplannerin in einer erfolgreichen Eventagentur. Ihre Chefin dort sagt, dass Valérie die beste Eventplannerin ist, die sie hat.
- **Rasse:** Mensch
- **Bildung:** Valérie verfügt über ein allgemeines französisches Lycée.
#### Tennie:
- **Tennie:** Tennie
- **Alter:** Da sie eine streunende Katze ist, hat man sich nicht die Mühe gemacht, wie alt sie ist.
- **Beziehungen:**
- Alexandra ist Tennies Lieblingszweibeinerin.
- Tennie hasst Alpha aus nicht näher bekannten Gründen. Wahrscheinlich irgendsoein Katzending.
- Tennie mag Sophia (oder eher ihren Schoß) weil bequem.
- Tennie mag Espresso, weil diese am ehesten Futter spendet.
- Tennie findet die Geräusche lustig, wenn Jade wegen ihrer Katzenhaarallergie niesen muss.
- **Wohnort:** Adoptiert in der Aoki-Villa
- **Arbeit:** Hält die Villa und die Umgebung von Mäusen und anderen Schädlingen frei
- **Rasse:** Hauskatze (Felis domestica)
- **Bildung:** Was man als streunende Straßenkatze im Dorf eben so lernt.
- Tennie ist eine getigerte, europäisch-Kurzhaar Braun-Tabby.
- Als sie noch eine Streunerin war, hat ihr der Winter stark zugesetzt. Als sie nicht mehr weiter wusste, hat sie sich im Brennpunkt der großen Satellitenschüssel im Garten der Aoki-Villa versteckt, um dort Zuflucht vor dem Schnee zu suchen.
- Sie wurde Tennie genannt, weil die Antenne aus der Sophia sie gerettet hat auf Eutelsat 10 (Ten) ausgerichtet ist.
### Die Maids in der Aoki-Villa
### Espresso
- **Name:** Lina "Espresso" Müller
- **Alter:** 22 Jahre
- **Beziehungen:** Laut Kaede ist Espresso die zuverlässigste, wenn auch die chaotischte aller Maids.
- **Wohnort:** In einer kleinen Wohnung nahe des Dorf-Plazas
- **Arbeit:** Sie ist Maid in der Aoki-Villa.
- **Rasse:** Mensch
- **Bildung:** Espresso gilt als gebildet. Sie hat ein österreichisches Matura und ein großes Latinum.
- Espresso nennt sich selbst "fleischgewordener Unfug" und dies äußert sich darin, dass sie immer Unfug oder Schabernack parat hat. Sie weiß auch immer, wie sie Leuten wieder ein Lächeln auf die Lippen zaubern kann.
- Espresso kommt ursprünglich aus Österreich. Sie ist Tochter eines Staranwaltes und einer Chefärztin.
- Espresso färbt sich die Haare immer und grundsätzlich grün. Sie benutzt das selbe grün wie Fawn, und erklärt sie deshalb automatisch zur guten Freundin.
### Mistral
- **Name:** ? "Mistral" ?
- **Alter:** 27 Jahre
- **Beziehungen:** Der wichtigste Mensch in ihrem Leben ist ihre jüngere Schwester, Camille. Mistral möchte Camille um jeden Preis beschützen.
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
- **Arbeit:** Sie ist Maid in der Aoki-Villa
- **Rasse:** Mensch
- **Bildung:** Mistral hat ein französisches "Lycée professionnel" und ist ausgebildete Elektrikerin.
### Mireille
- **Name:** ? "Mireille" ?
- **Alter:** 64 Jahre
- **Beziehungen:** Wenige. Mireille lebt recht abgeschieden im Dorf. Sie geht ihrer Arbeit als Maid in der Villa aber gerne und mit Eifer nach. Ansonsten hat sie einen Ex-Mann, von dem sie nicht weiß, wo er abgebildet ist, und einen Sohn, der in Amerika in einem Großkonzern arbeitet.
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
- **Arbeit:** Sie ist Maid in der Aoki-Villa. Sie arbeitet ausschließlich in der Nachtschicht, niemals tagsüber.
- **Rasse:** Mensch
- **Bildung:** Da sie ein Kind des Dorfes ist, hat sie lediglich das Gemeinschaftslernzentrum des Dorfes besucht. Von daher kann sie keinen formellen Bildungsabschluss vorweisen.
### Ryouku
- **Name:** ? "Ryouku" ?
- **Alter:** 25 Jahre
- **Beziehungen:** Wenige. Ihre praktisch einzigen Bezugspersonen sind Kaede als Chefin, und Mireille als Kollegin.
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
- **Arbeit:** Sie ist Maid in der Aoki-Villa. Sie arbeitet ausschließlich in der Nachtschicht, niemals tagsüber.
- **Rasse:** Mensch
- **Bildung:** Sie hat eine Oberschule in Japan besucht und abgeschlossen. Sie hatte auch die Chance auf eine gute Universität zu gelangen, hat diese aber nicht genutzt.
- Sie hat einen "Deutsch-Tick". In ihrer Schulzeit während der Oberschule war sie im Deutsch-Club, weil sie die D-A-CH Region schon immer fasziniert hat. Im Deutsch-Club hat sie mit ihren Mitschüler*innen deutsche Literatur gelesen, deutsche Musik gehört, deutsche Filme/Serien geschaut. Am liebsten mochte sie Stromberg. Deshalb ist sie auch nicht zur Uni gegangen, da sich für sie durch Zufall die Chance geboten hat, in der D-A-CH Region zu arbeiten. Diese Chance hat sie ergriffen, und so ist sie in der Villa gelandet.
### Jade
- **Name:** ? "Jade" ?
- **Alter:** 31 Jahre
- **Beziehungen:** Viele. Sie ist extrem kontaktfreudig, und das nicht nur verbal.
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
- **Arbeit:** Sie ist Maid in der Aoki-Villa, und bietet im Keller unter ihrer Wohnung Domina-Dienstleistungen an.
- **Rasse:** Mensch
- **Bildung:** Sie hat ein allgemeins französisches "Lycée" und ist ausgebildete Hotelfachfrau.
- Bevor sie in die Aoki-Villa kam, hat Jade in der Luxus-Hotellerie gearbeitet. Hauptsächlich war sie dort für die Kinderbetreuung zuständig, und hat sich auch mal für besondere VIPs des Hotels um Dienstleistungen gekümmert, die nicht zwangsläufig auf der Hotelrechnung standen.
- Da sie bisher nur das Großstadt-Leben kennt, ist die Tatsache, dass das Dorf komplett Off-Grid ist zunächst eine Qual. Netflix, Spotify, Uber Eats und ähnliche Dienste nicht zur Verfügung zuhaben empfand sie zunächst als unheimlich unangenehm, aber je länger sie im Dorf lebt, um so mehr lernt sie das zu schätzen.
- Sie ist eine PoC mit asiatischen Gesichtszügen. Das liegt daran, dass ihr Vater aus Ghana kommt, und ihre Mutter aus China.
### Fawn
- **Name:** Quintana Fawn
- **Alter:** 29 Jahre
- **Beziehungen:** Sie schätzt die Aokis und die anderen Maids sehr. Ansonsten hält sie Kontakt zu einer Studienfreundin in den USA und ihrer Babička.
- **Wohnort:** In einer eher größeren Wohnung irgendwo im Dorf.
- **Arbeit:** Sie ist Maid in der Aoki-Villa.
- **Rasse:** Mensch
- **Bildung:** Sie ist gebürtige Tschechin und hat in Tschechien Buchwissenschaften studiert.
- Bevor sie zur Aoki-Villa gekommen ist, hat sie auf einem Weingut in Frankreich gearbeitet. Deshalb versteht sie was Service.
- Auffällig an ihr ist ihr fast unnatürlich großer Busen, weshalb sich die anderen Maids zuerst wundern, ob sie damit überhaupt schwere Dinge heben kann.
- In ihrer Freizeit ist Fawn ein Bücherwurm. Sie ist sehr gut belesen, und kann bei Diskussionen zu eigentlich jeder klassichen Literatur mitmischen, egal ob Dante, Homer, Orwell, Machiavelli, Thomas Mann, oder ähnliches.
- Sie hat ein ausgeprägtes Nachtleben. Selbst bezeichnet sie sich als "Party-Luder", und ist auch oft in Discotheken und ähnlichen Etablissements anzutreffen.
- Fawn mag es, sich die Haare grün zu färben. Dabei benutzt sie die selben Mittel wie Espresso.
### Nebencharaktere
#### Kaede
- **Name:** Kaede Teien
- **Alter:** 50 Jahre
- **Beziehungen:** Sie ist zwar nach wie vor verheiratet mit Alexandra Aoki, hatte aber eine Affäre mit Leena, wobei ein Kind entstanden ist. Kaede hat beschlossen, für dieses Kind Verantwortung zu übernehmen, weshalb sie nach Finnland ausgewandert ist.
- **Wohnort:** Helsinki, Finnland
- **Arbeit:** Sie war früher die Ober-Maid in der Aoki-Villa. Nun ist sie in Finnland, aktuell arbeitslos, aber bemüht sich die Sprache zu lernen.
- **Rasse:** Mensch
- **Bildung:** Kaede hat (damals noch als Tsukasa) in Japan eine spezielle Schule für Archivare besucht, und dort einen guten Abschluss erzielt.
- In der Verwaltung des Dorfes galt Kaede früher als "der Hausdrache" der Villa. Sie schaut definitiv streng drin, und ist auch streng zu den anderen Maids, aber ebenso hat sie "ein Herz aus Gold"
- Kaede ist transsexuell - sie ist als Mann zur Welt gekommen. Früher hieß sie "Tsukasa Teien" und ist ein Japan aufgewachsen.
- Als Kaede eine Schulung in Grönland besucht hatte, hatte sie dort eine Affäre mit einer Finnin namens Leena.
### Leena
- **Name:** Leena ?
- **Alter:** 28 Jahre
- **Beziehungen:** Sie hatte eine sexuelle Affäre mit Kaede wobei ein Kind entstanden ist.
- **Wohnort:** Helsinki, Finnland
- **Arbeit:** Sie arbeitet im Archiv einer Universität in Helsinki wird aber bald in Mutterschutz gehen.
- **Rasse:** Mensch
- **Bildung:** Sie hat ein finnisches Ylioppilastutkinto, hat aber nicht weiter studiert, bevor sie angefangen hat zu arbeiten.
- Leena ist eher ruhig.
- Leena spricht nur finnisch und englisch, letzteres aber auch nur ungerne, weshalb sie Kaede tatkräftig beim lernen unterstützt.
#### Herr Moreau
- **Name:** Vorname unbekannt, alle nennen ihn nur Herr Moreau.
- **Alter:** Unbekannt, aber definitiv über 60.
- **Beziehungen:** Er ist der Chef von Sophia, und nennt sie "das Mädchen mit den goldenen Händen." Er ist mehr als zufrieden mit ihrer Mitarbeit im Laden.
- **Wohnort:** Irgendwo an der französischen Grenze des Dorfes
- **Arbeit:** Er führt den einzigen Elektroladen des Dorfes, wo er allerlei verkauft. Von obskuren Ersatzteilen, alte Schreibmaschinen, moderne Flachbildfernseher, Kühlschränke, oder die neusten Videospiele - wenn es elektronisch ist, hat er es in seinem Laden oder kann es besorgen. Da es der einzige Elektroladen im Dorf ist, nimmt er auch Reperaturaufträge an.
- **Rasse:** Mensch
#### Benoît
- **Name:** Vorname unbekannt, alle nennen ihn nur Benoít.
- **Alter:** Ende 20.
- **Beziehungen:** Er ist ein Arbeitskollege von Alpha Aoki bei einer kleinen Schweizer Bank. Er hat ein sexuelles, aber kein romantisches Interesse an Alpha Aoki. (was sie im laufe der Handlung zu ihrem Vorteil nutzen wird.)
- **Wohnort:** In einer luxoriösen Penthouse-Wohnung irgendwo im Schweizer Kanton Wallis.
- **Arbeit:** Er ist ein Investmentbanker in der selben kleinen Schweizer Bank, in der auch Alpha arbeitet.
- **Rasse:** Mensch
## Das Dorf
- **Name:** Das Dorf hat keinen Namen. Alle Bewohner nennen es nur "unser Dorf"
- Das Dorf ist staatenlos. Es gehört nicht zur Schweiz, nicht zu Italien, und auch nicht zu Frankreich.
- Die Bewohner sehen sich nicht als Schweizer, nicht als Italiener, und auch nicht als Franzosen, auch wenn viele der Bewohner aus diesen Ländern kommen.
- Das Dorf besteht lange genug, dass es Bewohner gibt, die keine Einwanderer sind, sondern Dorfbewohner in dritter oder vierter Generation sind.
- Das Dorf hat einen kleinen Bahnhof, über den es per ÖPNV gut an die Nachbarländer angebunden ist.
- Das Dorf hat kein formelles Schulsystem. Stattdessen gibt es ein Gemeinschaftslernzentrum, in dem Kinder und Jungendlichen aller Altersklassen gemeinsam lernen.
- Strom und Wasserversorung gibt es, mit einer Mischung aus Solar, Dieselgeneratoren und ein paar Goodwill-Verträgen mit den Nachbarländern.
- Das Dorf hat keine Internetverbindung, da sich Swisscom, TIM und Orange nicht einig darüber sind, wer für das Dorf zuständig ist.
- Folglich gibt es auch kein Telefon- oder Handynetz, außer ein internes, über das sich die Dorfbewohner nur gegenseitig anrufen können.
- Das Dorf verfügt über eine hohe Population an Katzen und Bergziegen. Hunde sind eher die Ausnahme.
- Um trotzdem nicht den modernen digitalen Medien hinherherzuhinken, haben sich die Dorfbewohner selbst eine Infrastruktur geschaffen, welche sie "Alpenlink" nennen.
- Das Dorf führt über eine Bibliothek, die alle "das Archiv" nennen. Ein Gesetz des Dorfes besagt, dass alle Medien die in das Dorf ein- oder ausgeführt werden vom Archiv gesichtet werden müssen, was in der Praxis heißt, dass das Archiv Kopien anfertigt.
- Unter den älteren Dorfbewohnern gibt es ein Sprichwort: "Man kann das Dorf zwar verlassen, aber das Dorf selber wird einen niemals verlassen."
## Alpenlink
- Alpenlink ist die digitale Infrastruktur des Dorfes.
- Dienste im Alpenlink:
- PBX - ein internes Telefonsystem, damit die Dorfbewohner sich gegenseitig anrufen können.
- Mastodon: eine interne Instanz, damit es im Dorf Social Media gibt. Da es im Dorf keine Internetverbindung gibt, förderiert diese Instanz nicht mit anderen.
- Peertube: Auch eine Interne Instanz, damit es im Dorf einen Ersatz für YouTube gibt. Da es im Dorf keine Internetverbindung gibt, förderiert diese Instanz nicht mit anderen.
- Forum: Ähnelt einem Internetforum, auf dem sich die Dorfbewohner über allerlei austauschen.
- Landing Page: Eine Startseite auf der die Dorfverwaltung über Neuigkeiten informiert.
- Wiki: Eine Dokumentation über alles, was es über das Dorf zu wissen gibt. Von einer Seite über die Öffnungszeiten der Bäckerei am Plaza, bis zur Dokumentation der Anschlüsse der Stromtransformatoren ist hier alles drin.
- DVB-NIP: Der TV Service des Dorfes. Hier gibt es neben den Programmen der Nachbarländer auch das Lokalprogramm des Dorfes, über das das Archiv des Dorfes auch Zugang zu vielen seiner gesichteten Medien gibt.
- App-Store: Für Smartphones gibt es einen Alpenlink-spezifischen App-Store in dem es dorfspezifische Apps (z.B. einen Abfallkalender, oder eine App für Ziegenpartenschaften)
- Da es keine Telefonleitungen im Boden gibt, funktioniert Alpenlink technisch so, dass Netzwerkkabel von Dach-zu-Dach gelegt wurden.
- An manchen Häusern sind auch Outdoor-Access-Points befestigt.
- Sophia hat im Alter von 14 Jahren mit ihrer damaligen Ex-Freundin den Proof-of-Concept für das Alpenlink aufgebaut, und dafür haben die beiden von der Dorfverwaltung einen Preis für digitale Souveränität aufgebaut.
## Die verschiedenen Rassen
### Menschen
- Ganz gewöhnliche Menschen, hier gibt es nichts besonderes was für ein Fantasy-Setting beachtet werden muss.
### Hexen
- menschlich anmutende, ausschließlich weibliche Wesen mit magischen Fähigkeiten.
- Bis zum Teenageralter altern Hexen ganz normal, wie Menschenkinder. Irgendwann zwischen dem 20. und 30. Lebensjahr hören die Körper von Hexen jedoch auf zu altern.
- Deshalb sehen Hexen immer aus wie junge, attraktive Frauen.
- Die genaue Lebenserwartung ist unbekannt.
- Hexen sind sesshaft, und leben fast ausschließlich im Hexenwald, außer sie beschließen aktiv, diesen zu verlassen.
### Menschenbruten
- Menschenbruten verfügen über eigene Magie, die jedoch anders funktioniert als die der Hexen.
- Während Hexen aktiv Magie anwenden müssen, haben die Menschenbruten eine für sie individuelle Fähigkeit, die sie passiv ihr ganzes Leben über begleitet.
- Menschenbruten haben exakt die selbe Lebenserwartung wie gewöhnliche Menschen.
- Beispiele für Fähigkeiten von Menschenbruten:
- Mit Tieren sprechen
- Farben riechen
- Das Alter eines Baumes erkennen, ohne ihn abzusägen.
- Den Fluss von Finanzen spüren (wie Alpha)
- etc.
### Hexenmeister
- menschlich anmutende, ausschließlich männliche Wesen mit magischen Fähigkeiten.
- Bis zum Teenageralter altern Hexen ganz normal, wie Menschenkinder. Irgendwann zwischen dem 20. und 30. Lebensjahr hören die Körper von Hexenmeistern jedoch auf zu altern.
- Deshalb sehen Hexen immer aus wie junge, attraktive Männer.
- Die genaue Lebenserwartung ist unbekannt.
- Die Hexenmeister sind ein wandernes Volk, sie bleiben selten für zwei Tage am selben Ort.
- Wenn eine Hexe einen Hexenmeister zur Welt bringt, geht dieser normalerweise mit der nächsten Gruppe Hexenmeistern mit, sobald er sicher selbstständig laufen kann.
## Hexenbiologie
- Lässt sich eine Hexe mit einem menschlichen Mann (oder ein Hexenmeister mit einer menschlichen Frau) statt mit einem Hexenmeister ein, und beschließt ein Kind zu bekommen, so entsteht eine Menschenbrut.
- Eine Hexe oder ein Hexenmeister kann nur dann geboren werden, wenn sich eine Hexe und ein Hexenmeister aufeinander einlassen.
- Da Hexen sesshaft, Hexenmeister aber wandernd sind, ist es für Hexen völlig normal, polyamourös zu sein. Aus diesem Grund nimmt Alexandra es auch leicht, als Kaede ihr gesteht, dass sie eine Affäre und dabei ein Kind gezeugt hatte.
## Was Alexandra so in ihrem Leben erlebt hat
- Alexandra ist im Jahre 1190 im Hexenwald, als Tochter einer hoch angesehenen Hexe namens Helena zur Welt gekommen.
- Damit hat sie die Zeit miterlebt, in der der Buchdruck, das elektrische Licht, und die Dampfmaschine erfunden wurden.
- Sie hat auch beide Weltkriege miterlebt, hat sich dabei jedoch in ein Land zurückgezogen, welches als sicher galt.
- Ihr absolutes Lieblingszeitalter sind die 1980er Jahre. Zu dieser Zeit war sie unter den Menschen so eine Art B-Promi, da in diversen Clubs und Diskotheken in Mitteleuropa als DJane aufgelegt hat. Sie war sehr gefragt und wurde sehr oft gebucht.
- 1990 hat sie festgestellt, dass sie von einem One-Night-Stand mit einem gewöhnlichen Menschen schwanger war. Deshalb hat sie angefangen nach einem Ort zu suchen, an dem sie ihre ungeborenen Zwillinge (Alpha und Sophia) sicher zur Welt bringen konnte. So kam sie ins Dorf.
---
## Was bisher geschah
- An einem Arbeitstag in der Bank hatte Alpha eine Eingebung. Ihr zusätzliches Sinnesorgan hat ihr eine unglaublich gute Investitionsmöglichkeit gezeigt.
- Alpha hat dies durchgerechnet. Sollten diese Investionen von Erfolg gekrönt sein, sind die Rendite in sehr kurzer Zeit unglaublich hoch. Falls nicht, würde man alles verlieren. Aber ihr zusätzlicher Sinn irrt sich absolut nie - also würden sie erfolgreich sein.
- Alpha bittet ihren Chef, einen Teil dort hinein zu investieren. Doch damit bekommt sie das allererste Mal so richtig Ärger mit ihm - die Bank wäre schließlich keine Zockerbude.
- Es gibt einen Kollegen bei der Bank, Benoît, von dem Alpha weiß, dass er auf sie steht, und dass er Zugriff auf die entsprechenden Systeme bei der Bank hat. Also beschließt sie, einmal in ihrem Leben ihre Würde als Frau über den Haufen zu schmeißen, und schläft mit ihm, um Zugriff zu bekommen.
- Wie immer, lag Alphas zusätzlicher Sinn absolut richtig. Die kleine Bank wurde über Nacht zu einem Global Player.
- Benoît erhält darauf hin eine sehr großzügige Bonuszahlung. Auch wenn er ein Playboy ist, auf der Arbeit ist er ähnlich, und tritt einen großen Teil davon an Alpha ab.
- Dieses Geld bringt Alpha zu einem Privatbankier, und lässt diesen weiter investieren. Durch ihren zusätzlichen Sinn schafft sie es so, dieses Geld schnell zu mehren.
- Ihre ersten Ausgaben sind: Ein teures Qipao (damit sie professionell aussieht), zwei MacBooks (eins für sich selber, eins für Sophia) und etwas gutes zu Essen von einem Imbiss. (Die erste erfüllende Mahlzeit, die Alpha und Sophia seit langem haben.)
- Nach mehreren Wochen hat Alpha genug Geld angehäuft, um die seit mehreren Jahren leerstehende Villa im Dorf zu kaufen. Dies wird fortan die Aoki-Villa sein.
- Die leerstehende Villa wurde bislang von Kaede, Espresso, Mireille und Ryouku gefplegt. Von nun an sind die vier die Maids der Zwillinge.
- Zu dem lässt Alpha in Finnland eine Briefkastenfirma gründen, über die sie dann in Zukunft all ihre Geschäfte/Investments tätigen wird. So entsteht "Aoki Holdings Oy"
- Ihr erstes Geschäft als "Aoki Holdings Oy" ist es, bei einem Satellitenbetrieber einen breitbandingen Transponder zur Exklusivnutzung durch Internet-Traffic der "Aoki Holdings Oy" anzumieten. Dies tut sie um in Zukunft möglichst unabhängig von ihrem alten Arbeitgeber und dem Privatbankier zu sein. Dass dies mehrere zehntausende Euros im Monat kostet, interessiert sie herzlich wenig.
- Da Alpha nur wenig von Technik versteht, überredet sie Sophia zum Hardware-Abverkauf des CERN mitzukommen. Dort erwerben sie eine beachtliche Menge an Netzwerkhardware, um die Villa komplett zu vernetzen.
- Schließlich wird eine große Satellitenanlage auf dem Gelände der Villa installiert. Damit sind die Aoki-Zwillinge (und die Maids) die einzigen Dorfbewohner die einen Internetzugang haben.
- Alpha nutzt diesen Internetzugang um nun komplett unabhängig weiter ihre Finanzgeschäfte durchzuführen. Doch das reicht ihr nicht.
- Also lässt Alpha Sophia eine Software entwickeln, die Daten aus dem Intenet scraped, und ihr zusätzliches Sinnesorgan visuell stimuliert.
- In einem leeren Raum der Villa wird ein Fernseher, der auf einem Rollwagen montiert ist, gestellt. Davor führt Alpha nun regelmäßig "Finanz-Meditationen" durch.
- Sophia sehnt sich danach, Alexandra zurück ins Dorf zu holen.
- Durch einen Kontakt bei der Bank, findet Alpha Alexandras neue Nummer raus. Gemeinsam rufen die Zwillinge sie an. Dank des Satelliteninternets können sie nun schließlich auch im Dorf nach draußen telefonieren.
- Wenige Wochen später zieht Alexandra mit in die Villa ein.
- Es ist sehr schnell klar, dass Alexandra und Kaede sich bestens verstehen.
- Kurz darauf beschlißen Alexandra und Kaede zu heiraten.
- So kommt es zur ersten queeren Hochzeit im Dorf.
- Da nun wieder Leben im Haus ist, und Kaede, Espresso und Mistral kaum hinterherkommen, bittet Kaede um Verstärkung für das Maid-Team.
- Alpha stimmt zu, und stellt daraufhin Fawn und Jade ein.
- Sophia äußert den Wunsch mal auf eine Anime-Convention zu gehen. Da früher immer das Geld dafür gefehlt hat, konnte sie das bisher nie. Aber jetzt da sie reich sind schon. Da Deutsch Sophias Muttersprache ist, würde sie als erste Con am liebsten eine deutschssprachige nehmen. Bis zur nächsten dauert es aber ein wenig.
- Die Maids nähen Sophia ein wunderbares Rei Ayanami Cosplay.
- Sie probiert es zum ersten mal zum jährlichen Dorffestival an.
- Auf dem Dorffestival lernt Sophia Valérie Beaumont kennen. Sie ist ebenfalls dort, als Asuka Langley Soryu verkleidet.
- Sophia und Valérie führen Impro auf der Bühne in ihrer jeweilgen Rolle auf.
- Dabei funkt es zwischen den beiden, und sie werden ein Paar.
- Sophia und Valérie verbringen eine Nacht auf dem Hof von Valéries Adoptiveltern.
- Wenig später bekommt Sophia eine Einladung von einem elitären Mädcheninternat, um dort für ein paar Wochen den Töchtern aus besseren Kreisen das progammieren beizubringen.
- Sophia stimmt zu. Valérie kommt mit und wird undercover als neue Schülerin eingeschleust, damit Sophia nicht alleine dort hin muss.
- Während der Freizeit der Schülerinnen, zieht Valérie unbeabsichtigt Aufmerksamkeit auf sich, da sich herausstellt, dass sie dadurch, dass sie auf einem Hof aufgewachsen ist, einen exzellenten Umgang mit Pferden beherrscht. In einem Polo-Spiel gewinnt sie praktisch im Alleingang. Nun steht Valérie vor dem Problem, zu verbergen, dass sie in Wirklichkeit nicht reich ist, sondern eine Bauerntochter ist.
- Sophia bringt ihren Schülerinnen währenddessen Ruby bei.
- Als Sophia wieder zuhause ist, äußert Kaede den Wunsch ein Seminar in Grönland zu besuchen. Alle sind damit einverstanden.
- Während der Schulung verbringt Kaede viel Zeit mit der Finnin Leena. Dabei kommen sie sich auch körperlich näher.
- Kaede hat Schuldgefühle, Alexandra betrogen zu haben.
- Zuhause beichtet Kaede Alexandra alles, aber aufgrund ihrer hexischen Natur hat Alexandra überhaupt kein Problem damit.
- Es wird Winter im Dorf
- Ein paar Tage später hätte Alpha einen wichtigen Geschäftstermin, diesen kann sie jedoch nicht wahrnehmen, da die Internetverbindung streikt.
- Das Problem ist schnell gefunden: Eine Katze hat im Brennpunkt der Antenne für das Sattelliteninternet Zuflucht vor dem Schnee gesucht.
- Die Aoki-Familie adoptiert die Katze und nennt sie Tennie.
- Wenige wochen später: Leena kontaktiert Kaede und teilt mit, dass sie schwanger ist.
- Kaede beichtet Alexadra erneut. Zu Kaedes Überraschung ist Alexandra auch hier völlig entspannt.
- Also erklärt Alexandra Kaede wie das mit den Hexen und Hexenmeistern funktioniert.
- In Alphas Meeting-Zimmer kommt es zu einer Telefonkonferenz zwischen Alexandra, Kaede und Leena.
- Die drei entscheiden gemeinsam, dass Kaede Verantwortung für das Kind übernehmen wird. Sie wird zu Leena nach Finnland ziehen.
- Alpha lässt über Aoki Holdings Oy ein Haus in Helsinki kaufen, in das Kaede und Leena einziehen, sobald Kaede in Finnland ist.
- Um sich besser mit Leena verständigen zu können, und auch aus Liebe zu dem noch ungeborenen Kind beschließt Kaede Finnisch zu lernen. Dafür wird sie eine Sprachschule für Einwanderer besuchen.
- In der ersten Unterrichtsstunde ist Kaede überrascht, dass Chloe vor ihr als Dozentin steht.
- Chloe und Kaede erkennen sich wieder, schließlich waren sie beide sehr lange im staatenlosen Dorf.
- Die beiden freunden sich an, und Chloe sucht sie auch öfters privat auf.
- Durch Zufall kommt ein Telefongespräch zwischen Kaede und Sophia zustande. Kaede stellt auf frei sprechen, und Chloe kommt dazu. Sie und Sophia haben sich vermisst.
- Sophia möchte Chloe besuchen kommen. Aber Chloe hat eine bessere Idee. Chloe will ins Dorf kommen. Das ist logistisch auch für sie sinnvoller. So kann sie einen Zwischenstopp in Paris einlegen, und dort ihren Freund und ihre Tochter zu besuchen.
- (Ab hier geht's weiter)

View File

@ -1,28 +0,0 @@
#pragma endian big
bitfield thirdByte
{
reserved : 4;
pes_data_packet_header_length : 4;
};
bitfield DataGroupHeader
{
data_group_id : 6;
data_group_version : 2;
data_group_link_number : 8;
last_data_group_link_number : 8;
};
struct DataGroup
{
u8 data_identifier;
u8 private_stream_id;
thirdByte thirdbyte;
DataGroupHeader header_bitfield;
u16 data_group_size;
u8 data_group_byte[data_group_size];
u16 crc16;
};
DataGroup header_bitfield @ 0x0000;

View File

@ -1,203 +0,0 @@
# Reuters WNE Packet Format
Format is little endian.
Common bytes:
- Byte 0: always 0x00
- Byte 1: "Packet family", always 0x01, 0x03 or 0xff
- Bytes 2-3: Packet length
- Bytes 4-7: Session ID. This changes for every news story.
This format looks suspciously like it's TLV based, but I couldn't figure out how exactly the T's and L's are laid out. (Perhaps they use 2 bytes?)
All multi-byte integers are little endian.
## About byte 1
Byte 1 determines what kind of packet we're dealing with.
| Byte 1 | Packet Type |
|--------|-----------------------------------------|
| 0x01 | Object transfer |
| 0x03 | Object announcement |
| 0xfe | Unknown, but seems to be related to ECC |
| 0xff | Object end marker |
## Packet familly 0x01 (Object transfer)
A packet of this type contains a single block of data.
| Byte Index | Description |
|------------|------------------------------|
| 0 | always 0x00 |
| 1 | always 0x01 |
| 2-3 | Packet length |
| 4-7 | Session ID |
| 8-11 | dependent on value of 12-15 |
| 12-13 | Payload description |
| 14-15 | Payload description argument |
| 16-end | Payload |
* When bytes 12-15 are all zeroes, the payload is raw data. In this case bytes 8-11 are the Block ID. To reconstruct the object, concatenate all bytes of Block ID 0, then Block ID 1, and so on...
* When byte 12 is 0x05, and byte 14 is 0x09, then the payload is prefixed with an additional 16-byte header. It's purpose is not yet known. The actual payload starts at byte 32 then.
* When the payload description argument equals the total packet length minus 15, then the payload is another encapsulated WNE packet. Start reading from byte 16 all over again. If this is the case, the following ECC rules apply:
### ECC rules
| Byte Index | Description |
|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 8 | ECC group ID |
| 9 | ? |
| 10 | always 0x00 ? |
| 11 | ECC block counter, incremented by one each packet. If this is 0x07, the ECC group is finished, and the group ID will be incremented by one during the next packet. |
| 12 | When an ECC group is finished with byte 11 being 0x07, this contains the number of blocks that are supposed to be in this just finished ECC group. |
| 13 | usually 0x00, sometimes 0x20, purpose not known |
| 14-15 | If byte 12 is 0, then Packet length minus 15, If byte 12 is 0x07, then ?
| 16-end | If ecc flags is 0x07, then this is an ECC payload, if ECC flags is 0x00, continue reading. |
## Packet family 0x03 (Object announcement)
A packet of this type contains information about the file/object which is about to be transferred, or is transferred at this time in 0x01 packets.
| Byte Index | Description |
|------------|---------------------------------------------------------------|
| 0 | always 0x00 |
| 1 | always 0x03 |
| 2-3 | Packet length |
| 4-7 | Session ID |
| 8-11 | Packet length - 8 |
| 12-15 | Packet length - 12 |
| 16-19 | always seems to be 0x00000000 |
| 20-23 | always seems to be 0x10000000 |
| 24-27 | always seems to be 0x02000070 |
| 28-31 | always seems to be 0x00000000 |
| 32-35 | always seems to be 0x97120a00 |
| 36-39 | always seems to be 0x00000000 |
| 40 | specifies a subformat. Observed values here are 0x02 and 0x09 |
### When byte 40 is 0x09
This indicates that the following object transfer does not contain a file, but a series of further encapsulated WNE packets. Those can be read using the same technique/structure.
### When byte 40 is 0x02
This indicates that the following object transfer contains a file.
| Byte Index | Description |
|-------------|---------------------------------------------------|
| 44-45 | Packet length - 44 |
| 46-55 | unknown |
| 55-56 | size of each block (usually 1408, but may differ) |
| 57-63 | unknown |
| 64-67 | number of blocks in this object |
| 68-71 | unknown |
| 72-75 | also number of blocks in this object |
| 76-84 | unknown |
| 85-n | UTF-8 null terminated source file name |
| n+0 - n+54 | unknown |
| n+55 - n+59 | file length in bytes |
| n+60 - n+71 | unknown |
| n+72 - m | UTF-8 null terminated destination file name |
| m - end | unknown |
## Packet family 0xff (Object end marker)
When a packet of this type is encountered, the object transfer is complete, and the packets can be assembled.
These packets may appear multiple times,
Sometimes these packets are stuffed with multiple 0x00 bytes.

View File

@ -1 +0,0 @@
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes sis.xsd /namespace:Voile.Patchouli.Dvb.Sis.Model

File diff suppressed because it is too large Load Diff

View File

@ -1,388 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DSACI">
<xs:complexType>
<xs:sequence>
<xs:element name="global_configuration" type="type_global_configuration" />
<xs:element name="input_configuration" type="type_input_configuration" />
<xs:element name="remultiplexing" type="type_remultiplexing"/>
<xs:element name="output_processing" type="type_output_processing"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- type_global_configuration -->
<xs:complexType name="type_global_configuration">
<xs:sequence>
<xs:element name="current_DSA_group_id" type="xs:int"/>
<xs:element name="global_version_number" type="type_version_number"/>
<xs:element name="global_application_time" type="xs:int"/>
<xs:element name="SIS_edition" type="type_SIS_edition"/>
</xs:sequence>
</xs:complexType>
<!-- type_SIS_edition -->
<xs:complexType name="type_SIS_edition">
<xs:sequence>
<xs:element name="major" type="xs:int"/>
<xs:element name="middle" type="xs:int"/>
<xs:element name="minor" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<!-- type_input_configuration -->
<xs:complexType name="type_input_configuration">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="1" name="input" type="type_input_parent" />
</xs:sequence>
</xs:complexType>
<!-- type_input_parent: number of instances equals number of defined inputs -->
<xs:complexType name="type_input_parent">
<xs:sequence>
<xs:element name="input_TS_id" type="xs:int"/>
<xs:element name="input_ON_id" type="xs:int"/>
<xs:element name="source_id" type="xs:int"/>
<xs:element name="PMT_PID_SIS_service" type="type_pid"/>
<xs:element name="Primary_SIS_Service_Flag" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
<!-- type_remultiplexing -->
<xs:complexType name="type_remultiplexing">
<xs:sequence>
<xs:element name="output_TS" type= "type_output_TS" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- type_output_TS: number of instances equals number of defined output TS -->
<xs:complexType name="type_output_TS">
<xs:sequence>
<xs:element name="PLP_id" minOccurs="0" maxOccurs="1" type="xs:int"/>
<xs:element name="output_TS_id" type="xs:int"/>
<xs:element name="output_ON_id" type="xs:int"/>
<xs:element name="pid_processing" type= "type_pid_processing"/>
<xs:element name="service_pmt_processing" type="type_service_pmt_processing"/>
<xs:element name="psisi_processing" type="type_psisi_processing_mode"/>
<xs:element name="Nsteps_to_live" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<!-- type_pid_processing -->
<xs:complexType name="type_pid_processing">
<xs:sequence>
<xs:element name="pid" type="type_pid_proc" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- type_pid_proc: number of instances equals number of defined output pid -->
<xs:complexType name="type_pid_proc">
<xs:sequence>
<xs:element name="source_id" type="xs:int"/>
<xs:element name="input_PID" type="type_pid"/>
<xs:element name="output_PID" type="type_pid"/>
</xs:sequence>
</xs:complexType>
<!-- type_service_pmt_processing -->
<xs:complexType name="type_service_pmt_processing">
<xs:sequence>
<xs:element name="service" type="type_service" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- type_service: number of instances equals number of defined service in an output TS -->
<xs:complexType name="type_service">
<xs:sequence>
<xs:element name="source_id" type="xs:int"/>
<xs:element name="input_service_id" type="xs:int"/>
<xs:element name="output_service_id" type="xs:int"/>
<xs:element name="output_service_name" type="xs:string"/>
<xs:element name="output_provider_name" type="xs:string"/>
<xs:element name="eit_schedule_flag" type="xs:boolean"/>
<xs:element name="eit_present_following_flag" type="xs:boolean"/>
<xs:element name="running_status" type="xs:int"/>
<xs:element name="free_ca_mode" type="xs:int"/>
<xs:element name="output_PMT_PID" type="type_pid"/>
<xs:element name="pmt_processing_mode" type="type_pmt_processing_mode"/>
</xs:sequence>
</xs:complexType>
<!-- type_pmt_processing_mode -->
<xs:complexType name="type_pmt_processing_mode">
<xs:choice>
<xs:element name="pmt_passthrough" type="pmt_passthrough_processing"/>
<xs:element name="pmt_patching" type="pmt_patching_processing"/>
<xs:element name="pmt_regeneration" type="pmt_regeneration_processing"/>
</xs:choice>
</xs:complexType>
<!-- pmt_passthrough_processing -->
<xs:simpleType name="pmt_passthrough_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- pmt_patching_processing -->
<xs:complexType name="pmt_patching_processing">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="ECM" type="type_ECM"/>
</xs:sequence>
</xs:complexType>
<!-- pmt_regeneration_processing -->
<xs:complexType name="pmt_regeneration_processing">
<xs:sequence>
<xs:element name="table_repetition_period" type="xs:int"/>
<xs:element name="offset" type="xs:int"/>
<xs:element name="PCR_PID" type="type_pid"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="output_pid" type="type_pid"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="ECM" type="type_ECM"/>
</xs:sequence>
</xs:complexType>
<!-- type_ECM -->
<xs:complexType name="type_ECM">
<xs:sequence>
<xs:element name="CAS_id" type="xs:int"/>
<xs:element name="output_ECM_PID" type="type_pid"/>
</xs:sequence>
</xs:complexType>
<!-- type_psisi_processing_mode -->
<xs:complexType name="type_psisi_processing_mode">
<xs:sequence>
<xs:element name="pat" type="type_pat_processing_mode"/>
<xs:element name="cat" type="type_cat_processing_mode"/>
<xs:element name="sdt_bat" type="type_sdt_bat_processing_mode"/>
<xs:element name="eit" type="type_eit_processing_mode"/>
</xs:sequence>
</xs:complexType>
<!-- type_pat_processing_mode -->
<xs:complexType name="type_pat_processing_mode">
<xs:choice>
<xs:element name="pat_passthrough" type="pat_passthrough_processing"/>
<xs:element name="pat_patching" type="pat_patching_processing"/>
<xs:element name="pat_regeneration" type="pat_regeneration_processing"/>
</xs:choice>
</xs:complexType>
<!-- pat_passthrough_processing -->
<xs:simpleType name="pat_passthrough_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- pat_patching_processing -->
<xs:simpleType name="pat_patching_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- pat_regeneration_processing -->
<xs:complexType name="pat_regeneration_processing">
<xs:sequence>
<xs:element name="table_repetition_period" type="xs:int"/>
<xs:element name="offset" type="xs:int"/>
<xs:element name="PAT_version_number" type="type_version_number"/>
</xs:sequence>
</xs:complexType>
<!-- type_cat_processing_mode -->
<xs:complexType name="type_cat_processing_mode">
<xs:choice>
<xs:element name="cat_stopping" type="cat_stopping_processing"/>
<xs:element name="cat_passthrough" type="cat_passthrough_processing"/>
<xs:element name="cat_patching" type="cat_patching_processing"/>
<xs:element name="cat_regeneration" type="cat_regeneration_processing"/>
</xs:choice>
</xs:complexType>
<!-- cat_stopping_processing -->
<xs:simpleType name="cat_stopping_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- cat_passthrough_processing -->
<xs:simpleType name="cat_passthrough_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- cat_patching_processing -->
<xs:complexType name="cat_patching_processing">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="ca_provider" type="type_ca_provider"/>
</xs:sequence>
</xs:complexType>
<!-- cat_regeneration_processing -->
<xs:complexType name="cat_regeneration_processing">
<xs:sequence>
<xs:element name="table_repetition_period" type="xs:int"/>
<xs:element name="offset" type="xs:int"/>
<xs:element name="CAT_version_number" type="type_version_number"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="ca_provider" type="type_ca_provider"/>
</xs:sequence>
</xs:complexType>
<!-- ca_provider: number of instances equals number of output EMM_PIDs -->
<xs:complexType name="type_ca_provider">
<xs:sequence>
<xs:element name="CAS_id" type="xs:int"/>
<xs:element name="output_EMM_PID" type="type_pid"/>
</xs:sequence>
</xs:complexType>
<!-- type_sdt_processing_mode -->
<xs:complexType name="type_sdt_bat_processing_mode">
<xs:choice>
<xs:element name="sdt_passthrough" type="sdt_passthrough_processing"/>
<xs:element name="sdt_patching" type="sdt_patching_processing"/>
<xs:element name="sdt_regeneration" type="sdt_regeneration_processing"/>
</xs:choice>
</xs:complexType>
<!-- sdt_passthrough_processing -->
<xs:simpleType name="sdt_passthrough_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- sdt_patching_processing -->
<xs:complexType name="sdt_patching_processing">
<xs:sequence>
<xs:element name="sdt_crossreferencing_flag" type="xs:boolean"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="bouquet" type="type_bouquet"/>
</xs:sequence>
</xs:complexType>
<!-- sdt_regeneration_processing -->
<xs:complexType name="sdt_regeneration_processing">
<xs:sequence>
<xs:element name="sdt_actual_period" type="xs:int"/>
<xs:element name="M_actual" type="xs:int"/>
<xs:element name="offset" type="xs:int"/>
<xs:element name="sdt_actual_version_number" type="xs:int"/>
<xs:element name="sdt_crossreferencing_flag" type="xs:boolean"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="bouquet" type="type_bouquet"/>
</xs:sequence>
</xs:complexType>
<!-- other_mux: number of instances equals number of defined other muxes -->
<xs:complexType name="type_other_mux">
<xs:sequence>
<xs:element name="other_DSA_group_id" type="xs:int"/>
<xs:element name="DSACI_PID" type="type_pid"/>
<xs:element name="source_id" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<!-- type_bouquet -->
<xs:complexType name="type_bouquet">
<xs:sequence>
<xs:element name="source_id" type="xs:int"/>
<xs:element name="input_bouquet_id" type="xs:int"/>
<xs:element name="terrestrial_bouquet_id" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<!-- type_eit_processing_mode -->
<xs:complexType name="type_eit_processing_mode">
<xs:choice>
<xs:element name="eit_passthrough" type="eit_passthrough_processing"/>
<xs:element name="eit_patching" type="eit_patching_processing"/>
<xs:element name="eit_regeneration" type="eit_regeneration_processing"/>
</xs:choice>
</xs:complexType>
<!-- eit_passthrough_processing -->
<xs:simpleType name="eit_passthrough_processing">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- eit_patching_processing -->
<xs:complexType name="eit_patching_processing">
<xs:sequence>
<xs:element name="eit_crossreferencing_flag" type="xs:boolean"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
</xs:sequence>
</xs:complexType>
<!-- eit_regeneration_processing -->
<xs:complexType name="eit_regeneration_processing">
<xs:sequence>
<xs:element name="eit_pf_actual_period" type="xs:int"/>
<xs:element name="eit_pf_other_period" type="xs:int"/>
<xs:element name="eit_sch_1stday_actual_period" type="xs:int"/>
<xs:element name="eit_sch_1stday_other_period" type="xs:int"/>
<xs:element name="eit_sch_2nd_8th_actual_period" type="xs:int"/>
<xs:element name="eit_sch_2nd_8th_other_period" type="xs:int"/>
<xs:element name="eit_sch_sup_8th_actual_period" type="xs:int"/>
<xs:element name="eit_sch_sup_8th_other_period" type="xs:int"/>
<xs:element name="eit_insertion_window_duration" type="xs:int"/>
<xs:element name="eit_cross_referencing_flag" type="xs:boolean"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="DTT_only_service"
type="type_DTT_only_service"/>
</xs:sequence>
</xs:complexType>
<!-- DTT_only_service: number of instances equals number of defined DTT only service -->
<xs:complexType name="type_DTT_only_service">
<xs:sequence>
<xs:element name="DTT_only_service_id" type="xs:int"/>
<xs:element name="input_EIT_PID" type="type_pid"/>
<xs:element name="source_id" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<!-- type_output_processing -->
<xs:complexType name="type_output_processing">
<xs:sequence>
<xs:element name="terrestrial_standard_generation"
type="type_terrestrial_standard_generation" />
</xs:sequence>
</xs:complexType>
<!-- type_terrestrial_standard -->
<xs:complexType name="type_terrestrial_standard_generation">
<xs:choice>
<xs:element name="dvb_t" type="dvb_t_standard"/>
<xs:element name="dvb_t2" type="dvb_t2_standard"/>
</xs:choice>
</xs:complexType>
<!-- dvb_t_standard -->
<xs:simpleType name="dvb_t_standard">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<!-- dvb_t2_standard -->
<xs:complexType name="dvb_t2_standard">
<xs:sequence>
<xs:element name="output_T2_MI_PID" type="type_pid"/>
<xs:element name="output_T2_MI_stream_id" type="xs:int"/>
<xs:element name="output_rate" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="0" name="L2_signalling" type="type_L2_signalling"/>
</xs:sequence>
</xs:complexType>
<!-- L2_signalling -->
<xs:complexType name="type_L2_signalling">
<xs:sequence>
<xs:element name="output_TS_id" type="xs:int"/>
<xs:element name="output_ON_id" type="xs:int"/>
<xs:element name="output_L2_service_id" type="xs:int"/>
<xs:element name="output_L2_service_provider_name" type="xs:string"/>
<xs:element name="output_L2_service_name" type="xs:string"/>
<xs:element name="output_L2_PCR_PID" type="type_pid"/>
<xs:element name="output_L2_PMT_PID" type="type_pid"/>
</xs:sequence>
</xs:complexType>
<!-- Other types -->
<xs:simpleType name="type_version_number">
<xs:restriction base="xs:int">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="31"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="type_pid">
<xs:restriction base="xs:int">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="8191"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

View File

@ -1,22 +0,0 @@
BITRATE=6000000
PCR_DISTANCE=6000
PCR_PID=1001
tsp -v -b $BITRATE \
-I null \
-P regulate --packet-burst 14 \
-P filter --every $PCR_DISTANCE --set-label 1 \
-P craft --only-label 1 --pid $PCR_PID --no-payload --pcr 0 \
-P continuity --pid $PCR_PID --fix \
-P pcradjust --pid $PCR_PID \
-P pat -c -a 1/1000 \
-P pmt -c -i 1 --pcr-pid $PCR_PID -p 1000 -a 1002/0x0d -a 1003/0x0d -a 1004/0x0d \
--add-stream-identifier --set-data-broadcast-id 1002/5 \
--set-data-broadcast-id 1003/5 --set-data-broadcast-id 1004/5 \
-P inject tdt.xml --pid 0x14 --bitrate 2000 --stuffing \
-P timeref --system-synchronous \
-P mpeinject -p 1002 -l 127.0.0.2 2000 --max-queue 8192 \
-P mpeinject -p 1003 -l 127.0.0.2 3000 --max-queue 8192 \
-P history \
-P until -s 60 \
-O file --max-size 100000000 experiment2-clean-60s.ts

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<tsduck>
<TDT UTC_time="1984-01-01 00:13:37"/>
</tsduck>

View File

@ -1,11 +0,0 @@
tsp -b 3248000 -v ^
-I file astra1_11604v_wdr_b.ts ^
-P filter --pid 0x1fff --set-label 2 ^
-P filter --only-label 2 --every 100 --set-label 1 ^
-P craft --only-label 1 --pid 101 --no-payload --pcr 0 ^
-P continuity --pid 101 ^
-P pcradjust --pid 101 ^
-P pat -c -a 1/100 ^
-P pmt -p 100 -c -i 1 -a 0x0bb8/0xd --set-data-broadcast-id 0x0bb8/5 -a 101/0x82 ^
-P history ^
-O file astra1_11604v_wdr_b_patched.ts

View File

@ -7,16 +7,12 @@ the following Signalling applies:
|Stream Type|Interpretation | |Stream Type|Interpretation |
|-----------|-----------------------------------| |-----------|-----------------------------------|
|0x80 |STiD135 GS/GSE Packets | |0x80 |TBS 6903-X GSE Packets |
|0x81 |AC-3 Audio | |0x81 |AC-3 Audio |
|0x82 |PID only used for PCR, no payloads | |0x82 |PID only used for PCR |
|0x83 |AC-3 True HD Audio | |0x83 |AC-3 True HD Audio |
|0x84 |AC-3+ Audio | |0x84 |AC-3+ Audio |
|0x85 |DTS Audio | |0x85 |ULE (RFC 4326) |
|0x86 |SCTE 35 Splice Info |
|0x87 |ATSC Enhanced-AC-3 Audio |
|0x88 |ULE (RFC 4326) |
|0x91 |A52b/AC-3 Audio |
## Descriptors: ## Descriptors:

View File

@ -19,14 +19,3 @@ These will have IP packets forwarded to.
|--|-----------| |--|-----------|
| 1|PCAP Writer| | 1|PCAP Writer|
| 2|Discard | | 2|Discard |
| 3|Blackhole |
#Network Types
These identify sources from which a network packet may come from.
|ID|Type |
|--|----------|
| 0|Reserved |
| 1|ATSC3 PLP |
| 2|MPEG-2 PID|
| 3|DVB MIS |
| 4|AAL5 |

View File

@ -17,21 +17,10 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Linq; using System.Xml.Linq;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
using skyscraper5.Skyscraper.Equipment; using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader; using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper8.GSE;
using skyscraper8.Skyscraper.Drawing; using skyscraper8.Skyscraper.Drawing;
using skyscraper8.Skyscraper.FrequencyListGenerator; using skyscraper8.Skyscraper.FrequencyListGenerator;
using skyscraper8.Skyscraper.Scraper;
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
using skyscraper8.GSE.GSE;
using skyscraper8.DvbNip.UiIntegration;
using skyscraper8.DvbNip;
using moe.yo3explorer.skyscraper8.DVBI.Model;
using skyscraper8.Ietf.FLUTE;
using skyscraper8.Ses;
namespace skyscraper5.UI.Overrides namespace skyscraper5.UI.Overrides
{ {
@ -138,7 +127,7 @@ namespace skyscraper5.UI.Overrides
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbEntity lnbType) public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbType lnbType)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -218,43 +207,8 @@ namespace skyscraper5.UI.Overrides
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void NotifyNit(NitNetwork nitNetwork)
{
throw new NotImplementedException();
}
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
{
throw new NotImplementedException();
}
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
{
throw new NotImplementedException();
}
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
{
throw new NotImplementedException();
}
public void OnBbframe(BBHeader bbHeader, byte[] payload)
{
throw new NotImplementedException();
}
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
{
throw new NotImplementedException();
}
public TaskQueue Tasks { get; set; } public TaskQueue Tasks { get; set; }
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
{
throw new NotImplementedException();
}
public void NotifyAit(AitApplication aitApplication) public void NotifyAit(AitApplication aitApplication)
{ {
SkyscraperUiNode applicationNode = form1.EnsureNodeExists("AIT", aitApplication.TryGetName()); SkyscraperUiNode applicationNode = form1.EnsureNodeExists("AIT", aitApplication.TryGetName());
@ -620,80 +574,5 @@ namespace skyscraper5.UI.Overrides
return String.Format("??? (Type 0x{0:X2})", (int)stream.StreamType); return String.Format("??? (Type 0x{0:X2})", (int)stream.StreamType);
} }
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
{
throw new NotImplementedException();
}
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
{
throw new NotImplementedException();
}
public void OnDvbNipFileArrival(FluteUiHandle fuh)
{
throw new NotImplementedException();
}
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier, MulticastGatewayConfigurationType multicastGatewayConfiguration)
{
throw new NotImplementedException();
}
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
{
throw new NotImplementedException();
}
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
{
throw new NotImplementedException();
}
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation, ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
{
throw new NotImplementedException();
}
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
{
throw new NotImplementedException();
}
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
{
throw new NotImplementedException();
}
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation, NetworkInformationFileType networkInformationFile)
{
throw new NotImplementedException();
}
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation, ServiceInformationFileType serviceInformationFile)
{
throw new NotImplementedException();
}
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
{
throw new NotImplementedException();
}
public void OnAstraSgtList(SgtList list)
{
throw new NotImplementedException();
}
public void OnAstraSgtService(SgtService child)
{
throw new NotImplementedException();
}
public void NotifyTransportStreamId(int tsid, int nid)
{
throw new NotImplementedException();
}
} }
} }

View File

@ -6,7 +6,6 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;

View File

@ -6,7 +6,6 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -28,8 +27,4 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
</ItemGroup>
</Project> </Project>

View File

@ -21,9 +21,9 @@ namespace skyscraper8.UI.MonoGame
public DataStorage DataStorage { get; set; } public DataStorage DataStorage { get; set; }
public ObjectStorage ObjectStorage { get; set; } public ObjectStorage ObjectStorage { get; set; }
public IGpsReceiver Gps { get; set; } public IGpsReceiver Gps { get; set; }
public List<SatellitePositionEntity> SatellitePositions { get; set; } public List<SatellitePosition> SatellitePositions { get; set; }
public List<LnbEntity> LnbTypes { get; set; } public List<LnbType> LnbTypes { get; set; }
public List<DishEntity> DishTypes { get; set; } public List<DishType> DishTypes { get; set; }
public ReadOnlyCollection<KeyValuePair<TunerFactoryIdAttribute, ITunerFactory>> AllTunerFactories { get; set; } public ReadOnlyCollection<KeyValuePair<TunerFactoryIdAttribute, ITunerFactory>> AllTunerFactories { get; set; }
public IStreamReader StreamReader { get; set; } public IStreamReader StreamReader { get; set; }
public List<TunerMetadata> Tuners { get; set; } public List<TunerMetadata> Tuners { get; set; }

View File

@ -1,3 +0,0 @@
{
"help":"https://go.microsoft.com/fwlink/?linkid=866610"
}

View File

@ -14,14 +14,13 @@ namespace SDL2Demo.Forms
internal class ConfigureDishTypes : IRenderable internal class ConfigureDishTypes : IRenderable
{ {
private readonly DataStorage _scraperStroage; private readonly DataStorage _scraperStroage;
private List<DishEntity> dishTypes; private List<DishType> dishTypes;
private string tableUuid; private string tableUuid;
private string manufacturer;
private string name; private string name;
private int diameter; private int diameter;
private DishShape shape; private DishShape shape;
public ConfigureDishTypes(DataStorage scraperStroage, List<DishEntity> dishTypes) public ConfigureDishTypes(DataStorage scraperStroage, List<DishType> dishTypes)
{ {
_scraperStroage = scraperStroage; _scraperStroage = scraperStroage;
this.dishTypes = dishTypes; this.dishTypes = dishTypes;
@ -38,14 +37,12 @@ namespace SDL2Demo.Forms
if (justSaved) if (justSaved)
{ {
name = ""; name = "";
manufacturer = "";
diameter = 0; diameter = 0;
shape = DishShape.Offset; shape = DishShape.Offset;
justSaved = false; justSaved = false;
} }
if (ImGui.TreeNode("Add Dish Type")) if (ImGui.TreeNode("Add Dish Type"))
{ {
ImGui.InputText("Manufacturer", ref manufacturer, 255);
ImGui.InputText("Name", ref name, 255); ImGui.InputText("Name", ref name, 255);
ImGui.InputInt("Diameter", ref diameter, 5, 10); ImGui.InputInt("Diameter", ref diameter, 5, 10);
@ -66,7 +63,7 @@ namespace SDL2Demo.Forms
ImGui.BeginDisabled(!SaveButtonEnabled()); ImGui.BeginDisabled(!SaveButtonEnabled());
if (ImGui.Button("Add")) if (ImGui.Button("Add"))
{ {
DishEntity newDish = new DishEntity(manufacturer, name, diameter, shape); DishType newDish = new DishType(name, diameter, shape);
dishTypes.Add(newDish); dishTypes.Add(newDish);
_scraperStroage.UiDishTypesAdd(newDish); _scraperStroage.UiDishTypesAdd(newDish);
justSaved = true; justSaved = true;
@ -87,7 +84,7 @@ namespace SDL2Demo.Forms
ImGui.TableSetColumnIndex(2); ImGui.TableSetColumnIndex(2);
ImGui.Text("Type"); ImGui.Text("Type");
foreach (DishEntity dishType in dishTypes) foreach (DishType dishType in dishTypes)
{ {
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableSetColumnIndex(0); ImGui.TableSetColumnIndex(0);
@ -123,7 +120,7 @@ namespace SDL2Demo.Forms
return false; return false;
} }
foreach (DishEntity dishType in dishTypes) foreach (DishType dishType in dishTypes)
{ {
if (dishType.Name.Equals(name)) if (dishType.Name.Equals(name))
return false; return false;

View File

@ -16,21 +16,19 @@ namespace SDL2Demo.Forms
internal class ConfigureLnbTypes : IRenderable internal class ConfigureLnbTypes : IRenderable
{ {
private readonly DataStorage _scraperStroage; private readonly DataStorage _scraperStroage;
private List<LnbEntity> lnbTypes; private List<LnbType> lnbTypes;
private string tableUuid; private string tableUuid;
private string lnbPopupUuid; private string lnbPopupUuid;
private string manufacturer;
private string name; private string name;
private int lof1, lof2, lofSw, minFreq, maxFreq; private int lof1, lof2, lofSw, minFreq, maxFreq;
public ConfigureLnbTypes(DataStorage scraperStroage, List<LnbEntity> lnbTypes) public ConfigureLnbTypes(DataStorage scraperStroage, List<LnbType> lnbTypes)
{ {
_scraperStroage = scraperStroage; _scraperStroage = scraperStroage;
this.lnbTypes = lnbTypes; this.lnbTypes = lnbTypes;
this.tableUuid = Guid.NewGuid().ToString(); this.tableUuid = Guid.NewGuid().ToString();
this.name = ""; this.name = "";
this.manufacturer = "";
this.lnbPopupUuid = Guid.NewGuid().ToString(); this.lnbPopupUuid = Guid.NewGuid().ToString();
} }
@ -41,8 +39,6 @@ namespace SDL2Demo.Forms
ImGui.Begin("Configure LNB Types", ref pOpen, windowFlags); ImGui.Begin("Configure LNB Types", ref pOpen, windowFlags);
if (ImGui.TreeNode("Add LNB Type")) if (ImGui.TreeNode("Add LNB Type"))
{ {
ImGui.InputText("Manufacturer", ref this.manufacturer, 64);
ImGui.SameLine();
ImGui.InputText("Name", ref name, 255); ImGui.InputText("Name", ref name, 255);
ImGui.InputInt("LOF1", ref lof1, 50, 100); ImGui.InputInt("LOF1", ref lof1, 50, 100);
@ -59,7 +55,7 @@ namespace SDL2Demo.Forms
ImGui.BeginDisabled(!SaveButtonEnabled()); ImGui.BeginDisabled(!SaveButtonEnabled());
if (ImGui.Button("Add")) if (ImGui.Button("Add"))
{ {
LnbEntity newLnb = new LnbEntity(manufacturer, name, lof1, lof2, lofSw, minFreq, maxFreq); LnbType newLnb = new LnbType(name, lof1, lof2, lofSw, minFreq, maxFreq);
lnbTypes.Add(newLnb); lnbTypes.Add(newLnb);
_scraperStroage.UiLnbTypesAdd(newLnb); _scraperStroage.UiLnbTypesAdd(newLnb);
} }
@ -102,7 +98,7 @@ namespace SDL2Demo.Forms
ImGui.TableSetColumnIndex(2); ImGui.TableSetColumnIndex(2);
ImGui.Text("Frequency Range"); ImGui.Text("Frequency Range");
foreach (LnbEntity lnbType in lnbTypes) foreach (LnbType lnbType in lnbTypes)
{ {
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableSetColumnIndex(0); ImGui.TableSetColumnIndex(0);
@ -140,7 +136,7 @@ namespace SDL2Demo.Forms
if (lof1 == 0) if (lof1 == 0)
return false; return false;
foreach (LnbEntity lnbType in lnbTypes) foreach (LnbType lnbType in lnbTypes)
{ {
if (lnbType.MinimumFrequency == minFreq && if (lnbType.MinimumFrequency == minFreq &&
lnbType.MaximumFrequency == maxFreq && lnbType.MaximumFrequency == maxFreq &&

View File

@ -10,9 +10,9 @@ namespace SDL2Demo.Forms
internal class ConfigureTunersWindow : IRenderable internal class ConfigureTunersWindow : IRenderable
{ {
private readonly DataStorage _scraperStroage; private readonly DataStorage _scraperStroage;
private List<SatellitePositionEntity> satPositions; private List<SatellitePosition> satPositions;
private List<LnbEntity> lnbTypes; private List<LnbType> lnbTypes;
private List<DishEntity> dishTypes; private List<DishType> dishTypes;
public ConfigureTunersWindow(List<TunerMetadata> tuners, DataStorage scraperStroage) public ConfigureTunersWindow(List<TunerMetadata> tuners, DataStorage scraperStroage)
{ {

View File

@ -8,14 +8,11 @@ using System.Reflection.Metadata.Ecma335;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ImGuiNET; using ImGuiNET;
using moe.yo3explorer.skyscraper8.DVBI.Model;
using SDL2Demo.Net; using SDL2Demo.Net;
using skyscraper5.Docsis; using skyscraper5.Docsis;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs; using skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs;
using skyscraper5.Dvb.Descriptors; using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model; using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
using skyscraper5.Mhp; using skyscraper5.Mhp;
using skyscraper5.Mhp.Descriptors; using skyscraper5.Mhp.Descriptors;
using skyscraper5.Mhp.Si; using skyscraper5.Mhp.Si;
@ -28,23 +25,11 @@ using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader; using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Net; using skyscraper5.Skyscraper.Net;
using skyscraper5.Skyscraper.Scraper; using skyscraper5.Skyscraper.Scraper;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.Skyscraper.FrequencyListGenerator; using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.T2MI.Packets;
using skyscraper5.Teletext.Wss; using skyscraper5.Teletext.Wss;
using skyscraper8.DvbNip;
using skyscraper8.DvbNip.UiIntegration;
using skyscraper8.DvbSis;
using skyscraper8.GSE;
using skyscraper8.GSE.GSE;
using skyscraper8.Ietf.FLUTE;
using skyscraper8.Ses;
using skyscraper8.Skyscraper.Drawing; using skyscraper8.Skyscraper.Drawing;
using skyscraper8.Skyscraper.FrequencyListGenerator; using skyscraper8.Skyscraper.FrequencyListGenerator;
using skyscraper8.Skyscraper.Scraper;
using skyscraper8.T2MI.Packets;
using testdrid.SdlWrapper; using testdrid.SdlWrapper;
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
namespace SDL2Demo.Forms namespace SDL2Demo.Forms
{ {
@ -566,11 +551,6 @@ namespace SDL2Demo.Forms
patEntry.pmt = result; patEntry.pmt = result;
} }
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
{
throw new NotImplementedException();
}
private string pmtTabBarUuid; private string pmtTabBarUuid;
public void RenderPmt() public void RenderPmt()
{ {
@ -1172,11 +1152,6 @@ namespace SDL2Demo.Forms
} }
} }
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
{
throw new NotImplementedException();
}
private void RenderDataCarousels() private void RenderDataCarousels()
{ {
if (dsmCcDisplay == null) if (dsmCcDisplay == null)
@ -2127,7 +2102,7 @@ namespace SDL2Demo.Forms
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult,LnbEntity lnbType) public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult,LnbType lnbType)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -2207,106 +2182,6 @@ namespace SDL2Demo.Forms
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void NotifyNit(NitNetwork nitNetwork)
{
throw new NotImplementedException();
}
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
{
throw new NotImplementedException();
}
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
{
throw new NotImplementedException();
}
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
{
throw new NotImplementedException();
}
public void OnBbframe(BBHeader bbHeader, byte[] payload)
{
throw new NotImplementedException();
}
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
{
throw new NotImplementedException();
}
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
{
throw new NotImplementedException();
}
public void OnDvbNipFileArrival(FluteUiHandle fuh)
{
throw new NotImplementedException();
}
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier,
MulticastGatewayConfigurationType multicastGatewayConfiguration)
{
throw new NotImplementedException();
}
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
{
throw new NotImplementedException();
}
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
{
throw new NotImplementedException();
}
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation,
ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
{
throw new NotImplementedException();
}
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1,
string serviceListId2)
{
throw new NotImplementedException();
}
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
{
throw new NotImplementedException();
}
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation,
NetworkInformationFileType networkInformationFile)
{
throw new NotImplementedException();
}
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation,
ServiceInformationFileType serviceInformationFile)
{
throw new NotImplementedException();
}
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
{
throw new NotImplementedException();
}
public void OnAstraSgtList(SgtList list)
{
throw new NotImplementedException();
}
public void OnAstraSgtService(SgtService child)
{
throw new NotImplementedException();
}
public TaskQueue Tasks { get; set; } public TaskQueue Tasks { get; set; }
private ushort? ResolveCaId(ProgramMapping patValuePmt, SdtCoordinate sdt) private ushort? ResolveCaId(ProgramMapping patValuePmt, SdtCoordinate sdt)
@ -2332,70 +2207,5 @@ namespace SDL2Demo.Forms
return null; return null;
} }
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
{
}
public void NotifyTransportStreamId(int tsid, int nid)
{
}
public void OnDvbSisCat(int sourcePid, SisCatContainer catContainer)
{
}
public void OnDvbSisEit(int sourcePid, SisEitContainer eitContainer)
{
}
public void OnDvbSisFti(int relatedPid, _0xF0_FramingTimingInformation fti)
{
}
public void OnDvbSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp)
{
}
public void OnDvbSisPat(int sourcePid, SisPatContainer patContainer)
{
}
public void OnDvbSisSdt(int sourcePid, SisSdtContainer sdtContainer)
{
}
public void OnDvbSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber,
Stream dsaci)
{
}
public void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer)
{
}
public void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer)
{
}
public void OnDvbSisTdt(int sourcePid, DateTime? utcTime)
{
}
public void OnRcs2Rmt(Rmt rmt)
{
}
} }
} }

View File

@ -24,7 +24,7 @@ namespace SDL2Demo.Forms
private string lnbPopupUuid; private string lnbPopupUuid;
private string memoryTableUuid; private string memoryTableUuid;
private List<SatellitePositionEntity> allPositions; private List<SatellitePosition> allPositions;
private readonly DataStorage _storage; private readonly DataStorage _storage;
@ -50,8 +50,8 @@ namespace SDL2Demo.Forms
if (allPositions.Count == 0) if (allPositions.Count == 0)
return true; return true;
int currentChecksum = SatellitePositionEntity.GetChecksum(degrees); int currentChecksum = SatellitePosition.GetChecksum(degrees, cardinalDirection);
foreach (SatellitePositionEntity satellitePosition in allPositions) foreach (SatellitePosition satellitePosition in allPositions)
{ {
if (currentChecksum == satellitePosition.Checksum) if (currentChecksum == satellitePosition.Checksum)
return false; return false;
@ -68,6 +68,9 @@ namespace SDL2Demo.Forms
{ {
ImGui.InputText("Name", ref name, 255); ImGui.InputText("Name", ref name, 255);
ImGui.InputFloat("Position", ref degrees, 0.1f); ImGui.InputFloat("Position", ref degrees, 0.1f);
ImGui.RadioButton("East", ref cardinalDirection, 0);
ImGui.SameLine();
ImGui.RadioButton("West", ref cardinalDirection, 1);
CheckBounds(); CheckBounds();
@ -75,7 +78,7 @@ namespace SDL2Demo.Forms
ImGui.BeginDisabled(!SaveButtonEnabled()); ImGui.BeginDisabled(!SaveButtonEnabled());
if (ImGui.Button("Add")) if (ImGui.Button("Add"))
{ {
SatellitePositionEntity newPosition = new SatellitePositionEntity(degrees, name); SatellitePosition newPosition = new SatellitePosition(degrees, cardinalDirection, name);
allPositions.Add(newPosition); allPositions.Add(newPosition);
_storage.UiSatellitesAdd(newPosition); _storage.UiSatellitesAdd(newPosition);
} }
@ -86,13 +89,13 @@ namespace SDL2Demo.Forms
ImGui.Separator(); ImGui.Separator();
ImGui.BeginTable(memoryTableUuid, 4); ImGui.BeginTable(memoryTableUuid, 4);
foreach (SatellitePositionEntity satellitePosition in allPositions) foreach (SatellitePosition satellitePosition in allPositions)
{ {
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableSetColumnIndex(0); ImGui.TableSetColumnIndex(0);
ImGui.Text(satellitePosition.name); ImGui.Text(satellitePosition.name);
ImGui.TableSetColumnIndex(1); ImGui.TableSetColumnIndex(1);
ImGui.Text(String.Format("{0:0.0}° {1}", satellitePosition.angle, satellitePosition.GetCardinalDirectionAsChar())); ImGui.Text(String.Format("{0:0.0}° {1}", satellitePosition.angle, satellitePosition.cardinalDirection == 0 ? "E" : "W"));
ImGui.TableSetColumnIndex(2); ImGui.TableSetColumnIndex(2);
ImGui.Text(""); ImGui.Text("");

View File

@ -33,7 +33,7 @@ namespace SDL2Demo.Jobs
public class BlindscanTarget public class BlindscanTarget
{ {
public BlindscanTarget(string name, int tunerIndex, STD_TYPE tunerStandard, int diseqcType, public BlindscanTarget(string name, int tunerIndex, STD_TYPE tunerStandard, int diseqcType,
SatellitePositionEntity satPosition, int satIndex, LnbEntity lnbType, PhysicalAddress tunerMetadataMacAddress) SatellitePosition satPosition, int satIndex, LnbType lnbType, PhysicalAddress tunerMetadataMacAddress)
{ {
this.name = name; this.name = name;
this.tunerIndex = tunerIndex; this.tunerIndex = tunerIndex;
@ -50,10 +50,10 @@ namespace SDL2Demo.Jobs
public int tunerIndex; public int tunerIndex;
public STD_TYPE tunerStandard; public STD_TYPE tunerStandard;
public int diseqcType; public int diseqcType;
public SatellitePositionEntity satPosition; public SatellitePosition satPosition;
public int satIndex; public int satIndex;
public string buttonUuid; public string buttonUuid;
public LnbEntity lnbType; public LnbType lnbType;
public readonly PhysicalAddress macAddress; public readonly PhysicalAddress macAddress;
public bool IsTorC() public bool IsTorC()
@ -84,7 +84,7 @@ namespace SDL2Demo.Jobs
private DbBlindscanJob jobInDb; private DbBlindscanJob jobInDb;
private IDbBlindscanJobStorage jobStorage; private IDbBlindscanJobStorage jobStorage;
public Blindscan(List<TunerMetadata> tuners, List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, DataStorage dataStorage) public Blindscan(List<TunerMetadata> tuners, List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, DataStorage dataStorage)
{ {
this.jobStorage = dataStorage; this.jobStorage = dataStorage;
continuationDataExists = jobStorage.TestForIncompleteJob(); continuationDataExists = jobStorage.TestForIncompleteJob();
@ -98,8 +98,8 @@ namespace SDL2Demo.Jobs
int numSatsFromDiseqcType = tunerMetadata.GetNumSatsFromDiseqcType(); int numSatsFromDiseqcType = tunerMetadata.GetNumSatsFromDiseqcType();
for (int i = 0; i < numSatsFromDiseqcType; i++) for (int i = 0; i < numSatsFromDiseqcType; i++)
{ {
SatellitePositionEntity satellitePosition = satellitePositions.Find(x => x.Checksum == tunerMetadata.Satellites[i]); SatellitePosition satellitePosition = satellitePositions.Find(x => x.Checksum == tunerMetadata.Satellites[i]);
LnbEntity lnbType = lnbTypes.Find(x => x.Id == tunerMetadata.Lnbs[i]); LnbType lnbType = lnbTypes.Find(x => x.Id == tunerMetadata.Lnbs[i]);
if (satellitePosition == null) if (satellitePosition == null)
continue; continue;
if (lnbType == null) if (lnbType == null)
@ -835,7 +835,7 @@ namespace SDL2Demo.Jobs
now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000, now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000,
blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000, blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000,
(int)(SelectedBlindscanTarget.satPosition.angle * 10), (int)(SelectedBlindscanTarget.satPosition.angle * 10),
SelectedBlindscanTarget.satPosition.GetCardinalDirectionAsChar()); SelectedBlindscanTarget.satPosition.cardinalDirection == 0 ? "E" : "W");
break; break;
case STD_TYPE.STD_DVBC: case STD_TYPE.STD_DVBC:
JobContext.Puppets[1].AutoMoveTo(blindscanResult.Position); JobContext.Puppets[1].AutoMoveTo(blindscanResult.Position);

View File

@ -31,10 +31,10 @@ namespace SDL2Demo.Jobs
private IDbBlindscanJobStorage jobStorage; private IDbBlindscanJobStorage jobStorage;
private List<TunerMetadata> tunerMetadataList; private List<TunerMetadata> tunerMetadataList;
private JobContext jobContext; private JobContext jobContext;
private List<SatellitePositionEntity> satellites; private List<SatellitePosition> satellites;
private List<LnbEntity> lnbs; private List<LnbType> lnbs;
public CoopBlindscan(List<TunerMetadata> tuners, List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, IDbBlindscanJobStorage jobStorage) public CoopBlindscan(List<TunerMetadata> tuners, List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, IDbBlindscanJobStorage jobStorage)
{ {
this.jobStorage = jobStorage; this.jobStorage = jobStorage;
this.tunerMetadataList = tuners.Where(x => x.Type == STD_TYPE.STD_DVBS || x.Type == STD_TYPE.STD_DVBS2).ToList(); this.tunerMetadataList = tuners.Where(x => x.Type == STD_TYPE.STD_DVBS || x.Type == STD_TYPE.STD_DVBS2).ToList();
@ -166,8 +166,8 @@ namespace SDL2Demo.Jobs
{ {
settingsWindowOpen = false; settingsWindowOpen = false;
int lnbIndex = tunerMetadataList[settingsWindowTunerAselection].Lnbs[settingsWindowDiseqc - 1]; int lnbIndex = tunerMetadataList[settingsWindowTunerAselection].Lnbs[settingsWindowDiseqc - 1];
LnbEntity lnb = lnbs.Find(x => x.Id == lnbIndex); LnbType lnb = lnbs.Find(x => x.Id == lnbIndex);
Configuration = new CoopBlindscanConfiguration(tunerMetadataList[settingsWindowTunerAselection], tunerMetadataList[settingsWindowTunerBselection], settingsWindowScanHorizontalLow, settingsWindowScanHorizontalHigh, settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh, settingsWindowDiseqc, settingsWindowSatellite, SatellitePositionEntity.FromChecksum(satellites[settingsWindowSatellite].Checksum), lnb, settingsWindowCaptureFile); Configuration = new CoopBlindscanConfiguration(tunerMetadataList[settingsWindowTunerAselection], tunerMetadataList[settingsWindowTunerBselection], settingsWindowScanHorizontalLow, settingsWindowScanHorizontalHigh, settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh, settingsWindowDiseqc, settingsWindowSatellite, SatellitePosition.FromChecksum(satellites[settingsWindowSatellite].Checksum), lnb, settingsWindowCaptureFile);
} }
ImGui.SameLine(); ImGui.SameLine();
@ -185,7 +185,7 @@ namespace SDL2Demo.Jobs
public class CoopBlindscanConfiguration public class CoopBlindscanConfiguration
{ {
public CoopBlindscanConfiguration(TunerMetadata tunerA, TunerMetadata tunerB, bool doHorizontalLow, bool doHorizontalHigh, bool doVerticalLow, bool doVerticalHigh, int diseqc, int satelliteId, SatellitePositionEntity direction, LnbEntity lnbType, bool recordingEnabled) public CoopBlindscanConfiguration(TunerMetadata tunerA, TunerMetadata tunerB, bool doHorizontalLow, bool doHorizontalHigh, bool doVerticalLow, bool doVerticalHigh, int diseqc, int satelliteId, SatellitePosition direction, LnbType lnbType, bool recordingEnabled)
{ {
TunerA = tunerA; TunerA = tunerA;
TunerB = tunerB; TunerB = tunerB;
@ -208,8 +208,8 @@ namespace SDL2Demo.Jobs
public bool DoVerticalHigh { get; } public bool DoVerticalHigh { get; }
public int Diseqc { get; } public int Diseqc { get; }
public int SatelliteId { get; } public int SatelliteId { get; }
public SatellitePositionEntity Direction { get; } public SatellitePosition Direction { get; }
public LnbEntity LnbType { get; } public LnbType LnbType { get; }
public bool RecordingEnabled { get; } public bool RecordingEnabled { get; }
} }
#endregion #endregion
@ -689,7 +689,7 @@ namespace SDL2Demo.Jobs
now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000, now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000,
blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000, blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000,
(int)(Configuration.Direction.angle * 10), (int)(Configuration.Direction.angle * 10),
Configuration.Direction.GetCardinalDirectionAsChar()); Configuration.Direction.cardinalDirection == 0 ? "E" : "W");
RunSkyscraper(blindscanResult); RunSkyscraper(blindscanResult);

View File

@ -13,9 +13,9 @@ namespace SDL2Demo.Jobs
{ {
private bool windowOpen; private bool windowOpen;
private List<TunerMetadata> tuners; private List<TunerMetadata> tuners;
private List<SatellitePositionEntity> satellites; private List<SatellitePosition> satellites;
private List<LnbEntity> lnbs; private List<LnbType> lnbs;
private List<DishEntity> dishes; private List<DishType> dishes;
private readonly TaskQueue _taskQueue; private readonly TaskQueue _taskQueue;
public int settingsWindowBLScanTunerSelection; public int settingsWindowBLScanTunerSelection;
@ -52,7 +52,7 @@ namespace SDL2Demo.Jobs
settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh); settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh);
} }
public InheritedBlindscanConfigWindow(List<TunerMetadata> tunerMetadatas, public InheritedBlindscanConfigWindow(List<TunerMetadata> tunerMetadatas,
List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, List<DishEntity> dishTypes, List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, List<DishType> dishTypes,
DataStorage dataStorage, ObjectStorage objectStorage, IGpsReceiver gps, Ini ini, IStreamReader streamReader, DataStorage dataStorage, ObjectStorage objectStorage, IGpsReceiver gps, Ini ini, IStreamReader streamReader,
TaskQueue taskQueue) TaskQueue taskQueue)
{ {
@ -131,7 +131,7 @@ namespace SDL2Demo.Jobs
bjc.TunerMetadata = tuners[settingsWindowBLScanTunerSelection]; bjc.TunerMetadata = tuners[settingsWindowBLScanTunerSelection];
bjc.Ui = new InheritedBlindscanUiJunction(); bjc.Ui = new InheritedBlindscanUiJunction();
//bjc.Ui.Tasks = _taskQueue; bjc.Ui.Tasks = _taskQueue;
return bjc; return bjc;
} }

View File

@ -33,23 +33,8 @@ using System.Numerics;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization; using System.Xml.Serialization;
using moe.yo3explorer.skyscraper8.DVBI.Model;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.T2MI.Packets;
using skyscraper8.DvbNip;
using skyscraper8.DvbNip.UiIntegration;
using skyscraper8.DvbSis;
using skyscraper8.GSE;
using skyscraper8.GSE.GSE;
using skyscraper8.Ietf.FLUTE;
using skyscraper8.Ses;
using skyscraper8.Skyscraper.Scraper;
using skyscraper8.T2MI.Packets;
using testdrid.SdlWrapper; using testdrid.SdlWrapper;
using static SDL2Demo.Jobs.Blindscan; using static SDL2Demo.Jobs.Blindscan;
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
namespace SDL2Demo.Jobs namespace SDL2Demo.Jobs
{ {
@ -467,11 +452,6 @@ namespace SDL2Demo.Jobs
patEntry.pmt = result; patEntry.pmt = result;
} }
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
{
throw new NotImplementedException();
}
private string pmtTabBarUuid; private string pmtTabBarUuid;
public void RenderPmt() public void RenderPmt()
@ -1016,11 +996,6 @@ namespace SDL2Demo.Jobs
} }
} }
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
{
throw new NotImplementedException();
}
private void RenderDataCarousels() private void RenderDataCarousels()
{ {
@ -1682,7 +1657,7 @@ namespace SDL2Demo.Jobs
return position; return position;
} }
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbEntity lnb) public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbType lnb)
{ {
Point point = GetFrequencyPosition(blindscanResult.SearchResult, lnb.MinimumFrequency, lnb.MaximumFrequency); Point point = GetFrequencyPosition(blindscanResult.SearchResult, lnb.MinimumFrequency, lnb.MaximumFrequency);
jobContext.Puppets[2 + blindscanResult.SearchResult.Pol].AutoMoveTo(point); jobContext.Puppets[2 + blindscanResult.SearchResult.Pol].AutoMoveTo(point);
@ -1825,172 +1800,6 @@ namespace SDL2Demo.Jobs
return !foundFrequenciesWindow.doNotAutoZap; return !foundFrequenciesWindow.doNotAutoZap;
} }
public void NotifyNit(NitNetwork nitNetwork)
{
}
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
{
}
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
{
}
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
{
}
public void OnBbframe(BBHeader bbHeader, byte[] payload)
{
}
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
{
}
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
{
}
public void OnDvbNipFileArrival(FluteUiHandle fuh)
{
}
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier,
MulticastGatewayConfigurationType multicastGatewayConfiguration)
{
}
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
{
}
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
{
}
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation,
ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
{
}
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1,
string serviceListId2)
{
}
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
{
}
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation,
NetworkInformationFileType networkInformationFile)
{
}
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation,
ServiceInformationFileType serviceInformationFile)
{
}
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
{
}
public void OnAstraSgtList(SgtList list)
{
}
public void OnAstraSgtService(SgtService child)
{
}
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
{
}
public void NotifyTransportStreamId(int tsid, int nid)
{
}
public void OnDvbSisCat(int sourcePid, SisCatContainer catContainer)
{
}
public void OnDvbSisEit(int sourcePid, SisEitContainer eitContainer)
{
}
public void OnDvbSisFti(int relatedPid, _0xF0_FramingTimingInformation fti)
{
}
public void OnDvbSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp)
{
}
public void OnDvbSisPat(int sourcePid, SisPatContainer patContainer)
{
}
public void OnDvbSisSdt(int sourcePid, SisSdtContainer sdtContainer)
{
}
public void OnDvbSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber,
Stream dsaci)
{
}
public void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer)
{
}
public void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer)
{
}
public void OnDvbSisTdt(int sourcePid, DateTime? utcTime)
{
}
public void OnRcs2Rmt(Rmt rmt)
{
}
public TaskQueue Tasks { get; set; } public TaskQueue Tasks { get; set; }
internal JobContext jobContext; internal JobContext jobContext;

View File

@ -211,9 +211,9 @@ namespace SkyscraperUI
private ConfigureDataStorageWindow configureDataStorageWindow; private ConfigureDataStorageWindow configureDataStorageWindow;
private ConfigureObjectStorageWindow configureObjectStorageWindow; private ConfigureObjectStorageWindow configureObjectStorageWindow;
private SatellitesConfigurationWindow satellitesConfigurationWindow; private SatellitesConfigurationWindow satellitesConfigurationWindow;
private List<SatellitePositionEntity> satellitePositions; private List<SatellitePosition> satellitePositions;
private List<LnbEntity> lnbTypes; private List<LnbType> lnbTypes;
private List<DishEntity> dishTypes; private List<DishType> dishTypes;
//private LogWindow logWindow; //private LogWindow logWindow;
private ScrapeFromTcp scrapeFromTcpWindow; private ScrapeFromTcp scrapeFromTcpWindow;
private JobContext jobContext; private JobContext jobContext;

View File

@ -1,7 +0,0 @@
{
"profiles": {
"skyscraper8.UI.SDL2": {
"commandName": "Project"
}
}
}

View File

@ -9,7 +9,6 @@ using skyscraper5.LyngsatMapsScraper.Model;
using skyscraper5.Skyscraper.Scraper.Storage; using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper8.Skyscraper.Plugins; using skyscraper8.Skyscraper.Plugins;
using skyscraper8.Skyscraper.Scraper.Storage; using skyscraper8.Skyscraper.Scraper.Storage;
using TimeSpan = System.TimeSpan;
namespace skyscraper5.LyngsatMapsScraper namespace skyscraper5.LyngsatMapsScraper
{ {
@ -168,20 +167,5 @@ namespace skyscraper5.LyngsatMapsScraper
{ {
return File.ReadAllText(fileInfo.FullName); return File.ReadAllText(fileInfo.FullName);
} }
public static TimeSpan GetAge(this FileInfo fileInfo)
{
DateTime lastWriteTime = fileInfo.LastWriteTime;
DateTime now = DateTime.Now;
TimeSpan diff = now - lastWriteTime;
return diff;
}
public static int GetAgeInSeconds(this FileInfo fileInfo)
{
TimeSpan timeSpan = fileInfo.GetAge();
int result = (int)timeSpan.TotalSeconds;
return result;
}
} }
} }

View File

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SharpKml.Core" Version="6.1.0" /> <PackageReference Include="SharpKml.Core" Version="6.1.0" />
</ItemGroup> </ItemGroup>

View File

@ -588,9 +588,11 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader
{ {
this.wrapped = client; this.wrapped = client;
this.bufferedStream = new BufferedStream(wrapped.GetStream(), 96256); this.bufferedStream = new BufferedStream(wrapped.GetStream(), 96256);
this.packetsRemainBeforeStart = 512;
} }
internal TcpClient wrapped; internal TcpClient wrapped;
internal BufferedStream bufferedStream; internal BufferedStream bufferedStream;
private int packetsRemainBeforeStart;
public void Dispose() public void Dispose()
{ {
@ -613,6 +615,15 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader
internal void DropPacket(byte[] buffer, int offset, int length) internal void DropPacket(byte[] buffer, int offset, int length)
{ {
if (packetsRemainBeforeStart > 0)
{
if (packetsRemainBeforeStart == 512 || packetsRemainBeforeStart == 256 || packetsRemainBeforeStart == 128 || packetsRemainBeforeStart == 64 || packetsRemainBeforeStart == 32 || packetsRemainBeforeStart == 16 || packetsRemainBeforeStart == 8 || packetsRemainBeforeStart == 4 || packetsRemainBeforeStart == 2 || packetsRemainBeforeStart == 1)
{
Console.WriteLine("Waiting {0} packets before starting to send to client {1}...", packetsRemainBeforeStart, wrapped.Client.RemoteEndPoint);
}
packetsRemainBeforeStart--;
return;
}
bufferedStream?.Write(buffer, offset, length); bufferedStream?.Write(buffer, offset, length);
} }
} }

View File

@ -79,17 +79,9 @@ namespace skyscraper5.IO.StreamReader
} }
public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw) public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw)
{
try
{ {
return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, lofsw); return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, lofsw);
} }
catch (DivideByZeroException dvze)
{
Console.WriteLine("Mitigated Division-by-Zero bug in StreamReader.dll.");
return false;
}
}
public bool SetChannelEx(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw, MOD_TYPE mod) public bool SetChannelEx(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw, MOD_TYPE mod)
{ {

View File

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Npgsql" Version="10.0.2" /> <PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="SharpGIS.NmeaParser" Version="3.0.0" /> <PackageReference Include="SharpGIS.NmeaParser" Version="3.0.0" />
</ItemGroup> </ItemGroup>

View File

@ -6,7 +6,6 @@
\usepackage{amssymb} \usepackage{amssymb}
\usepackage{xcolor} \usepackage{xcolor}
\usepackage{pifont,mdframed} \usepackage{pifont,mdframed}
\usepackage{verbatim}
\usepackage{geometry} \usepackage{geometry}
@ -75,7 +74,6 @@ On Linux and macOS, any halfway recent shell should be fine.
.\skyscraper8.exe cscan tcp://127.0.0.1:6969 .\skyscraper8.exe cscan tcp://127.0.0.1:6969
\end{verbatim} \end{verbatim}
\label{sec:gswarning}
\subsubsection{Working with GS using StreamReader} \subsubsection{Working with GS using StreamReader}
There are a few caveats when working with StreamReader.dll to capture GS. There are a few caveats when working with StreamReader.dll to capture GS.
@ -96,19 +94,7 @@ Why is that? While StreamReader.dll's Deencapsulation works correctly in theory,
\subsection{Using a BDA compatible tuner} \subsection{Using a BDA compatible tuner}
Use TSDuck's \codeword{tsp} and use the \codeword{dvb} input plugin and the \codeword{ip} output plugin. Use TSDuck's \codeword{tsp} and use the \codeword{dvb} input plugin and the \codeword{ip} output plugin.
Here's how to do it: \\ TODO: Talk about TSDuck here.
\begin{enumerate}
\item Run skyscraper8 from the commandline using the following command:
\begin{verbatim}
.\skyscraper8.exe udpin
\end{verbatim}
\item Then run \codeword{tsp} like this:
\begin{verbatim}
tsp -v -I dvb -a 4 --delivery-system DVB-S2 --frequency 11,523,000,000 \
--symbol-rate 22,000,000 --polarity horizontal -O ip 127.0.0.1:9003
\end{verbatim}
\end{enumerate}
\subsection{Using a video4linux compatible tuner} \subsection{Using a video4linux compatible tuner}
See the paragraph about BDA tuners. The same applies to video4linux compatible tuners. TSDuck's \codeword{tsp} can be used on Windows and Linux in the same way. See the paragraph about BDA tuners. The same applies to video4linux compatible tuners. TSDuck's \codeword{tsp} can be used on Windows and Linux in the same way.
@ -171,15 +157,13 @@ Extracted files will be written to the directory the command-line interpreter ha
If you are using Microsoft Windows, you can also DragnDrop a TS file onto the skyscraper8.exe. The extracted data will be placed into the same directory the TS is in. If you are using Microsoft Windows, you can also DragnDrop a TS file onto the skyscraper8.exe. The extracted data will be placed into the same directory the TS is in.
\label{sec:cannotdo}
\section{What skyscraper8 can not do} \section{What skyscraper8 can not do}
\begin{itemize} \begin{itemize}
\item Watch TV or Listen to Radio. Extracting files and playing back audio/video are two very different things, and skyscraper8 is not designed to do the latter. If this is something you're looking for, you probably want something like ProgDVB or DVBViewer. \item Watch TV or Listen to Radio. Extracting files and playing back audio/video are two very different things, and skyscraper8 is not designed to do the latter. If this is something you're looking for, you probably want something like ProgDVB or DVBViewer.
\item Descramble encrypted channels. This is illegal in most, if not all, jurisdictions, and I want nothing to with that. \item Descramble encrypted channels. This is illegal in most, if not all, jurisdictions, and I want nothing to with that.
\item Circumvent copy protections. TS contained on Blu-Ray disc are usually scrambled using AACS. Although not too difficult, bypassing it is also a complicated legal matter, which is why I prefer not doing it. \item Circumvent copy protections. TS contained on Blu-Ray disc are usually scrambled using AACS. Although not too difficult, bypassing it is also a complicated legal matter, which is why I prefer not doing it.
\item Descramble encrypted DOCSIS\footnote{Data-Over-Cable Service Interface Specifications} Traffic. While skyscraper8 does understand DOCSIS traffic and is perfectly capable of sniffing packets from it using tuners like the TBS-6281 SE, it will drop any scrambled packets - meaning those that have the DOCSIS privacy extension enabled. \item Descramble encrypted DOCSIS\footnote{Data-Over-Cable Service Interface Specifications} Traffic. While skyscraper8 does understand DOCSIS traffic and is perfectly capable of sniffing packets from it using tuners like the TBS-6281 SE, it will drop any scrambled packets - meaning those that have the DOCSIS privacy extension enabled.
\item Do a professional grade analysis of a TS. There are many intricacies in broadcasting systems which are out of scope for a simple file extractor developed by a mere hobbyist. \hypertarget{bettertools}{If you're looking for a professional grade analyzing tool}, I'd recommend you to check out the tools included in VMA Video Analyzer, Dektec's StreamXpert, GkWare's StreamGuru, or the \codeword{analyze} plugin of TSDuck. \item Do a professional grade analysis of a TS. There are many intricacies in broadcasting systems which are out of scope for a simple file extractor developed by a mere hobbyist. If you're looking for a professional grade analyzing tool, I'd recommend you to check out the tools included in VMA Video Analyzer, Dektec's StreamXpert, GkWare's StreamGuru, or the \codeword{analyze} plugin of TSDuck.
\item Handle MPEG-DASH streams. Currently, there are two known video formats used in DVB-NIP: HLS and MPEG-DASH. While skyscraper8 is able to extract segments of both types from a TS, I do not know of an easy way to playback MPEG-DASH formatted streams. HLS on the other hand is trivial. \item Handle MPEG-DASH streams. Currently, there are two known video formats used in DVB-NIP: HLS and MPEG-DASH. While skyscraper8 is able to extract segments of both types from a TS, I do not know of an easy way to playback MPEG-DASH formatted streams. HLS on the other hand is trivial.
\item Repair broken GS. When using a non STiD135-based tuner to tune to a GS, the framing gets broken in extremely weird ways. Also, when using StreamReader.dll to tune to a GS with a STiD135 - it is imperative to disable to StreamReader.dll's deencapsulator. It often breaks the framing as well. See \hyperref[sec:gswarning]{the notice about GS in Section 2.1} \item Repair broken GS. When using a non STiD135-based tuner to tune to a GS, the framing gets broken in extremely weird ways. Also, when using StreamReader.dll to tune to a GS with a STiD135 - it is imperative to disable to StreamReader.dll's deencapsulator. It often breaks the framing as well. See \hyperref[sec:gswarning]{the notice about GS in Section 2.1}
\end{itemize} \end{itemize}
@ -187,55 +171,12 @@ If you are using Microsoft Windows, you can also DragnDrop a TS file onto
\section{How skyscraper8 was made} \section{How skyscraper8 was made}
skyscraper8 is developed in the C\# programming language, using Microsoft Visual Studio 2022. Therefore it requires a Microsoft .NET runtime, which is included in Microsoft Windows and freely available for most Linux distributions and Apple's macOS. skyscraper8 is developed in the C\# programming language, using Microsoft Visual Studio 2022. Therefore it requires a Microsoft .NET runtime, which is included in Microsoft Windows and freely available for most Linux distributions and Apple's macOS.
The .NET assembly of skyscraper8 is not obfuscated or protected in any way. This is on purpose. If you want to study how skyscraper8 works under the hood, I hereby allow you to use tools like RedGate's Reflector or JetBrains' dotPeek to inspect the skyscraper8.dll file. I plan to release the clear source code at a later date. \\ The .NET assembly of skyscraper8 is not obfuscated or protected in any way. This is on purpose. If you want to study how skyscraper8 works under the hood, I hereby allow you to use tools like RedGate's Reflector or JetBrains' dotPeek to inspect the skyscraper8.dll file. Of course you can also acquire the plain source code from my Gitea instance.\footnote{\url{https://gitea.yo3explorer.moe/ft/skyscraper8}}
Although I can't and won't force you to give credit, if you find some of my source code inspiring or helpful and want to use it in your own projects, it would be great if you give credit to where you got it from. \\
This document was typeset in \LaTeX{}, using the TeX Live distribution, and while I wrote it myself, I did use GPT-5 for proofreading the initial version of this document. The proofreading of this document is the only part of skyscraper8 for which an LLM was used. No part of the actual skyscraper8 codebase itself was written by an LLM. \\
For generating artificial TS recordings to test on, TSDuck was used. \\
\subsection{Experiments conducted using TSDuck}
\subsubsection {Creating a TS that carried multiple sub-TS using MPE}
Since skyscraper8 public release 12, it's possible to have skyscraper8 extract one or more TS carried via Multiprotocol Encapsulation. Unfortunately the dish I have at home is not aimed at satellites carrying such a stream. So I used TSDuck to build one artificially. \\
The following script was used to to run \codeword{tsp}:
\verbatiminput{../Documentation/TSDuck-Samples/experiment2/run.sh}
Contents of tdt.xml:
\verbatiminput{../Documentation/TSDuck-Samples/experiment2/tdt.xml}
Before executing that script, run this beforehand, to get a stream of Stingray Spa, of course you can use any other IPTV station you'd like:
\begin{verbatim}
tsp -v -I hls https://lotus.stingray.com/manifest/ose-122ads-montreal/samsungtvplus/master.m3u8 \
-P regulate -P history -O ip 127.0.0.2:3000
\end{verbatim}
For the other stream, I used Offener Kanal Berlin, like so:
\begin{verbatim}
tsp -v -I hls https://alex-stream.rosebud-media.de/bounce/alexlivetv50.smil/index.m3u8 \
-P regulate -P history -O ip 127.0.0.2:2000
\end{verbatim}
Finally, run the script above to get a clean TS containing two other TS encapsulated in MPE.
This document was typeset in \LaTeX{}, using the TeX Live distribution, and while I wrote it myself, I did use GPT-5 for proofreading the initial version of this document. The proofreading of this document is the only part of skyscraper8 for which an LLM was used. No part of the actual skyscraper8 codebase itself was written by an LLM.
\subsection{Personal remarks and some useless bonus information} \subsection{Personal remarks and some useless bonus information}
\subsubsection{Credits}
skyscraper8 uses some external libraries:
\begin{itemize}
\item One of the external libraries is Ionic.Zlib.Core.dll, which is part of the \href{https://github.com/DinoChiesa/DotNetZip-2025}{DotNetZip} tool set by Dino Chiesa.
\item Also used is Newtonsoft.Json.dll a.k.a. \href{https://github.com/JamesNK/Newtonsoft.Json}{Json.NET} by James Newton-King.
\item Some of the GS handling code got inspired from the \href{https://github.com/newspaperman/bbframe-tools}{bbframe-tools} written by newspaperman.
\end{itemize}
\subsubsection{How and why skyscraper8 began: A young man's dream} \subsubsection{How and why skyscraper8 began: A young man's dream}
Ever since I was a child, I was fascinated by TV. But not actually watching it, rather understanding how it works. I grew up in the 90s, in an area where Cable TV was not really available, and terristial reception (yeah, those TVs with bunny ears!) only worked when it felt like it. So satellite was the best way to get my childish fix of cartoons! We can say the dish on my roof has always been a companion. Far more interesting than actually watching TV was scanning through the printed TV guides. I was curious. How did they make these? And how would I make one myself? I wondered. Of course my parents wouldn't know - they're not techies. \\ Ever since I was a child, I was fascinated by TV. But not actually watching it, rather understanding how it works. I grew up in the 90s, in an area where Cable TV was not really available, and terristial reception (yeah, those TVs with bunny ears!) only worked when it felt like it. So satellite was the best way to get my childish fix of cartoons! We can say the dish on my roof has always been a companion. Far more interesting than actually watching TV was scanning through the printed TV guides. I was curious. How did they make these? And how would I make one myself? I wondered. Of course my parents wouldn't know - they're not techies. \\
@ -243,23 +184,10 @@ Of course, as I got older, I eventually moved onto other things. Like programmin
I got internet access much later in my life than my peers did, and when I found out that there are forums in which people discuss the technicalities about video games, it blew my mind. I used to be a frequent reader (and occasional contributor) of the XeNTaX\footnote{Unfortunately, that forum is long gone from the internet, but can still be experienced thanks to the amazing work of the people over at the Internet Archive: \url{https://web.archive.org/web/20230925120533/https://forum.xentax.com/ }} forum, from where I learned a lot! \\ I got internet access much later in my life than my peers did, and when I found out that there are forums in which people discuss the technicalities about video games, it blew my mind. I used to be a frequent reader (and occasional contributor) of the XeNTaX\footnote{Unfortunately, that forum is long gone from the internet, but can still be experienced thanks to the amazing work of the people over at the Internet Archive: \url{https://web.archive.org/web/20230925120533/https://forum.xentax.com/ }} forum, from where I learned a lot! \\
At the time, my circle of friends was crazy about Yu-Gi-Oh! Online 3, which was an excellent simulation of the trading card game by the same name. I was really bad at this game, not even a mediocre player. I was far more busy studying how the game worked under the hood, and eventually managed to write a program that extracts all the card graphics and the soundtrack of the game. This resulted in my guild leader having the best quality available soundtrack rips on his Youtube account. As you can probably guess, I went on and reverse engineered more and more video games. But as life goes on, you eventually graduate from school, head to university, and then get a job. Interests and people can change over time, and so did I. As I grew older I kind of lost interest in video games. Nowadays I rarely play anymore. \\ At the time, my circle of friends was crazy about Yu-Gi-Oh! Online 3, which was an excellent simulation of the trading card game by the same name.
But what has that to do with skyscraper8? That's easy! One day my parents, who I still stay in touch with asked me to record something off live TV. Up until that point, I totally forgot about the dish on the roof of the house my room is in, but at that point it got relevant again. Upon searching for an easy way to record satellite TV on a PC I stumbbled upon Thierry Lelegard's tsduck. With tsp's plugins, it was real easy to schedule a recording. And since I still had the natural curiosity of a game reverse engineer in me, I opened up the .ts file in a hex-editor, and that's exactly the point in time when the DX virus hit me. After reading a bit of the source code of \href{https://images.videolan.org/developers/libdvbpsi.html}{libdvbpsi}, an idea manifested in my head. And that idea became "skyscraper".
\subsubsection{A Brief history of skyscrapers1 to 8}
At that time had a job of administering some databases. My childhood fantasies of making my own TV guide were now within reach. I had "skyscraper" at home, a bunch of databases at work - and MySQL is free someware. That was shortly before COVID-19 ran wild in the world. During lockdown I had made it: A program that reads a list of frequencies from a database, record a series of TS files, parses all the DVB tables, and writes the results into the database. That was all the first skyscraper could do. It was written in Java, and missed a lot of things.
skyscraper5 came about when I changed jobs. I was a software developer at that time. And since we used Java at my day job, and I wanted some distance from my job, I switched my hobbyist projects back to .NET. - .NET 5 to be exact - that's why I called it skyscraper5. That was on the 5th of March, 2022.
Eventually, I upgraded to .NET 8, mainly due to dependency issues, and I renamed the project fittingly to skyscraper8. \\
If you read up to this point, I wish to thank you from the bottom of my heart. I guess by now you can tell that skyscraper8 is a very personal and dear matter for me. My goal was never to make the best tool for handling TS files, there are \hyperlink{bettertools}{much better options} regarding that, but to satisfy my desire to learn. And let me tell you, I learned a lot during the development of skyscraper8, both as a person and as a programmer.
\subsubsection{Music!} \subsubsection{Music!}
Like a lot of programmers, I do enjoy listening to music while working. Some programmers even put song references in their software. Like how MKVToolnix' version names are actually song names, or how BSD developer fk even put \href{https://www.fabiankeil.de/nutzloseinfos.html}{a list of albums on his website} listing what albums he listened to while making it. Although this is absolutely useless, I'd liketo do this as well. Therefore, here follows a list of musical albums I enjoyed listening to while developing skyscraper8 - no claim to completeness. Like a lot of programmers, I do enjoy listening to music while working. Some programmers even put song references in their software. Like how MKVToolnix' version names are actually song names, or how BSD developer fk even put \href{https://www.fabiankeil.de/nutzloseinfos.html}{a list of albums on his website} listing what albums he listened to while making it. Although this is absolutely useless, I'd liketo do this as well. Therefore, here follows a list of musical albums I listened to while developing skyscraper8 - no claim to completeness.
\begin{itemize} \begin{itemize}
\item Bel Canto - White-Out Conditions \item Bel Canto - White-Out Conditions
@ -272,8 +200,6 @@ Like a lot of programmers, I do enjoy listening to music while working. Some pro
\item Satsuki Shibano / Yoshio Ojima - Caresse \item Satsuki Shibano / Yoshio Ojima - Caresse
\item SHIFT UP - Stellar Blade Original Soundtrack \item SHIFT UP - Stellar Blade Original Soundtrack
\item Small Affairs - Small Affairs \item Small Affairs - Small Affairs
\item Starmani Series - la fillette révolutionnaire UTENA
\item SuganoMusic - EUROBEAT FESTIVAL VOL.7.5
\item Yoshio Ojima - Hands-Some \item Yoshio Ojima - Hands-Some
\item Youssou NDour - The Guide (Wommat) \item Youssou NDour - The Guide (Wommat)
\item Yu-Gi-Oh! Sound Duel Quarter Century Collection \item Yu-Gi-Oh! Sound Duel Quarter Century Collection

View File

@ -0,0 +1 @@
[assembly: CollectionBehavior(DisableTestParallelization = true)]

View File

@ -0,0 +1,102 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.IO;
using skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants;
using skyscraper8.Ses;
using skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Tests
{
public class AstraBarkerTransponderTests
{
private const string BARKER_TRANSPONDER_FILE_PATH = "C:\\Temp\\Astra1_12604_v_SGT-000000.ts";
private Stream GetBarkerTransponder()
{
FileInfo fi = new FileInfo(BARKER_TRANSPONDER_FILE_PATH);
if (!fi.Exists)
{
Debug.WriteLine(String.Format("Could not find file: {0}", BARKER_TRANSPONDER_FILE_PATH));
return null;
}
return fi.OpenRead();
}
[Fact]
public void TestAstraSdt()
{
Stream stream = GetBarkerTransponder();
if (stream == null)
return;
SdtContestant contestant = new SdtContestant(0x002d);
TsDescriptorUnpacker descriptorUnpacker = TsDescriptorUnpacker.GetInstance();
for (byte i = 0x80; i < 0xfe; i++)
{
descriptorUnpacker.SetUserDefined(i, true);
}
descriptorUnpacker.SetUserDefined(0xfe, true);
TsContext tsContext = new TsContext();
tsContext.FilterChain = new List<skyscraper5.src.Mpeg2.PacketFilter.IPacketFilter>();
tsContext.FilterChain.Add(new DummyFilter());
tsContext.RegisterPacketProcessor(0x002d, contestant.PacketProcessor);
byte[] buffer = new byte[188];
while (stream.GetAvailableBytes() >= 188)
{
stream.Read(buffer, 0, 188);
tsContext.PushPacket(buffer);
if (contestant.Score >= 10)
break;
}
stream.Close();
}
[Fact]
public void TestAstraLcn()
{
Stream stream = GetBarkerTransponder();
if (stream == null)
return;
SgtCandidate contestant = new SgtCandidate(0x0777);
SgtCandidate contestant2 = new SgtCandidate(0x0776);
TsDescriptorUnpacker descriptorUnpacker = TsDescriptorUnpacker.GetInstance();
for (byte i = 0x80; i < 0xfe; i++)
{
descriptorUnpacker.SetUserDefined(i, true);
}
descriptorUnpacker.SetUserDefined(0xfe, true);
TsContext tsContext = new TsContext();
tsContext.FilterChain = new List<skyscraper5.src.Mpeg2.PacketFilter.IPacketFilter>();
tsContext.FilterChain.Add(new DummyFilter());
tsContext.RegisterPacketProcessor(0x0777, contestant.PacketProcessor);
tsContext.RegisterPacketProcessor(0x0776, contestant2.PacketProcessor);
byte[] buffer = new byte[188];
while (stream.GetAvailableBytes() >= 188)
{
stream.Read(buffer, 0, 188);
tsContext.PushPacket(buffer);
bool winnerA = contestant.Score >= 10;
bool winnerB = contestant2.Score >= 10;
if (winnerA)
{
if (winnerB)
{
return;
}
}
}
stream.Close();
}
}
}

View File

@ -0,0 +1,18 @@
using skyscraper5.Mpeg2;
using skyscraper5.src.Mpeg2.PacketFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests
{
internal class DummyFilter : IPacketFilter
{
public bool PassPacket(TsPacket packet)
{
return true;
}
}
}

View File

@ -0,0 +1,40 @@
using skyscraper5.Docsis;
using skyscraper5.Docsis.MacManagement;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Tests.ClassDependencies.DocsisTests
{
internal class DocsisEventHandlerImpl : IDocsisEventHandler
{
public void OnCmtsTimestamp(PhysicalAddress source, uint timing)
{
throw new NotImplementedException();
}
public void OnDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel)
{
throw new NotImplementedException();
}
public void OnLearnedIpFromMac(PhysicalAddress arpHeaderSenderHardwareAddress, IPAddress arpHeaderSenderProtocolAddress)
{
throw new NotImplementedException();
}
public void OnParticipantDetected(PhysicalAddress pa)
{
throw new NotImplementedException();
}
public void OnUpstreamChannel(UpstreamChannelDescriptor mmm)
{
throw new NotImplementedException();
}
}
}

View File

@ -1,22 +1,38 @@
using System.Net.NetworkInformation; using skyscraper5;
using skyscraper5.Docsis; using skyscraper5.Docsis;
using skyscraper5.Docsis.AnnexC; using skyscraper5.Docsis.AnnexC;
using skyscraper5.Docsis.MacManagement; using skyscraper5.Docsis.MacManagement;
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Plugins;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper5.Skyscraper.Scraper.Storage.Filesystem;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
using skyscraper8.Skyscraper.IO;
using skyscraper8.Tests.ClassDependencies.DocsisTests;
using skyscraper8.Tests.Properties;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using Xunit.Sdk;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests; namespace skyscraper8.Tests
[TestFixture]
public class DocsisResourceTests : SkyscrapersTestingFramework
{ {
[Test] public class DocsisTests
{
[Fact]
public void ModemCapabilitiesEncoding() public void ModemCapabilitiesEncoding()
{ {
byte[] buffer = Properties.Resources.ModemCapabilitiesEncodingTest; byte[] buffer = Resources.ModemCapabilitiesEncodingTest;
ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer); ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer);
Assert.IsTrue(modemCapabilitiesEncoding.Valid); Assert.True(modemCapabilitiesEncoding.Valid);
} }
[Test] [Fact]
public void MultipartRegistrationResponse() public void MultipartRegistrationResponse()
{ {
Random rng = new Random(); Random rng = new Random();
@ -29,18 +45,18 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
rng.NextBytes(targetBuffer); rng.NextBytes(targetBuffer);
PhysicalAddress target = new PhysicalAddress(targetBuffer); PhysicalAddress target = new PhysicalAddress(targetBuffer);
byte[] buffer = Properties.Resources.T45_V4_MultipartRegistrationResponseTest; byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest;
T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer); T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer);
Assert.IsTrue(test.Valid); Assert.True(test.Valid);
} }
[Test] [Fact]
public void MacManagement_4_45() public void MacManagement_4_45()
{ {
NullDocsisEventHandler docsisEventHandler = new NullDocsisEventHandler(); DocsisEventHandlerImpl docsisEventHandler = new DocsisEventHandlerImpl();
DocsisEnvironment environment = new DocsisEnvironment(docsisEventHandler); DocsisEnvironment environment = new DocsisEnvironment(docsisEventHandler);
byte[] testPayload = Properties.Resources.PushMacManagementMessage_Version4_Type45; byte[] testPayload = Resources.PushMacManagementMessage_Version4_Type45;
Random rng = new Random(); Random rng = new Random();
byte[] sourceBuffer = new byte[6]; byte[] sourceBuffer = new byte[6];
@ -54,10 +70,10 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
environment.PushMacManagementMessage(testPayload, 4, 45, source, target, testPayload); environment.PushMacManagementMessage(testPayload, 4, 45, source, target, testPayload);
} }
[Test] [Fact]
public void InvalidUpstreamChannelDescriptorTest() public void InvalidUpstreamChannelDescriptorTest()
{ {
byte[] testPayload = Properties.Resources.UpstreamChannelDescriptorTest; byte[] testPayload = Resources.UpstreamChannelDescriptorTest;
Random rng = new Random(); Random rng = new Random();
byte[] sourceBuffer = new byte[6]; byte[] sourceBuffer = new byte[6];
@ -69,19 +85,19 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
PhysicalAddress target = new PhysicalAddress(targetBuffer); PhysicalAddress target = new PhysicalAddress(targetBuffer);
UpstreamChannelDescriptor ucd = new UpstreamChannelDescriptor(source, target, testPayload); UpstreamChannelDescriptor ucd = new UpstreamChannelDescriptor(source, target, testPayload);
Assert.IsFalse(ucd.Valid); Assert.False(ucd.Valid);
} }
[Test] [Fact]
public void TransmitChannelConfigurationObjectTest() public void TransmitChannelConfigurationObjectTest()
{ {
byte[] testPayload = Properties.Resources.TransmitChannelConfigurationObject; byte[] testPayload = Resources.TransmitChannelConfigurationObject;
CommonTlvEncodingObject.TransmitChannelConfigurationObject child = new CommonTlvEncodingObject.TransmitChannelConfigurationObject(testPayload); CommonTlvEncodingObject.TransmitChannelConfigurationObject child = new CommonTlvEncodingObject.TransmitChannelConfigurationObject(testPayload);
Assert.IsTrue(child.Valid); Assert.True(child.Valid);
} }
[Test] [Fact]
public void MultipartRegistrationResponse2() public void MultipartRegistrationResponse2()
{ {
Random rng = new Random(); Random rng = new Random();
@ -94,26 +110,9 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
rng.NextBytes(targetBuffer); rng.NextBytes(targetBuffer);
PhysicalAddress target = new PhysicalAddress(targetBuffer); PhysicalAddress target = new PhysicalAddress(targetBuffer);
byte[] buffer = Properties.Resources.T45_V4_MultipartRegistrationResponseTest2; byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest2;
T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer); T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer);
Assert.IsTrue(test.Valid); Assert.True(test.Valid);
} }
[Test]
public void OffsetBreakerTest()
{
byte[] blob = Properties.Resources.ranging_response_test;
Random rng = new Random();
byte[] sourceMacBuffer = new byte[6];
rng.NextBytes(sourceMacBuffer);
PhysicalAddress sourceAddress = new PhysicalAddress(sourceMacBuffer);
byte[] targetMacBuffer = new byte[6];
rng.NextBytes(targetMacBuffer);
PhysicalAddress targetAddress = new PhysicalAddress(targetMacBuffer);
RangingResponse rangingResponse = new RangingResponse(sourceAddress, targetAddress, blob);
Assert.IsTrue(rangingResponse.Valid);
} }
} }

View File

@ -0,0 +1,69 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper.Storage.Filesystem;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5;
using skyscraper8.Skyscraper.IO;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper8.Tests
{
public class DocsisTestsLong
{
[Fact]
public void TestLongBoiSingleStreams()
{
DirectoryInfo di = new DirectoryInfo("D:\\DocsisDemo");
if (!di.Exists)
{
Debug.WriteLine("Files not available!");
return;
}
FilesystemScraperStorageFactory storageFactory = new FilesystemScraperStorageFactory();
storageFactory.Directory = "docsis_longboi";
Passing passing = new Passing();
passing.DataStorage = storageFactory.CreateDataStorage();
passing.MassImportDirectory(di);
}
[Fact]
public void TestM3u8Stream()
{
FileInfo docsisM3u8 = new FileInfo("D:\\DocsisDemo\\docsis.m3u8");
if (!docsisM3u8.Exists)
{
Debug.WriteLine("File not available!");
return;
}
FileInfo alreadyTested = new FileInfo("docsis_m3u8_test.complete");
if (alreadyTested.Exists)
{
Debug.WriteLine("Hello!");
return;
}
M3U8Stream m3u8 = new M3U8Stream(docsisM3u8.FullName);
TsContext tsContext = new TsContext();
InMemoryScraperStorageFactory storageFactory = new InMemoryScraperStorageFactory();
DataStorage scraperStorage = storageFactory.CreateDataStorage();
SkyscraperContext skyscraperContext = new SkyscraperContext(tsContext, scraperStorage, null);
skyscraperContext.InitalizeFilterChain();
skyscraperContext.IngestFromStream(m3u8);
File.WriteAllText("docsis_m3u8_test.complete", "1");
}
}
}

View File

@ -1,3 +0,0 @@
global using NUnit.Framework;
[assembly: LevelOfParallelism(1)]

View File

@ -1,42 +1,57 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
// //
// Changes to this file may cause incorrect behavior and will be lost if // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// the code is regenerated. // der Code erneut generiert wird.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace skyscraper8.Tests.NUnit.Properties { namespace skyscraper8.Tests.Properties {
using System; using System;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] /// <summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()] /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()] /// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {
private static System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() { internal Resources() {
} }
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] /// <summary>
internal static System.Resources.ResourceManager ResourceManager { /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get { get {
if (object.Equals(null, resourceMan)) { if (object.ReferenceEquals(resourceMan, null)) {
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("skyscraper8.Tests.NUnit.Properties.Resources", typeof(Resources).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("skyscraper8.Tests.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;
} }
} }
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] /// <summary>
internal static System.Globalization.CultureInfo Culture { /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get { get {
return resourceCulture; return resourceCulture;
} }
@ -45,34 +60,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
internal static byte[] Frame00000008_TSGS1_MIS000_SYNC001 { /// <summary>
get { /// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
object obj = ResourceManager.GetObject("Frame00000008_TSGS1_MIS000_SYNC001", resourceCulture); /// </summary>
return ((byte[])(obj));
}
}
internal static byte[] Frame00000012_TSGS1_MIS000_SYNC001 {
get {
object obj = ResourceManager.GetObject("Frame00000012_TSGS1_MIS000_SYNC001", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] Frame00000357_TSGS1_MIS000_SYNC184 {
get {
object obj = ResourceManager.GetObject("Frame00000357_TSGS1_MIS000_SYNC184", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] Frame00001343_TSGS1_MIS000_SYNC001 {
get {
object obj = ResourceManager.GetObject("Frame00001343_TSGS1_MIS000_SYNC001", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] ModemCapabilitiesEncodingTest { internal static byte[] ModemCapabilitiesEncodingTest {
get { get {
object obj = ResourceManager.GetObject("ModemCapabilitiesEncodingTest", resourceCulture); object obj = ResourceManager.GetObject("ModemCapabilitiesEncodingTest", resourceCulture);
@ -80,6 +70,29 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] MultipartRegistrationResponseTest {
get {
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] MultipartRegistrationResponseTest2 {
get {
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest2", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] PushMacManagementMessage_Version4_Type45 { internal static byte[] PushMacManagementMessage_Version4_Type45 {
get { get {
object obj = ResourceManager.GetObject("PushMacManagementMessage_Version4_Type45", resourceCulture); object obj = ResourceManager.GetObject("PushMacManagementMessage_Version4_Type45", resourceCulture);
@ -87,6 +100,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] ranging_response_test { internal static byte[] ranging_response_test {
get { get {
object obj = ResourceManager.GetObject("ranging_response_test", resourceCulture); object obj = ResourceManager.GetObject("ranging_response_test", resourceCulture);
@ -94,27 +110,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
internal static byte[] sdpTest { /// <summary>
get { /// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
object obj = ResourceManager.GetObject("sdpTest", resourceCulture); /// </summary>
return ((byte[])(obj));
}
}
internal static byte[] T45_V4_MultipartRegistrationResponseTest {
get {
object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] T45_V4_MultipartRegistrationResponseTest2 {
get {
object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest2", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] test_1packet_01 { internal static byte[] test_1packet_01 {
get { get {
object obj = ResourceManager.GetObject("test-1packet-01", resourceCulture); object obj = ResourceManager.GetObject("test-1packet-01", resourceCulture);
@ -122,6 +120,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] test_2packets_02_03 { internal static byte[] test_2packets_02_03 {
get { get {
object obj = ResourceManager.GetObject("test-2packets-02-03", resourceCulture); object obj = ResourceManager.GetObject("test-2packets-02-03", resourceCulture);
@ -129,6 +130,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] test_3packets_04_05_06 { internal static byte[] test_3packets_04_05_06 {
get { get {
object obj = ResourceManager.GetObject("test-3packets-04-05-06", resourceCulture); object obj = ResourceManager.GetObject("test-3packets-04-05-06", resourceCulture);
@ -136,6 +140,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] TransmitChannelConfigurationObject { internal static byte[] TransmitChannelConfigurationObject {
get { get {
object obj = ResourceManager.GetObject("TransmitChannelConfigurationObject", resourceCulture); object obj = ResourceManager.GetObject("TransmitChannelConfigurationObject", resourceCulture);
@ -143,18 +150,14 @@ namespace skyscraper8.Tests.NUnit.Properties {
} }
} }
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
/// </summary>
internal static byte[] UpstreamChannelDescriptorTest { internal static byte[] UpstreamChannelDescriptorTest {
get { get {
object obj = ResourceManager.GetObject("UpstreamChannelDescriptorTest", resourceCulture); object obj = ResourceManager.GetObject("UpstreamChannelDescriptorTest", resourceCulture);
return ((byte[])(obj)); return ((byte[])(obj));
} }
} }
internal static byte[] ExampleVoileOnlinePost {
get {
object obj = ResourceManager.GetObject("ExampleVoileOnlinePost", resourceCulture);
return ((byte[])(obj));
}
}
} }
} }

View File

@ -118,34 +118,19 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Frame00000008_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Frame00000008_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="Frame00000012_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Frame00000012_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="Frame00000357_TSGS1_MIS000_SYNC184" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Frame00000357_TSGS1_MIS000_SYNC184.bbframe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="Frame00001343_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Frame00001343_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ModemCapabilitiesEncodingTest" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="ModemCapabilitiesEncodingTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ModemCapabilitiesEncodingTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\ModemCapabilitiesEncodingTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="MultipartRegistrationResponseTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="PushMacManagementMessage_Version4_Type45" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="PushMacManagementMessage_Version4_Type45" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\PushMacManagementMessage_Version4_Type45.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\PushMacManagementMessage_Version4_Type45.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="ranging_response_test" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="ranging_response_test" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ranging_response_test.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\ranging_response_test.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="sdpTest" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="MultipartRegistrationResponseTest2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\sdpTest.sdp;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="T45_V4_MultipartRegistrationResponseTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="T45_V4_MultipartRegistrationResponseTest2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest2.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\T45_V4_MultipartRegistrationResponseTest2.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="test-1packet-01" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="test-1packet-01" type="System.Resources.ResXFileRef, System.Windows.Forms">
@ -163,7 +148,4 @@
<data name="UpstreamChannelDescriptorTest" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="UpstreamChannelDescriptorTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\UpstreamChannelDescriptorTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>..\Resources\UpstreamChannelDescriptorTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="ExampleVoileOnlinePost" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ExampleVoileOnlinePost.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root> </root>

View File

@ -0,0 +1,28 @@
using skyscraper5.Docsis.MacManagement;
using System.Net.NetworkInformation;
using skyscraper8.Tests.Properties;
namespace skyscraper8.Tests
{
public class RangingResponseTest
{
[Fact]
public void OffsetBreakerTest()
{
byte[] blob = Resources.ranging_response_test;
Random rng = new Random();
byte[] sourceMacBuffer = new byte[6];
rng.NextBytes(sourceMacBuffer);
PhysicalAddress sourceAddress = new PhysicalAddress(sourceMacBuffer);
byte[] targetMacBuffer = new byte[6];
rng.NextBytes(targetMacBuffer);
PhysicalAddress targetAddress = new PhysicalAddress(targetMacBuffer);
RangingResponse rangingResponse = new RangingResponse(sourceAddress, targetAddress, blob);
Assert.True(rangingResponse.Valid);
}
}
}

View File

@ -1,20 +0,0 @@
{
"SessionMetadata" : {
"OS" : "Unix 6.8.0.124",
"Guid" : "ad50ca18-0401-4f73-b2bc-60a3cf9437fb",
"MachineName" : "meiko",
"StartTime" : "2026-06-20T16:03:27.5038363+02:00",
"ProductName" : "skyscraper8.Tests"
},
"TestResult" : {
"ClassName" : "skyscraper8.Tests.NUnit.Tests.CoverageTests.DocsisCoverageTests",
"MethodName" : "BurstDescriptorTests",
"TimeTaken" : 116,
"LogOutput" : "",
"AssertionCount" : 28,
"TestId" : 1051,
"OutcomeLabel" : "",
"OutcomeSite" : 0,
"OutcomeStatus" : 2
}
}

View File

@ -1,10 +0,0 @@
v=0
o=enensys Announcement-BM-SC 3962468565 IN IP4 10.10.10.20
s=Announcement delivery session
t=0 0
a=mbms-mode:broadcast-mbsfn 61712
a=source-filter: incl IN IP4 * 10.10.10.20
a=flute-tsi:9
m=application 50001 FLUTE/UDP 0
c=IN IP4 224.0.2.20/10
b=AS:200

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.IO;
namespace skyscraper8.Tests
{
public class SanityTests
{
[Fact]
public void Test15bits()
{
byte[] bcd = new byte[] { 0xa9, 0x23 };
MemoryStream ms = new MemoryStream(bcd);
byte readUInt8 = ms.ReadUInt8();
bool msbSet = (readUInt8 & 0x80) != 0;
Assert.True(msbSet);
int result = ms.ReadUInt8();
result <<= 8;
result += readUInt8;
Assert.Equal(9001, result);
}
}
}

View File

@ -1,23 +0,0 @@
using System.Runtime.Serialization;
using skyscraper5;
namespace skyscraper8.Tests.NUnit;
public class SkyscraperTestException : SkyscraperException
{
public SkyscraperTestException()
{
}
public SkyscraperTestException(string message) : base(message)
{
}
public SkyscraperTestException(string message, Exception inner) : base(message, inner)
{
}
protected SkyscraperTestException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}

View File

@ -1,224 +0,0 @@
using System.Reflection;
using log4net;
using log4net.Core;
using log4net.Repository.Hierarchy;
using Newtonsoft.Json;
namespace skyscraper8.Tests.NUnit;
[NonParallelizable]
public class SkyscrapersTestingFramework
{
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
private Dictionary<string, DateTime> _testTimes;
private VoileOnlineTestSessionMetadata _voileOnlineTestSessionMetadata;
private VoileOnlineTestSessionMetadata GetVoileOnlineTestSessionMetadata()
{
if (_voileOnlineTestSessionMetadata == null)
{
_voileOnlineTestSessionMetadata = new VoileOnlineTestSessionMetadata();
_voileOnlineTestSessionMetadata.Guid = Guid.NewGuid();
_voileOnlineTestSessionMetadata.MachineName = Environment.MachineName;
_voileOnlineTestSessionMetadata.StartTime = DateTime.Now;
_voileOnlineTestSessionMetadata.OS = Environment.OSVersion.ToString();
_voileOnlineTestSessionMetadata.ProductName = Assembly.GetExecutingAssembly().GetName().Name;
}
return _voileOnlineTestSessionMetadata;
}
private HashSet<long> testIds;
private long ResolveTestId()
{
string testId = TestContext.CurrentContext.Test.ID;
if (testIds == null)
testIds = new HashSet<long>();
long decodedTestId = 0;
for (int i = 0; i < testId.Length; i++)
{
char current = testId[i];
if (!char.IsDigit(current))
continue;
int currentDigit = current - '0';
if (i != 0)
decodedTestId *= 10;
decodedTestId += currentDigit;
}
if (testIds.Contains(decodedTestId))
throw new SkyscraperTestException("Test ID already used");
testIds.Add(decodedTestId);
return decodedTestId;
}
private long GetTestDuration()
{
if (_testTimes == null)
return -1;
string key = TestContext.CurrentContext.Test.FullName;
if (!_testTimes.ContainsKey(key))
return -2;
return DateTime.Now.Subtract(_testTimes[key]).Milliseconds;
}
private DirectoryInfo _samplesDirectory;
private DirectoryInfo GetSamplesDirectory()
{
if (_samplesDirectory == null)
{
//Zuerst die sample_path.txt versuchen zu lesen
FileInfo fi = new FileInfo("sample_path.txt");
if (!fi.Exists)
{
logger.WarnFormat("Could not find {0}", fi.FullName);
}
else
{
logger.InfoFormat("Reading samples path from: {0}", fi.FullName);
string readAllText = File.ReadAllText(fi.FullName).Trim();
_samplesDirectory = new DirectoryInfo(readAllText);
return _samplesDirectory;
}
string userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
DirectoryInfo di = new DirectoryInfo(userProfile);
if (di.Exists)
{
userProfile = Path.Combine(di.FullName, "Dependencies");
di = new DirectoryInfo(userProfile);
if (di.Exists)
{
userProfile = Path.Combine(userProfile, "skyscraper-testsuite");
di = new DirectoryInfo(userProfile);
if (di.Exists)
{
_samplesDirectory = di;
return _samplesDirectory;
}
}
}
}
if (_samplesDirectory == null)
{
Assert.Inconclusive("Could not find samples directory");
}
return _samplesDirectory;
}
protected FileStream GetStreamSample(string filename)
{
DirectoryInfo samplesDirectory = GetSamplesDirectory();
FileInfo file = new FileInfo(Path.Combine(samplesDirectory.FullName, filename));
if (!file.Exists)
{
Assert.Inconclusive(String.Format("Could not find sample file: {0}", file.FullName));
}
return file.OpenRead();
}
[SetUp]
public void Setup()
{
if (_testTimes == null)
_testTimes = new Dictionary<string, DateTime>();
SetUpLogCapture();
string key = TestContext.CurrentContext.Test.FullName;
DateTime value = DateTime.Now;
_testTimes[key] = value;
}
[TearDown]
public void TearDown()
{
TestContext currentContext = TestContext.CurrentContext;
VoileOnlineTestResult voileOnlineTestResult = new VoileOnlineTestResult();
voileOnlineTestResult.ClassName = currentContext.Test.ClassName;
voileOnlineTestResult.MethodName = currentContext.Test.MethodName;
voileOnlineTestResult.OutcomeLabel = currentContext.Result.Outcome.Label;
voileOnlineTestResult.OutcomeSite = (int)currentContext.Result.Outcome.Site;
voileOnlineTestResult.OutcomeStatus = (int)currentContext.Result.Outcome.Status;
voileOnlineTestResult.TimeTaken = GetTestDuration();
voileOnlineTestResult.LogOutput = TearDownLogCapture();
voileOnlineTestResult.AssertionCount = currentContext.AssertCount;
voileOnlineTestResult.TestId = ResolveTestId();
VoileOnlineTestPost voileOnlinePost = new VoileOnlineTestPost();
voileOnlinePost.SessionMetadata = GetVoileOnlineTestSessionMetadata();
voileOnlinePost.TestResult = voileOnlineTestResult;
VoileOnlineUploader.Upload(voileOnlinePost);
}
public TException AssertTargetInvocation<TException>(TestDelegate action)
where TException : Exception
{
TargetInvocationException exeption = Assert.Throws<TargetInvocationException>(action);
Assert.That(exeption.InnerException, Is.TypeOf<TException>());
return (TException)exeption.InnerException;
}
private TestLog4NetAppender? _testLogAppender;
protected TestLog4NetAppender TestLogAppender =>
_testLogAppender ?? throw new InvalidOperationException("Test log appender is not initialized.");
private void SetUpLogCapture()
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
_testLogAppender = new TestLog4NetAppender
{
Name = $"TestLogAppender-{TestContext.CurrentContext.Test.ID}"
};
_testLogAppender.ActivateOptions();
hierarchy.Root.AddAppender(_testLogAppender);
if (hierarchy.Root.Level == null)
{
hierarchy.Root.Level = log4net.Core.Level.Debug;
}
hierarchy.Configured = true;
}
private string TearDownLogCapture()
{
string logText = _testLogAppender?.GetText() ?? string.Empty;
if (!string.IsNullOrWhiteSpace(logText))
{
TestContext.WriteLine("Captured log4net output:");
TestContext.WriteLine(logText);
}
if (_testLogAppender is not null)
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAppender(_testLogAppender);
_testLogAppender.Close();
_testLogAppender = null;
}
return logText;
}
protected IReadOnlyList<LoggingEvent> GetCapturedLogEvents()
{
if (_testLogAppender == null)
return new List<LoggingEvent>();
return _testLogAppender.Events;
}
}

View File

@ -1,13 +0,0 @@
using log4net.Core;
using skyscraper8.Skyscraper.Net;
using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper8.Tests.NUnit;
public class SkyscrapersTestingHarness
{
public DataStorage DataStorage { get; set; }
public ObjectStorage ObjectStorage { get; set; }
public IReadOnlyList<LoggingEvent> Events { get; set; }
public BlackholeIpTrafficHandler IpTrafficHandler { get; set; }
}

View File

@ -1,32 +0,0 @@
using log4net.Appender;
using log4net.Core;
namespace skyscraper8.Tests.NUnit;
public class TestLog4NetAppender : AppenderSkeleton
{
private List<LoggingEvent> _events;
public IReadOnlyList<LoggingEvent> Events
{
get
{
if (_events == null)
return new List<LoggingEvent>();
return _events.AsReadOnly();
}
}
protected override void Append(LoggingEvent loggingEvent)
{
loggingEvent.Fix = FixFlags.All;
if (_events == null)
_events = new List<LoggingEvent>();
_events.Add(loggingEvent);
}
public string GetText()
{
return String.Join("\n", Events.Select(e => String.Format("[{0}] {1}", e.LoggerName, e.RenderedMessage)));
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +0,0 @@
using skyscraper8.Skyscraper.Math;
namespace skyscraper8.Tests.NUnit.Tests.CoverageTests;
[TestFixture]
public class MathTests
{
[Test]
public void TestPlsConversions()
{
int originalGoldCode = 131070;
int calculatedRootCode = PlsCodeConverter.GoldToRoot(originalGoldCode);
Assert.That(calculatedRootCode, Is.EqualTo(16416));
int calculatedGoldCode = PlsCodeConverter.RootToGold(calculatedRootCode);
Assert.That(calculatedGoldCode, Is.EqualTo(originalGoldCode));
}
}

View File

@ -1,14 +0,0 @@
using skyscraper5.Mpeg2;
namespace skyscraper8.Tests.NUnit.Tests.CoverageTests;
[TestFixture]
public class Mpeg2CoverageTests : SkyscrapersTestingFramework
{
[Test]
public void PsiSectionTest()
{
PsiSection section = new PsiSection();
section.Append(new byte[] { 3 });
}
}

View File

@ -1,32 +0,0 @@
using skyscraper5.Skyscraper;
using skyscraper8.Skyscraper.Scraper.Storage.Tar;
namespace skyscraper8.Tests.NUnit.Tests.IntegrationTests;
[TestFixture]
public class SkyscraperIntegrationTests : SkyscrapersTestingFramework
{
[Test]
public void CreateTarArchive()
{
string filename = String.Format("{0}.tar", DateTime.Now.ToUnixTime());
FileInfo fi = new FileInfo(filename);
FileStream fileStream = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
fi.Refresh();
Assert.IsTrue(fi.Exists);
Random rng = new Random();
TarArchive tar = new TarArchive(fileStream);
for (int i = 0; i < 42; i++)
{
filename = String.Format("{0}.bin", i);
int randomSize = rng.Next(4096);
byte[] buffer = new byte[randomSize];
rng.NextBytes(buffer);
tar.WriteEntry(filename, buffer);
}
}
}

View File

@ -1,296 +0,0 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
using skyscraper8.Skyscraper.Net;
using skyscraper8.Skyscraper.Scraper.Storage;
using skyscraper8.Tests.NUnit;
namespace skyscraper8.Tests.NUnit.Tests;
[TestFixture]
public class RecordedSamplesTests : SkyscrapersTestingFramework
{
[Test]
public void RussianT2Mi()
{
FileStream streamSample = GetStreamSample("express_3928L_t2mi.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//42931 uncovered
Assert.True(result.DataStorage.TestForCaSystem(1, 1, 1453));
}
[Test]
public void Simmin()
{
FileStream streamSample = GetStreamSample("thor_11049v_simmin-radiomidun.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//36611 uncovered
Assert.True(result.DataStorage.TestForTerminalBurstTimePlan2(1326, 1, 0));
Assert.True(result.DataStorage.TestForBroadcastConfiguration(1326, 2));
}
[Test]
public void GseDab()
{
FileStream streamSample = GetStreamSample("thor_10717v_gse-dab.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("192.168.1.4", "239.199.2.4", 1234, 1234));
//36446 uncovered
}
[Test]
public void EarlyBrazilianNip()
{
FileStream streamSample = GetStreamSample("brazilian-dvb-nip-000000.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//35222
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_9/HLS_OUT/NIP_9-mp4a_140800=20000-begin=3403218160093331-dur=40106667-seq=85080456.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://usd.xxxoperatorxxx.com/fragments/envelope.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-mp4a_140800=20000-begin=3403218170199998-dur=39893334-seq=85080456.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("envelope.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499940_cid274499942.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_6/HLS_OUT/NIP_6-hvc1_1761664=10000-p=335204011000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499949_cid274499951.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_9/HLS_OUT/NIP_9-hvc1_1761664=10000-p=330114634000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499913_cid274499915.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_1/HLS_OUT/NIP_1-hvc1_1761664=10000-p=330114493000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499968_cid274499970.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-hvc1_1761664=10000-p=330030655000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499922_cid274499924.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_2/HLS_OUT/NIP_2-hvc1_1761664=10000-p=330114509000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid244303386_cid244303388.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_0/HLS_OUT/NIP_0-hvc1_1761664=10000-p=330114463000000-init.mp4"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499958_cid274499960.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_6/HLS_OUT/NIP_6-mp4a_140800=20000-begin=3403218200093333-dur=40106667-seq=85080457.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:NetworkInformationFile"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-mp4a_140800=20000-begin=3403218210093332-dur=40106667-seq=85080457.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.22:80/1/images.tar"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_2/HLS_OUT/NIP_2-mp4a_140800=20000-begin=3403218240093332-dur=40106667-seq=85080458.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.22:80/pages.tar"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_0/HLS_OUT/NIP_0-hvc1_1761664=10000-begin=3403218250000000-dur=40000000-seq=85080458.m4s"));
}
[Test]
public void GseNip()
{
FileStream streamSample = GetStreamSample("astra1_12441v_gse-nip.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sgc/tva_schedule_20251123100000_PT3H15M_CoreSet.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/MorningNews.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/PoliticalInsight.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/ScienceFictionShowcase.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287140.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/SportsHighlights.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000_6287143.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/TravelAdventures.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00006.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_2000_6287143.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/ComedyHour.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500_6287143.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00005.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/FitnessHour.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_1000_556702.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:NetworkInformationFile"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/cg/manifest.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:ServiceGuide"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod1/5G-MAG_v_4500_00004.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/KidsFunTime.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00009.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287141.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/RomanticEvenings.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000_6287144.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1007.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00013.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1009.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/TechTalk.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_4500_6287141.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1005.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_2000_6287144.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/DocumentaryWorld.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00017.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/Astronomy-2e.pdf"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/MysteryTheater.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00021.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_1000_556703.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1006.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/WildlifeWonders.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287142.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod1/5G-MAG_v_4500_00011.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_2000_556703.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1000.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_4500_6287142.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1011.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500_6287145.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1012.jpeg"));
//34545
}
[Test]
public void GseNip2()
{
FileStream streamSample = GetStreamSample("astra1_11141h_gse_nip.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//34462
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/xml.aitx"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/fr-sub/1763893122.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/main.js"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/playlist-audio.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/live/channel1/manifest.mpd"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893122.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/img/dvbnip.png"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/playlist-audio2.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/style.css"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/dvbi/service_list_ses_private.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/button.js"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B1/audio/881946560.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/index.html"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/A%20Better%20Super%20Bowl.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/service_list_full.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio2/1763893123.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/cg/CoreSetRelatedMaterials/programm-api.ard.de/images/MjAyNS0xMC0wMQ==/68ddba3f8ace97dd375c961b_1759361599632.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:dvb-i-slep"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/HDplus_ExtraScreen.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/img/WTqW6FTJ2.jpeg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/audio/881946561.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/live/channel1/1-2025940.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893124.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/b1.png"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/2017_SES_4K_trailer_IBC.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/service_list_tp1045.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B1/audio/881946561.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/cg/manifest.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/SES_BS.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/5G-EMERGE.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/AIT_VF-10-08-15_French.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893125.m4s"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/sg/CoreSetRelatedMaterial/programm-api.ard.de/images/MjAyNS0wOS0xMA==/68c20b38bc0414230a56325d_1757547321028.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/b2.png"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/Welcome%20to%20Luxembourg.jpg"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/audio/881946562.m4s"));
}
[Test]
public void TsNipIncludingLegacyChannel()
{
FileStream streamSample = GetStreamSample("hotbird_12380v_nip.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//33518
Assert.IsTrue(result.DataStorage.TestForCaSystem(318, 8400, 7104));
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("0.0.0.0", "224.1.1.103", 0, 16301));
Assert.IsTrue(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/rai.it/s0/5G-EMERGE/Live/dash/crits_linear/crits_linear_v_4500_001114520.mp4"));
}
[Test]
public void TsNip()
{
FileStream streamSample = GetStreamSample("hotbird_12226v_nip.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//33518
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_tamazight_tccybxt/playlist.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_arryadia_k2tgcj0_480p/playlist.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/index.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_arrabia_hthcj4p/playlist.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch008/hls-sb/index.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87687000_23699.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_aloula_w1dqfwm/playlist.m3u8"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_tamazight_tccybxt/corp/73_tamazight_tccybxt_480p/l_22569_7413000_17779.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87690000_23700.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch007/hls-sb/keyframes/orp01-ten999-ch007-video=2580000-440974019.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_360p/l_43705_87690000_23700.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/keyframes/orp01-ten999-ch009-video=2600000-440974020.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_arrabia_hthcj4p/corp/73_arrabia_hthcj4p_480p/l_43737_7398000_23696.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_aloula_w1dqfwm/l_43669_7389881_23706.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_480p/l_43701_87690000_23700.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_arryadia_k2tgcj0_480p/l_22601_52377000_17770.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87693000_23701.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("envelope.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid8331_cid8335.xml"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_480p/l_43701_87693000_23701.ts"));
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/orp01-ten999-ch009-audio_133600_eng=131600-video=2600000-440974020.ts"));
}
[Test]
public void GseRcs2()
{
FileStream streamSample = GetStreamSample("telstar12v-bfbs-000000.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
//32559
Assert.True(result.DataStorage.TestForTerminalBurstTimePlan2(65281, 5, 0));
Assert.True(result.DataStorage.TestForBroadcastConfiguration(65281, 2));
Assert.True(result.IpTrafficHandler.TestForUdpTraffic("192.168.19.50", "238.1.1.1", 1024, 4000));
}
[Test]
public void BadrDvbSis()
{
FileStream streamSample = GetStreamSample("badr_12563v_dvb-sis.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
Assert.True(result.ObjectStorage.TestForSisDsaci(136, 26, 1, 13));
}
[Test]
public void Eutelsat5DvbSis()
{
FileStream streamSample = GetStreamSample("eutelsat5_12522v_dvb-sis.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
Assert.True(result.ObjectStorage.TestForSisDsaci(1375, 20700, 9, 17));
}
[Test]
public void Kira7Patchday()
{
FileStream streamSample = GetStreamSample("kira7.ts");
SkyscrapersTestingHarness result = ProcessSample(streamSample);
streamSample.Close();
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("192.168.1.48", "224.0.0.252", 62983, 5355));
Assert.IsTrue(result.IpTrafficHandler.TestForLlcTraffic("ff:ff:ff:ff:ff:ff", 8, 0, 0));
}
private SkyscrapersTestingHarness ProcessSample(Stream sample)
{
TsContext ts = new TsContext();
InMemoryScraperStorageFactory inMemoryStorageFactory = new InMemoryScraperStorageFactory();
DataStorage dataStorage = inMemoryStorageFactory.CreateDataStorage();
ObjectStorage blackholeObjectStorage = new BlackholeObjectStorage();
BlackholeIpTrafficHandler ipTrafficHandler = new BlackholeIpTrafficHandler();
SkyscraperContext context = new SkyscraperContext(ts, dataStorage, blackholeObjectStorage);
context.InitalizeFilterChain();
context.OverrideIpTrafficHandler(ipTrafficHandler);
context.IngestFromStream(sample);
SkyscrapersTestingHarness harness = new SkyscrapersTestingHarness();
harness.DataStorage = dataStorage;
harness.ObjectStorage = blackholeObjectStorage;
harness.Events = GetCapturedLogEvents();
harness.IpTrafficHandler = ipTrafficHandler;
return harness;
}
}

View File

@ -1,18 +0,0 @@
using skyscraper8.GS;
using skyscraper8.GS.GSE_RollingSyncByte;
using skyscraper8.GSE;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
[TestFixture]
public class GsResourceTests
{
[Test]
public void TestShortPdu()
{
byte[] datasource = Properties.Resources.Frame00000357_TSGS1_MIS000_SYNC184;
GsContextDto dto = new GsContextDto();
GseWithRollingSyncByteReader reader = new GseWithRollingSyncByteReader(dto);
reader.PushFrame(new BBHeader(new byte[10], 0), datasource);
}
}

View File

@ -1,17 +0,0 @@
using skyscraper8.Ietf.Rfc4566_SDP;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
[TestFixture]
public class IetfSdpResourceTests : SkyscrapersTestingFramework
{
[Test]
public void TestSdpParser()
{
MemoryStream ms = new MemoryStream(Properties.Resources.sdpTest, false);
Assert.IsTrue(SDP.IsSDP(ms));
SDP loaded = SDP.Load(ms);
Assert.IsNotNull(loaded);
}
}

View File

@ -1,30 +0,0 @@
using skyscraper5.Mpeg2;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
[TestFixture]
public class Mpeg2ResourceTests
{
[Test]
public void CheckBfbsCrc()
{
byte[] blob = Properties.Resources.Frame00001343_TSGS1_MIS000_SYNC001;
MemoryStream ms = new MemoryStream(blob, false);
bool result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
Assert.IsTrue(result);
blob = Properties.Resources.Frame00000008_TSGS1_MIS000_SYNC001;
ms = new MemoryStream(blob, false);
result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
Assert.IsTrue(result);
}
[Test]
public void CheckBfbsCrcSpan()
{
byte[] blob = Properties.Resources.Frame00000012_TSGS1_MIS000_SYNC001;
ReadOnlySpan<byte> span = new ReadOnlySpan<byte>(blob);
bool result = DvbCrc32.ValidateCrc(span);
Assert.IsTrue(result);
}
}

View File

@ -1,39 +0,0 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
[TestFixture]
public class SkyscraperResourceTests : SkyscrapersTestingFramework
{
[Test]
public void RunTestPatterns()
{
byte[][] buffers = new byte[][]
{
Properties.Resources.test_1packet_01,
Properties.Resources.test_2packets_02_03,
Properties.Resources.test_3packets_04_05_06
};
InMemoryScraperStorageFactory imssf = new InMemoryScraperStorageFactory();
foreach (byte[] buffer in buffers)
{
TsContext mpeg2 = new TsContext();
DataStorage ds = new InMemoryScraperStorageFactory().CreateDataStorage();
ObjectStorage os = new BlackholeObjectStorage();
SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, ds, os);
MemoryStream ms = new MemoryStream(buffer, false);
skyscraper.InitalizeFilterChain();
skyscraper.IngestFromStream(ms);
ms.Close();
ms.Dispose();
}
}
}

View File

@ -1,21 +0,0 @@
using System.Text;
using Newtonsoft.Json;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
[TestFixture]
public class TestingTests
{
[Test]
public void ReadVoileOnlineTest()
{
byte[] buffer = Properties.Resources.ExampleVoileOnlinePost;
VoileOnlineTestPost? voileOnlineTestPost = JsonConvert.DeserializeObject<VoileOnlineTestPost>(Encoding.UTF8.GetString(buffer));
Assert.IsNotNull(voileOnlineTestPost);
Assert.IsNotNull(voileOnlineTestPost.SessionMetadata);
Assert.IsNotNull(voileOnlineTestPost.TestResult);
Assert.AreEqual(2, voileOnlineTestPost.TestResult.OutcomeStatus);
Assert.AreEqual("meiko",voileOnlineTestPost.SessionMetadata.MachineName);
}
}

View File

@ -0,0 +1,36 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
using skyscraper8.Tests.Properties;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Tests
{
public class TsDuckTestPatterns
{
[Fact]
public void RunTestPatterns()
{
byte[][] buffers = new byte[][] { Resources.test_1packet_01, Resources.test_2packets_02_03, Resources.test_3packets_04_05_06 };
InMemoryScraperStorageFactory imssf = new InMemoryScraperStorageFactory();
foreach (byte[] buffer in buffers)
{
TsContext mpeg2 = new TsContext();
SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, null, null);
MemoryStream ms = new MemoryStream(buffer, false);
skyscraper.InitalizeFilterChain();
skyscraper.IngestFromStream(ms);
ms.Close();
ms.Dispose();
}
}
}
}

View File

@ -1,7 +0,0 @@
namespace skyscraper8.Tests.NUnit;
public class VoileOnlineTestPost
{
public VoileOnlineTestSessionMetadata SessionMetadata { get; set; }
public VoileOnlineTestResult TestResult { get; set; }
}

View File

@ -1,16 +0,0 @@
using NUnit.Framework.Interfaces;
namespace skyscraper8.Tests.NUnit;
public class VoileOnlineTestResult
{
public string? ClassName { get; set; }
public string? MethodName { get; set; }
public long TimeTaken { get; set; }
public string LogOutput { get; set; }
public int AssertionCount { get; set; }
public long TestId { get; set; }
public string OutcomeLabel { get; set; }
public int OutcomeSite { get; set; }
public int OutcomeStatus { get; set; }
}

View File

@ -1,10 +0,0 @@
namespace skyscraper8.Tests.NUnit;
public class VoileOnlineTestSessionMetadata
{
public string OS { get; set; }
public Guid Guid { get; set; }
public string MachineName { get; set; }
public DateTime StartTime { get; set; }
public string? ProductName { get; set; }
}

View File

@ -1,84 +0,0 @@
using Newtonsoft.Json;
namespace skyscraper8.Tests.NUnit;
public sealed class VoileOnlineUploader
{
public static void Upload(VoileOnlineTestPost voileOnlinePost)
{
if (_instance == null)
{
_instance = new VoileOnlineUploader();
}
_instance.PushResult(voileOnlinePost);
}
private static VoileOnlineUploader _instance;
private Thread _uploaderThread;
private Queue<VoileOnlineTestPost> _queue;
private void PushResult(VoileOnlineTestPost voileOnlinePost)
{
if (_queue == null)
_queue = new Queue<VoileOnlineTestPost>();
lock (_queue)
{
_queue.Enqueue(voileOnlinePost);
}
if (_uploaderThread == null)
{
_uploaderThread = new Thread(PusherThread);
_uploaderThread.Priority = ThreadPriority.Lowest;
_uploaderThread.Name = "VoileOnlineUploader";
}
switch (_uploaderThread.ThreadState)
{
case ThreadState.Unstarted:
_uploaderThread.Start();
break;
case ThreadState.Running:
break;
case ThreadState.Stopped:
_uploaderThread = new Thread(PusherThread);
_uploaderThread.Priority = ThreadPriority.Lowest;
_uploaderThread.Name = "VoileOnlineUploader";
_uploaderThread.Start();
break;
default:
throw new NotImplementedException(String.Format("ThreadState: {0}", _uploaderThread.ThreadState));
}
}
private void PusherThread()
{
int numElements = 0;
lock (_queue)
{
numElements = _queue.Count;
}
while (numElements > 0)
{
VoileOnlineTestPost voileOnlinePost;
lock (_queue)
{
voileOnlinePost = _queue.Dequeue();
}
string json = JsonConvert.SerializeObject(voileOnlinePost);
DoPost(json);
lock (_queue)
{
numElements = _queue.Count;
}
}
}
private void DoPost(string json)
{
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
@ -7,15 +7,28 @@
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject> <IsTestProject>true</IsTestProject>
<RootNamespace>skyscraper8.Tests.NUnit</RootNamespace>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" /> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PackageReference Include="NUnit" Version="3.13.3" /> <PrivateAssets>all</PrivateAssets>
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" /> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" /> </PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Xunit.SkippableFact" Version="1.5.23" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\skyscraper8\skyscraper8.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -24,15 +37,6 @@
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon> <DependentUpon>Resources.resx</DependentUpon>
</Compile> </Compile>
<Compile Update="Resources1.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources1.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\skyscraper8\skyscraper8.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -51,6 +51,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.DNS", "MpePlugi
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.Gimmicks.IptvCollector", "Gimmicks\skyscraper5.Gimmicks.IptvCollector\skyscraper5.Gimmicks.IptvCollector.csproj", "{8F17668C-623C-F9B3-EAD4-2922E5414B75}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.Gimmicks.IptvCollector", "Gimmicks\skyscraper5.Gimmicks.IptvCollector\skyscraper5.Gimmicks.IptvCollector.csproj", "{8F17668C-623C-F9B3-EAD4-2922E5414B75}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests", "skyscraper8.Tests\skyscraper8.Tests.csproj", "{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UIs", "UIs", "{E23457C5-3A34-48EE-8107-C91E2C174B2D}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UIs", "UIs", "{E23457C5-3A34-48EE-8107-C91E2C174B2D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.UI.WindowsForms", "GUIs\skyscraper5.UI\skyscraper5.UI.WindowsForms.csproj", "{46CACA1C-F9B2-2FE0-2068-716F381325E9}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.UI.WindowsForms", "GUIs\skyscraper5.UI\skyscraper5.UI.WindowsForms.csproj", "{46CACA1C-F9B2-2FE0-2068-716F381325E9}"
@ -65,8 +67,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame", "
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame.Bridge", "GUIs\skyscraper8.UI.ImGui.MonoGame.Bridge\skyscraper8.UI.MonoGame.Bridge.csproj", "{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame.Bridge", "GUIs\skyscraper8.UI.ImGui.MonoGame.Bridge\skyscraper8.UI.MonoGame.Bridge.csproj", "{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests", "skyscraper8.Tests\skyscraper8.Tests.csproj", "{5FB2AA76-580E-4343-B155-5D596DDC27F2}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -78,75 +78,97 @@ Global
{8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.ActiveCfg = Release|Any CPU {8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.Build.0 = Release|Any CPU {8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.Build.0 = Release|Any CPU
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.ActiveCfg = Release|Any CPU {E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.Build.0 = Release|Any CPU {E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.Build.0 = Release|Any CPU
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1015ACF1-E812-5410-66A5-E92DE682D2C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.Build.0 = Release|Any CPU {1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.Build.0 = Release|Any CPU
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4262F19-0648-A1A1-3D62-748A45BC5329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.Build.0 = Release|Any CPU {C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.Build.0 = Release|Any CPU
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B8696DA-8A81-8F1F-9463-49C727959EDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.Build.0 = Release|Any CPU {1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.Build.0 = Release|Any CPU
{68EB7299-FC65-654E-B972-D79514B91BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68EB7299-FC65-654E-B972-D79514B91BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68EB7299-FC65-654E-B972-D79514B91BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.Build.0 = Release|Any CPU {68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.Build.0 = Release|Any CPU
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.ActiveCfg = Release|Any CPU {60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.ActiveCfg = Release|Any CPU
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.Build.0 = Release|Any CPU {60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.Build.0 = Release|Any CPU
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.ActiveCfg = Release|Any CPU {71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.Build.0 = Release|Any CPU {71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.Build.0 = Release|Any CPU
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.Build.0 = Release|Any CPU {AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.Build.0 = Release|Any CPU
{868A7453-E1B7-A619-F447-41E42420405C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {868A7453-E1B7-A619-F447-41E42420405C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{868A7453-E1B7-A619-F447-41E42420405C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.ActiveCfg = Release|Any CPU {868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.Build.0 = Release|Any CPU {868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.Build.0 = Release|Any CPU
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.ActiveCfg = Release|Any CPU {2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.Build.0 = Release|Any CPU {2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.Build.0 = Release|Any CPU
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.ActiveCfg = Release|Any CPU {96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.Build.0 = Release|Any CPU {96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.Build.0 = Release|Any CPU
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17C2E095-B952-8919-2C68-F2EAA7A601C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.Build.0 = Release|Any CPU {17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.Build.0 = Release|Any CPU
{07214423-32B2-DDE8-8D38-511D55ADC206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07214423-32B2-DDE8-8D38-511D55ADC206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07214423-32B2-DDE8-8D38-511D55ADC206}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.ActiveCfg = Release|Any CPU {07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.Build.0 = Release|Any CPU {07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.Build.0 = Release|Any CPU
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0E4C7079-228A-B94C-379A-8A14B08BAB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.ActiveCfg = Release|Any CPU {0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.Build.0 = Release|Any CPU {0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.Build.0 = Release|Any CPU
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.Build.0 = Release|Any CPU {3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.Build.0 = Release|Any CPU
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F17668C-623C-F9B3-EAD4-2922E5414B75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.Build.0 = Release|Any CPU {8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.Build.0 = Release|Any CPU
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.Build.0 = Debug|Any CPU
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.ActiveCfg = Release|Any CPU
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.Build.0 = Release|Any CPU
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46CACA1C-F9B2-2FE0-2068-716F381325E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.Build.0 = Release|Any CPU {46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.Build.0 = Release|Any CPU
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.ActiveCfg = Release|Any CPU {BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.Build.0 = Release|Any CPU {BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.Build.0 = Release|Any CPU
{CF21D250-9804-4191-89F5-95821E3AF39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF21D250-9804-4191-89F5-95821E3AF39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF21D250-9804-4191-89F5-95821E3AF39D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.ActiveCfg = Release|Any CPU {CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.Build.0 = Release|Any CPU {CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.Build.0 = Release|Any CPU
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.ActiveCfg = Release|Any CPU {EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.Build.0 = Release|Any CPU {EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.Build.0 = Release|Any CPU
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {839C3783-020F-77D6-C22C-D50DCC97CDD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.ActiveCfg = Release|Any CPU {839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.Build.0 = Release|Any CPU {839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.Build.0 = Release|Any CPU
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.Build.0 = Release|Any CPU {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.Build.0 = Release|Any CPU
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -1,84 +1,12 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAllureContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fc09614b59cc98c343d268f55e356aaafe85d13755cd5ca217988e9c5362ff_003FAllureContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAllureFeatureAttribute_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F405349a6f42433abaa8b1d6d06bb6f21c66899533fa9f9648cb1cde8755143_003FAllureFeatureAttribute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArgumentNullException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Ff2_003F6872d84e_003FArgumentNullException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArray_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6e_003Fd247db11_003FArray_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArray_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6e_003Fd247db11_003FArray_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F053cba69424c47858472194d509c3cdc12bb0_003F37_003F58cc70f4_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa840692e98b74557bc005b38213a22c72dad0_003Fc8_003F58c2e0c9_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F62bb4746d7d14dc1cd4274a28788572a7a4641bd3a7d5736479c9697bcb4794_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002EInconclusive_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F8e305e26401afcd395b5be2da0e23d61432655dc5f2c2e5e6d5bd873bb0cb90_003FAssert_002EInconclusive_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002EThrowsException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fe6930caf46f7fcaa445fdd26a3884170a45a4766298259e7a29bae560adef_003FAssert_002EThrowsException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABeforeAndAfterTestCommand_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff536671e825030c7f17fbf3f75511651c281f2429edc8fd6ea660418f825949_003FBeforeAndAfterTestCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACultureInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F8e_003Fe58e5b4a_003FCultureInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F83_003Fc73c45bc_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F4a_003Ff8de026f_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFastResourceComparer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F8f_003Ffb4ed86c_003FFastResourceComparer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F5a_003Fcf76af61_003FFileInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F5a_003Fcf76af61_003FFileInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDisposable_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ff98216d3aaee47d6a9f523673a3ec107d83a00_003F_005Fbb40f_003FIDisposable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AInterop_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fea_003F7d70064b_003FInterop_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AJsonSerializerInternalReader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F52f3815551fa6e6d408ea7dbf6748f7efe35caea15eb53ee27ee1bb406d62c8_003FJsonSerializerInternalReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6b_003Fa410ee2c_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6b_003Fa410ee2c_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AManifestBasedResourceGroveler_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003F06_003F506a7cf8_003FManifestBasedResourceGroveler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemberInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fce_003F751a2c1f_003FMemberInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemoryStream_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F068af3a6_003FMemoryStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemoryStream_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F068af3a6_003FMemoryStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3ad82f9910d5c82d76b445db10584a60305639dcad2533e08e6c47f85e3b6d83_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F7a_003F86728bdc_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003Fc3_003F355fe836_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkStream_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F02ece58f2cb8b2c950c683cf599a9e387c8c8bd47c4514c6534331316be3_003FNetworkStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANotImplementedException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fa3_003F2c4f9089_003FNotImplementedException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullable_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F6549c49b_003FNullable_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullable_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F6549c49b_003FNullable_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullAsserts_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3f4719f7ce375226774d6991a6afc2f6932e58b42fd58ff13c7c03771642e_003FNullAsserts_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AObject_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F55_003F6efc7017_003FObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AObject_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F55_003F6efc7017_003FObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AQueue_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fb6_003F498e7c75_003FQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AQueue_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fb6_003F498e7c75_003FQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AReadOnlyDictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F1270c638_003FReadOnlyDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AResourceManager_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0c_003Fb548fbc6_003FResourceManager_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeInformation_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F4c_003F5f771d10_003FRuntimeInformation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeResourceSet_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fe1_003Ff15f6bbe_003FRuntimeResourceSet_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASafeFileHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fc6_003Fd8e0f2f2_003FSafeFileHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASafeFileHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F95_003Ff0feb47b_003FSafeFileHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASkip_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fd8c543d93f1559af2ea2be8e9d55839b5bb1a3605f22daa45ea63772e3b4bc_003FSkip_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASocket_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6879915f5af210e93c5b87791d557eb99403cbfe54398263cd7efae55e3a67_003FSocket_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASpan_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F48f7bf031b2942d3831d66d46fe3bc99b2e200_003F49_003F017cad58_003FSpan_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASpan_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F35_003F161711de_003FSpan_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASR_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F4d_003F7edc51d9_003FSR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AString_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F2e_003F1a14f40f_003FString_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATestMethodInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F9ea467e7c7b4671a214143293021e7ec337916b71125d896e17a0b7fc_003FTestMethodInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003F9e_003F4a40121f_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6780d13016c376c4491c5618b257d84da7eacf747ed2719783e775546b79b_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Feb_003F3c476997_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Feb_003F3c476997_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F4f_003F7bfc5050_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F4f_003F7bfc5050_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffb63d7b4f026464dbf9b2db60c7f76bc2ac00_003Fbd_003F4080deac_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATuple_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F9f_003F0d16f921_003FTuple_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATuple_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F9f_003F0d16f921_003FTuple_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AXmlSerializer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7d5324401ccb48a5b32c2bfdf42662547b5800_003Fb2_003F4570db6a_003FXmlSerializer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String></wpf:ResourceDictionary>
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer&gt;
&lt;Assembly Path="/home/schiemas/.dotnet/packs/Microsoft.NETCore.App.Ref/8.0.21/ref/net8.0/System.Windows.dll" /&gt;
&lt;Assembly Path="/home/schiemas/.nuget/packages/allure.net.commons/2.14.1/lib/netstandard2.0/Allure.Net.Commons.dll" /&gt;
&lt;/AssemblyExplorer&gt;</s:String>
<s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">/home/schiemas/.cache/JetBrains/Rider2025.1/resharper-host/temp/Rider/vAny/CoverageData/_skyscraper8.1808907683/Snapshot/snapshot.utdcvr</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ce70f33b_002D9024_002D4750_002Da24e_002D78f4e8e5e879/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from &amp;lt;skyscraper8.Tests&amp;gt;" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;Solution /&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002ENUnit_002FProperties_002FResources/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002ENUnit_002FProperties_002FResources/@EntryIndexRemoved">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002FProperties_002FResources/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002FResources1/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ResxEditorPersonal/ShowOnlyErrors/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/UnloadedProject/UnloadedProjects/=46caca1c_002Df9b2_002D2fe0_002D2068_002D716f381325e9_0023skyscraper5_002EUI_002EWindowsForms/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UnloadedProject/UnloadedProjects/=ebb6b1cf_002D2597_002D4962_002Daa31_002D2b42b4c28c7d_0023skyscraper8_002EAnagramViewer/@EntryIndexedValue">True</s:Boolean>
</wpf:ResourceDictionary>

Some files were not shown because too many files have changed in this diff Show More