diff --git a/SabreTools.Models/ClrMamePro/Archive.cs b/SabreTools.Models/ClrMamePro/Archive.cs
new file mode 100644
index 00000000..0d0c3d02
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Archive.cs
@@ -0,0 +1,9 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// archive
+ public class Archive
+ {
+ /// name
+ public string Name { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/BiosSet.cs b/SabreTools.Models/ClrMamePro/BiosSet.cs
new file mode 100644
index 00000000..1ed7804a
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/BiosSet.cs
@@ -0,0 +1,15 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// biosset
+ public class BiosSet
+ {
+ /// name
+ public string Name { get; set; }
+
+ /// description
+ public string Description { get; set; }
+
+ /// default
+ public string? Default { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/ClrMamePro.cs b/SabreTools.Models/ClrMamePro/ClrMamePro.cs
new file mode 100644
index 00000000..27916c10
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/ClrMamePro.cs
@@ -0,0 +1,51 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// clrmamepro
+ public class ClrMamePro
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// rootdir
+ public string? RootDir { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// version
+ public string? Version { get; set; }
+
+ /// date
+ public string? Date { get; set; }
+
+ /// author
+ public string? Author { get; set; }
+
+ /// homepage
+ public string? Homepage { get; set; }
+
+ /// url
+ public string? Url { get; set; }
+
+ /// comment
+ public string? Comment { get; set; }
+
+ /// header
+ public string? Header { get; set; }
+
+ /// type
+ public string? Type { get; set; }
+
+ /// forcemerging
+ public string? ForceMerging { get; set; }
+
+ /// forcezipping
+ public string? ForceZipping { get; set; }
+
+ /// forcepacking
+ public string? ForcePacking { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Disk.cs b/SabreTools.Models/ClrMamePro/Disk.cs
new file mode 100644
index 00000000..91092fb5
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Disk.cs
@@ -0,0 +1,21 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// disk
+ public class Disk
+ {
+ /// name
+ public string Name { get; set; }
+
+ /// md5
+ public string? MD5 { get; set; }
+
+ /// sha1
+ public string? SHA1 { get; set; }
+
+ /// merge
+ public string? Merge { get; set; }
+
+ /// status
+ public string? Status { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Game.cs b/SabreTools.Models/ClrMamePro/Game.cs
new file mode 100644
index 00000000..273979df
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Game.cs
@@ -0,0 +1,55 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// game
+ public class Game
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// year
+ public string? Year { get; set; }
+
+ /// manufacturer
+ public string? Manufacturer { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// cloneof
+ public string? CloneOf { get; set; }
+
+ /// romof
+ public string? RomOf { get; set; }
+
+ /// sampleof
+ public string? SampleOf { get; set; }
+
+ /// release
+ public Release[]? Release { get; set; }
+
+ /// biosset
+ public BiosSet[]? BiosSet { get; set; }
+
+ /// rom
+ public Rom[]? Rom { get; set; }
+
+ /// disk
+ public Disk[]? Disk { get; set; }
+
+ /// sample
+ public Sample[]? Sample { get; set; }
+
+ /// archive
+ public Archive[]? Archive { get; set; }
+
+ #region Aaru Extensions
+
+ /// media; Appears after Disk
+ public Media[]? Media { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Machine.cs b/SabreTools.Models/ClrMamePro/Machine.cs
new file mode 100644
index 00000000..5d98a57d
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Machine.cs
@@ -0,0 +1,55 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// machine
+ public class Machine
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// year
+ public string? Year { get; set; }
+
+ /// manufacturer
+ public string? Manufacturer { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// cloneof
+ public string? CloneOf { get; set; }
+
+ /// romof
+ public string? RomOf { get; set; }
+
+ /// sampleof
+ public string? SampleOf { get; set; }
+
+ /// release
+ public Release[]? Release { get; set; }
+
+ /// biosset
+ public BiosSet[]? BiosSet { get; set; }
+
+ /// rom
+ public Rom[]? Rom { get; set; }
+
+ /// disk
+ public Disk[]? Disk { get; set; }
+
+ /// sample
+ public Sample[]? Sample { get; set; }
+
+ /// archive
+ public Archive[]? Archive { get; set; }
+
+ #region Aaru Extensions
+
+ /// media; Appears after Disk
+ public Media[]? Media { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Media.cs b/SabreTools.Models/ClrMamePro/Media.cs
new file mode 100644
index 00000000..2e953474
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Media.cs
@@ -0,0 +1,21 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// media
+ public class Media
+ {
+ /// name
+ public string Name { get; set; }
+
+ /// md5
+ public string? MD5 { get; set; }
+
+ /// sha1
+ public string? SHA1 { get; set; }
+
+ /// sha256
+ public string? SHA256 { get; set; }
+
+ /// spamsum
+ public string? SpamSum { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Release.cs b/SabreTools.Models/ClrMamePro/Release.cs
new file mode 100644
index 00000000..a3756858
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Release.cs
@@ -0,0 +1,21 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// release
+ public class Release
+ {
+ /// name
+ public string Name { get; set; }
+
+ /// region
+ public string Region { get; set; }
+
+ /// language
+ public string? Language { get; set; }
+
+ /// date
+ public string? Date { get; set; }
+
+ /// default
+ public string? Default { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Resource.cs b/SabreTools.Models/ClrMamePro/Resource.cs
new file mode 100644
index 00000000..380df337
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Resource.cs
@@ -0,0 +1,55 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// resource
+ public class Resource
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// year
+ public string? Year { get; set; }
+
+ /// manufacturer
+ public string? Manufacturer { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// cloneof
+ public string? CloneOf { get; set; }
+
+ /// romof
+ public string? RomOf { get; set; }
+
+ /// sampleof
+ public string? SampleOf { get; set; }
+
+ /// release
+ public Release[]? Release { get; set; }
+
+ /// biosset
+ public BiosSet[]? BiosSet { get; set; }
+
+ /// rom
+ public Rom[]? Rom { get; set; }
+
+ /// disk
+ public Disk[]? Disk { get; set; }
+
+ /// sample
+ public Sample[]? Sample { get; set; }
+
+ /// archive
+ public Archive[]? Archive { get; set; }
+
+ #region Aaru Extensions
+
+ /// media; Appears after Disk
+ public Media[]? Media { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Rom.cs b/SabreTools.Models/ClrMamePro/Rom.cs
new file mode 100644
index 00000000..89fd04f4
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Rom.cs
@@ -0,0 +1,76 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// rom
+ public class Rom
+ {
+ /// name
+ public string Name { get; set; }
+
+ /// size
+ public long Size { get; set; }
+
+ /// crc
+ public string? CRC { get; set; }
+
+ /// md5
+ public string? MD5 { get; set; }
+
+ /// sha1
+ public string? SHA1 { get; set; }
+
+ /// merge
+ public string? Merge { get; set; }
+
+ /// status
+ public string? Status { get; set; }
+
+ /// date
+ public string? Date { get; set; }
+
+ #region Hash Extensions
+
+ /// sha256; Also in No-Intro spec; Appears after SHA1
+ public string? SHA256 { get; set; }
+
+ /// sha384; Appears after SHA256
+ public string? SHA384 { get; set; }
+
+ /// sha512; Appears after SHA384
+ public string? SHA512 { get; set; }
+
+ /// spamsum; Appears after SHA512
+ public string? SpamSum { get; set; }
+
+ #endregion
+
+ #region DiscImgeCreator Extensions
+
+ /// xxh3_64; Appears after SpamSum
+ public string? xxHash364 { get; set; }
+
+ /// xxh3_128; Appears after xxHash364
+ public string? xxHash3128 { get; set; }
+
+ #endregion
+
+ #region No-Intro Extensions
+
+ /// serial; Appears after Status
+ public string? Serial { get; set; }
+
+ /// header; Appears after Serial
+ public string? Header { get; set; }
+
+ #endregion
+
+ #region RomVault Extensions
+
+ /// inverted; Boolean; Appears after Date
+ public bool? Inverted { get; set; }
+
+ /// mia; Boolean; Appears after Inverted
+ public bool? MIA { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/RomVault.cs b/SabreTools.Models/ClrMamePro/RomVault.cs
new file mode 100644
index 00000000..7975ff40
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/RomVault.cs
@@ -0,0 +1,51 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// romvault
+ public class RomVault
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// rootdir
+ public string? RootDir { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// version
+ public string? Version { get; set; }
+
+ /// date
+ public string? Date { get; set; }
+
+ /// author
+ public string? Author { get; set; }
+
+ /// homepage
+ public string? Homepage { get; set; }
+
+ /// url
+ public string? Url { get; set; }
+
+ /// comment
+ public string? Comment { get; set; }
+
+ /// header
+ public string? Header { get; set; }
+
+ /// type
+ public string? Type { get; set; }
+
+ /// forcemerging
+ public string? ForceMerging { get; set; }
+
+ /// forcezipping
+ public string? ForceZipping { get; set; }
+
+ /// forcepacking
+ public string? ForcePacking { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Sample.cs b/SabreTools.Models/ClrMamePro/Sample.cs
new file mode 100644
index 00000000..18652514
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Sample.cs
@@ -0,0 +1,9 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// sample
+ public class Sample
+ {
+ /// name
+ public string Name { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/ClrMamePro/Set.cs b/SabreTools.Models/ClrMamePro/Set.cs
new file mode 100644
index 00000000..f727ce58
--- /dev/null
+++ b/SabreTools.Models/ClrMamePro/Set.cs
@@ -0,0 +1,55 @@
+namespace SabreTools.Models.ClrMamePro
+{
+ /// set
+ public class Set
+ {
+ /// name
+ public string? Name { get; set; }
+
+ /// description
+ public string? Description { get; set; }
+
+ /// year
+ public string? Year { get; set; }
+
+ /// manufacturer
+ public string? Manufacturer { get; set; }
+
+ /// category
+ public string? Category { get; set; }
+
+ /// cloneof
+ public string? CloneOf { get; set; }
+
+ /// romof
+ public string? RomOf { get; set; }
+
+ /// sampleof
+ public string? SampleOf { get; set; }
+
+ /// release
+ public Release[]? Release { get; set; }
+
+ /// biosset
+ public BiosSet[]? BiosSet { get; set; }
+
+ /// rom
+ public Rom[]? Rom { get; set; }
+
+ /// disk
+ public Disk[]? Disk { get; set; }
+
+ /// sample
+ public Sample[]? Sample { get; set; }
+
+ /// archive
+ public Archive[]? Archive { get; set; }
+
+ #region Aaru Extensions
+
+ /// media; Appears after Disk
+ public Media[]? Media { get; set; }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/Hashfile.cs b/SabreTools.Models/Hashfile/Hashfile.cs
new file mode 100644
index 00000000..3dd5f4e2
--- /dev/null
+++ b/SabreTools.Models/Hashfile/Hashfile.cs
@@ -0,0 +1,20 @@
+namespace SabreTools.Models.Hashfile
+{
+ /// Hashfiles can only contain one type of hash at a time
+ public class Hashfile
+ {
+ public SFV[]? SFV { get; set; }
+
+ public MD5[]? MD5 { get; set; }
+
+ public SHA1[]? SHA1 { get; set; }
+
+ public SHA256[]? SHA256 { get; set; }
+
+ public SHA384[]? SHA384 { get; set; }
+
+ public SHA512[]? SHA512 { get; set; }
+
+ public SpamSum[]? SpamSum { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/MD5.cs b/SabreTools.Models/Hashfile/MD5.cs
new file mode 100644
index 00000000..45a8fa83
--- /dev/null
+++ b/SabreTools.Models/Hashfile/MD5.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// MD5 File
+ ///
+ public class MD5
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SFV.cs b/SabreTools.Models/Hashfile/SFV.cs
new file mode 100644
index 00000000..50ec621e
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SFV.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// File CRC
+ ///
+ public class SFV
+ {
+ public string File { get; set; }
+
+ public string Hash { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SHA1.cs b/SabreTools.Models/Hashfile/SHA1.cs
new file mode 100644
index 00000000..df7008a7
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SHA1.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// SHA-1 File
+ ///
+ public class SHA1
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SHA256.cs b/SabreTools.Models/Hashfile/SHA256.cs
new file mode 100644
index 00000000..1761443b
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SHA256.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// SHA-256 File
+ ///
+ public class SHA256
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SHA384.cs b/SabreTools.Models/Hashfile/SHA384.cs
new file mode 100644
index 00000000..ab393ecf
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SHA384.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// SHA-384 File
+ ///
+ public class SHA384
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SHA512.cs b/SabreTools.Models/Hashfile/SHA512.cs
new file mode 100644
index 00000000..bcd2055c
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SHA512.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// SHA-512 File
+ ///
+ public class SHA512
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.Models/Hashfile/SpamSum.cs b/SabreTools.Models/Hashfile/SpamSum.cs
new file mode 100644
index 00000000..c3a9363e
--- /dev/null
+++ b/SabreTools.Models/Hashfile/SpamSum.cs
@@ -0,0 +1,12 @@
+namespace SabreTools.Models.Hashfile
+{
+ ///
+ /// SpamSum File
+ ///
+ public class SpamSum
+ {
+ public string Hash { get; set; }
+
+ public string File { get; set; }
+ }
+}
\ No newline at end of file