[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: [Sicos1977]\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n.vs/\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\nx64/\nbuild/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Roslyn cache directories\n*.ide/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n#NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding addin-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n## TODO: Comment the next line if you want to checkin your\n## web deploy settings but do note that will include unencrypted\n## passwords\n#*.pubxml\n\n# NuGet Packages Directory\npackages/*\n## TODO: If the tool you use requires repositories.config\n## uncomment the next line\n#!packages/repositories.config\n\n# Enable \"build/\" folder in the NuGet Packages folder since\n# NuGet packages use it for MSBuild targets.\n# This line needs to be after the ignore of the build folder\n# (and the packages folder if the line above has been uncommented)\n!packages/build/\n\n# Windows Azure Build Output\ncsx/\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\nsql/\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n.vs/MsgKit/v15/sqlite3/storage.ide\n/.vs/MsgKit/v15/Server/sqlite3/storage.ide-wal\n/.vs/MsgKit/v15/Server/sqlite3/storage.ide-shm\n/.vs/MsgKit/v15/Server/sqlite3/storage.ide\n/.vs/MsgKit/v15/Server/sqlite3/db.lock\n/.vs/MsgKit/v15/sqlite3/db.lock\n/.vs/MsgKit/v15/sqlite3/storage.ide-shm\n/.vs/VSWorkspaceState.json\n/.vs/slnx.sqlite\n/.vs/ProjectSettings.json\n/.vs/MsgKit/v15/sqlite3/storage.ide-wal\n/.vs/MsgKit/v16/Server/sqlite3/db.lock\n"
  },
  {
    "path": "MsgKit/Address.cs",
    "content": "﻿//\n// Address.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing MsgKit.Enums;\nusing MsgKit.Structures;\n\nnamespace MsgKit;\n\n/// <summary>\n///     A base class for <see cref=\"Sender\"/>, <see cref=\"Recipient\"/>, <see cref=\"Receiving\"/>\n///     and <see cref=\"Representing\"/>\n/// </summary>\npublic class Address\n{\n    #region Fields\n    /// <summary>\n    ///     The messaging user's e-mail address type\n    /// </summary>\n    private AddressType _addressType;\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     The E-mail address\n    /// </summary>\n    public string Email { get; internal set; }\n\n    /// <summary>\n    ///     The displayname for the <see cref=\"Email\"/>\n    /// </summary>\n    public string DisplayName { get; internal set; }\n\n    /// <summary>\n    ///     The original displayname for the <see cref=\"Email\"/>\n    /// </summary>\n    public string OriginalDisplayName => AddressType == AddressType.Smtp ? Email : DisplayName;\n\n    /// <summary>\n    ///     Returns the messaging user's e-mail address type. Use <see cref=\"AddressTypeString\"/>\n    ///     when this property returns <see cref=\"Enums.AddressType.Unknown\"/>\n    /// </summary>\n    public AddressType AddressType\n    {\n        get => _addressType;\n        internal set\n        {\n            _addressType = value;\n            switch (value)\n            {\n                case AddressType.Unknown:\n                    AddressTypeString = string.Empty;\n                    break;\n\n                case AddressType.Ex:\n                    AddressTypeString = \"EX\";\n                    break;\n\n                case AddressType.Smtp:\n                    AddressTypeString = \"SMTP\";\n                    break;\n\n                case AddressType.Fax:\n                    AddressTypeString = \"FAX\";\n                    break;\n\n                case AddressType.Mhs:\n                    AddressTypeString = \"MHS\";\n                    break;\n\n                case AddressType.Profs:\n                    AddressTypeString = \"PROFS\";\n                    break;\n\n                case AddressType.X400:\n                    AddressTypeString = \"X400\";\n                    break;\n\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(value), value, null);\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns the <see cref=\"Enums.AddressType\"/> as a string\n    /// </summary>\n    public string AddressTypeString { get; private set; }\n\n    /// <summary>\n    ///     <see cref=\"OneOffEntryId\"/>\n    /// </summary>\n    internal OneOffEntryId OneOffEntryId => new(Email, DisplayName, AddressType);\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\" /></param>\n    public Address(string email,\n        string displayName,\n        AddressType addressType = AddressType.Smtp)\n    {\n        Email = email ?? string.Empty;\n        DisplayName = string.IsNullOrWhiteSpace(displayName) ? email : displayName;\n\n        AddressType = addressType;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Appointment.cs",
    "content": "﻿//\n// Appointment.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing MsgKit.Enums;\n\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class to make an appointment\n/// </summary>\n/// <remarks>\n///     Inherits from <see cref=\"Email\"/>>, because it has quite a few of the same fields\n/// </remarks>\npublic class Appointment : Email\n{\n    #region Properties\n    /// <summary>\n    ///     Holds the location for the Appointment\n    /// </summary>\n    public string Location { get; set; }\n\n    /// <summary>\n    ///     This property specifies whether the event is an all-day event, as \n    ///     specified by the user. A value of <c>true</c> indicates that the event is an all-day \n    ///     event, in which case the start time and end time must be midnight so that the \n    ///     duration is a multiple of 24 hours and is at least 24 hours. A value of <c>false</c> \n    ///     or the absence of this property indicates the event is not an all-day event. The \n    ///     client or server must not infer the value as TRUE when a user happens to create an \n    ///     event that is 24 hours, even if the event starts and ends at midnight.\n    /// </summary>\n    public bool AllDay { get; set; }\n\n    /// <summary>\n    ///     Holds meeting information for the appointment\n    /// </summary>\n    public DateTime MeetingStart { get; set; }\n\n    /// <summary>\n    ///     The end of the meeting\n    /// </summary>\n    public DateTime MeetingEnd { get; set; }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Sends an appointment with sender, representing, subject, draft.\n    /// </summary>\n    /// <param name=\"sender\"> Contains sender name and email. </param>\n    /// <param name=\"representing\">Contains who this appointment is representing. </param>\n    /// <param name=\"subject\"> Contains the subject for this appointment. </param>\n    /// <param name=\"draft\"> Is this a draft?</param>\n    public Appointment(Sender sender,\n        Representing representing,\n        string subject,\n        bool draft = false) : base(sender, representing, subject, draft)\n    {\n    }\n\n    /// <summary>\n    ///     Used to send without the representing structure.\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"subject\"></param>\n    /// <param name=\"draft\"></param>\n    public Appointment(Sender sender,\n        string subject,\n        bool draft = false) : base(sender, subject, draft)\n    {\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes all the properties that are part of the <see cref=\"Appointment\"/> object either as <see cref=\"OpenMcdf.Storage\"/>'s\n    ///     or <see cref=\"OpenMcdf.CfbStream\"/>'s to the <see cref=\"OpenMcdf.RootStorage\"/>\n    /// </summary>\n    private new void WriteToStorage()\n    {\n        Class = MessageClass.IPM_Appointment;\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidLocation, Location);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidAppointmentStartWhole, MeetingStart);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidAppointmentEndWhole, MeetingEnd);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidMeetingType, MeetingType.mtgRequest);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidAppointmentSubType, AllDay);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidAppointmentStateFlags, AppointmentState.asfMeeting);\n    }\n    #endregion\n\n    #region Save\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"stream\" />\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    public new void Save(Stream stream)\n    {\n        WriteToStorage();\n        base.Save(stream);\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"fileName\" />\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    public new void Save(string fileName)\n    {\n        WriteToStorage();\n        base.Save(fileName);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Attachments.cs",
    "content": "﻿//\n// Attachments.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing MsgKit.Enums;\nusing MsgKit.Exceptions;\nusing MsgKit.Helpers;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\nusing OpenMcdf;\nusing Stream = System.IO.Stream;\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n// ReSharper disable MemberCanBePrivate.Global\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Contains a list of <see cref=\"Attachment\" /> objects that are added to a <see cref=\"Message\" />\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc842285.aspx\n/// </remarks>\npublic class Attachments : List<Attachment>\n{\n    #region CheckAttachmentFileName\n    /// <summary>\n    ///     Checks if the <paramref name=\"fileName\" /> already exists in this object\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    /// <param name=\"contentId\"></param>\n    // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local\n    private void CheckAttachmentFileName(string fileName, string contentId)\n    {\n        var file = Path.GetFileName(fileName);\n\n        if (this.Any(\n                attachment => attachment.FileName.Equals(fileName, StringComparison.InvariantCultureIgnoreCase)\n                              && string.Equals(attachment.ContentId, contentId,\n                                  StringComparison.InvariantCultureIgnoreCase)))\n            throw new MKAttachmentExists($\"The attachment with the name '{file}' already exists\");\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes the <see cref=\"Attachment\" /> objects to the given <paramref name=\"rootStorage\" />\n    ///     and it will set all the needed properties\n    /// </summary>\n    /// <param name=\"rootStorage\">The root <see cref=\"OpenMcdf.Storage\" /></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Attachment\"/> objects and it's <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteToStorage(Storage rootStorage)\n    {\n        long size = 0;\n\n        for (var index = 0; index < Count; index++)\n        {\n            var attachment = this[index];\n            var storage = rootStorage.CreateStorage(PropertyTags.AttachmentStoragePrefix + index.ToString(\"X8\").ToUpper());\n            size += attachment.WriteProperties(storage, index);\n        }\n\n        return size;\n    }\n    #endregion\n\n    #region AddAttachment\n    /// <summary>\n    ///     Adds an <see cref=\"Attachment\" /> by <see cref=\"AttachmentType.ATTACH_BY_VALUE\" /> (default)\n    /// </summary>\n    /// <param name=\"fileName\">The file to add with its full path</param>\n    /// <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n    /// <param name=\"isInline\">Set to true to add the attachment inline</param>\n    /// <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n    /// <exception cref=\"FileNotFoundException\">Raised when the <paramref name=\"fileName\" /> could not be found</exception>\n    /// <exception cref=\"MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     Raised when <paramref name=\"isInline\" /> is set to true and\n    ///     <paramref name=\"contentId\" /> is null, white space or empty\n    /// </exception>\n    public void Add(string fileName,\n        long renderingPosition = -1,\n        bool isInline = false,\n        string contentId = \"\")\n    {\n        if (Count >= 2048)\n            throw new MKAttachment(\"To many attachments, an msg file can have a maximum of 2048 attachment\");\n\n        CheckAttachmentFileName(fileName, contentId);\n        var file = new FileInfo(fileName);\n        var stream = file.OpenRead();\n\n        Add(new Attachment(stream,\n            file.Name,\n            file.CreationTime,\n            file.LastWriteTime,\n            AttachmentType.ATTACH_BY_VALUE,\n            renderingPosition,\n            isInline,\n            contentId));\n    }\n\n    /// <summary>\n    ///     Adds an <see cref=\"Attachment\" /> stream by <see cref=\"AttachmentType.ATTACH_BY_VALUE\" /> (default)\n    /// </summary>\n    /// <param name=\"stream\">The stream to the attachment</param>\n    /// <param name=\"fileName\">The name for the attachment</param>\n    /// <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n    /// <param name=\"isInline\">Set to true to add the attachment inline</param>\n    /// <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n    /// <exception cref=\"ArgumentNullException\">Raised when the stream is null</exception>\n    /// <exception cref=\"MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     Raised when <paramref name=\"isInline\" /> is set to true and\n    ///     <paramref name=\"contentId\" /> is null, white space or empty\n    /// </exception>\n    public void Add(Stream stream,\n        string fileName,\n        long renderingPosition = -1,\n        bool isInline = false,\n        string contentId = \"\")\n    {\n        if (Count >= 2048)\n            throw new MKAttachment(\"To many attachments, an msg file can have a maximum of 2048 attachment\");\n\n        if (stream == null)\n            throw new ArgumentNullException(nameof(stream));\n\n        CheckAttachmentFileName(fileName, contentId);\n        var dateTime = DateTime.Now;\n\n        Add(new Attachment(stream,\n            fileName,\n            dateTime,\n            dateTime,\n            AttachmentType.ATTACH_BY_VALUE,\n            renderingPosition,\n            isInline,\n            contentId));\n    }\n\n    /// <summary>\n    ///     Adds an <see cref=\"Attachment\" /> stream by <see cref=\"AttachmentType.ATTACH_BY_VALUE\" /> (default)\n    /// </summary>\n    /// <param name=\"stream\">The stream to the attachment</param>\n    /// <param name=\"fileName\">The name for the attachment</param>\n    /// <exception cref=\"ArgumentNullException\">Raised when the stream is null</exception>\n    /// <exception cref=\"MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n    internal void AddContactPhoto(Stream stream, string fileName)\n    {\n        if (stream == null)\n            throw new ArgumentNullException(nameof(stream));\n\n        var dateTime = DateTime.Now;\n\n        Add(new Attachment(stream,\n            fileName,\n            dateTime,\n            dateTime,\n            AttachmentType.ATTACH_BY_VALUE,\n            -1,\n            false,\n            string.Empty,\n            true));\n    }\n    #endregion\n\n    #region AddLink\n    /// <summary>\n    ///     Adds an <see cref=\"Attachment\" /> by <see cref=\"AttachmentType.ATTACH_BY_REF_ONLY\" /> as a link\n    /// </summary>\n    /// <param name=\"file\">The <see cref=\"FileInfo\"/></param>\n    /// <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n    /// <param name=\"isInline\">Set to true to add the attachment inline</param>\n    /// <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n    /// <exception cref=\"FileNotFoundException\">Raised when the <paramref name=\"file\" /> could not be found</exception>\n    /// <exception cref=\"MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     Raised when <paramref name=\"isInline\" /> is set to true and\n    ///     <paramref name=\"contentId\" /> is null, white space or empty\n    /// </exception>\n    /// <remarks>\n    ///     Universal naming convention (UNC) names are recommended for fully-qualified paths, which should be used with\n    ///     <see cref=\"AttachmentType.ATTACH_BY_REF_ONLY\" />.\n    /// </remarks>\n    public void AddLink(FileInfo file,\n        long renderingPosition = -1,\n        bool isInline = false,\n        string contentId = \"\")\n    {\n        CheckAttachmentFileName(file.Name, contentId);\n\n        Add(new Attachment(\n            file,\n            AttachmentType.ATTACH_BY_REF_ONLY,\n            renderingPosition,\n            isInline,\n            contentId));\n    }\n    #endregion\n}\n\n/// <summary>\n///     This class represents an attachment\n/// </summary>\npublic class Attachment\n{\n    #region Fields\n    private readonly FileInfo _file;\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     The stream to the attachment\n    /// </summary>\n    public Stream Stream { get; }\n\n    /// <summary>\n    ///     The filename of the attachment\n    /// </summary>\n    public string FileName { get; }\n\n    /// <summary>\n    ///     The <see cref=\"AttachmentType\"/>\n    /// </summary>\n    public AttachmentType Type { get; }\n\n    /// <summary>\n    ///     Indicates how an attachment should be displayed in a rich text message. It can be set to an\n    ///     offset in characters, with the first character of the message content as stored in the <see cref=\"PropertyTags.PR_BODY_W\" />\n    ///     (PidTagBody) property being offset 0, or to -1 (0xFFFFFFFF), indicating that the attachment should\n    ///     not be rendered within the message text at all.\n    /// </summary>\n    public long RenderingPosition { get; }\n\n    /// <summary>\n    ///     True when the attachment is inline\n    /// </summary>\n    public bool IsInline { get; }\n\n    /// <summary>\n    ///     The content id for an inline attachment\n    /// </summary>\n    public string ContentId { get; }\n\n    /// <summary>\n    ///     Returns <c>true</c> when the attachment is a contact photo\n    /// </summary>\n    /// <remarks>\n    ///     Only valid when the message is a contact card, otherwise always <c>false</c>\n    /// </remarks>\n    public bool IsContactPhoto { get; }\n\n    /// <summary>\n    ///     The date and time when the attachment was created\n    /// </summary>\n    public DateTime CreationTime { get; }\n\n    /// <summary>\n    ///     The date and time when the attachment was last modified\n    /// </summary>\n    public DateTime LastModificationTime { get; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates a new attachment object and sets all its properties\n    /// </summary>\n    /// <param name=\"stream\">The stream to the attachment</param>\n    /// <param name=\"fileName\">The attachment filename with its full path</param>\n    /// <param name=\"creationTime\">The date and time when the attachment was created</param>\n    /// <param name=\"lastModificationTime\">The date and time when the attachment was last modified</param>\n    /// <param name=\"type\">The <see cref=\"AttachmentType\"/></param>\n    /// <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n    /// <param name=\"isInline\">True when the attachment is inline</param>\n    /// <param name=\"contentId\">The id for the attachment when <paramref name=\"isInline\" /> is set to true</param>\n    /// <param name=\"isContactPhoto\">Set to <c>true</c> when the attachment is a contact photo</param>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     Raised when <paramref name=\"isInline\" /> is set to true and\n    ///     <paramref name=\"contentId\" /> is null, white space or empty\n    /// </exception>\n    internal Attachment(Stream stream,\n        string fileName,\n        DateTime creationTime,\n        DateTime lastModificationTime,\n        AttachmentType type = AttachmentType.ATTACH_BY_VALUE,\n        long renderingPosition = -1,\n        bool isInline = false,\n        string contentId = \"\",\n        bool isContactPhoto = false)\n    {\n        Stream = stream;\n        FileName = Path.GetFileName(fileName);\n        CreationTime = creationTime;\n        LastModificationTime = lastModificationTime;\n        Type = type;\n        RenderingPosition = renderingPosition;\n        IsInline = isInline;\n        ContentId = contentId;\n        IsContactPhoto = isContactPhoto;\n\n        if (isInline && string.IsNullOrWhiteSpace(contentId))\n            throw new ArgumentNullException(nameof(contentId),\n                \"The content id cannot be empty when isInline is set to true\");\n    }\n\n    /// <summary>\n    ///     Creates a new attachment object and sets all its properties\n    /// </summary>\n    /// <param name=\"file\">The <see cref=\"FileInfo\"/></param>\n    /// <param name=\"type\">The <see cref=\"AttachmentType\"/></param>\n    /// <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n    /// <param name=\"isInline\">True when the attachment is inline</param>\n    /// <param name=\"contentId\">The id for the attachment when <paramref name=\"isInline\" /> is set to true</param>\n    /// <param name=\"isContactPhoto\">Set to <c>true</c> when the attachment is a contact photo</param>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     Raised when <paramref name=\"isInline\" /> is set to true and\n    ///     <paramref name=\"contentId\" /> is null, white space or empty\n    /// </exception>\n    internal Attachment(FileInfo file,\n        AttachmentType type = AttachmentType.ATTACH_BY_VALUE,\n        long renderingPosition = -1,\n        bool isInline = false,\n        string contentId = \"\",\n        bool isContactPhoto = false)\n    {\n        _file = file;\n        Stream = file.OpenRead();\n        FileName = file.Name;\n        CreationTime = file.CreationTime;\n        LastModificationTime = file.LastWriteTime;\n        Type = type;\n        RenderingPosition = renderingPosition;\n        IsInline = isInline;\n        ContentId = contentId;\n        IsContactPhoto = isContactPhoto;\n\n        if (isInline && string.IsNullOrWhiteSpace(contentId))\n            throw new ArgumentNullException(nameof(contentId),\n                \"The content id cannot be empty when isInline is set to true\");\n    }\n    #endregion\n\n    #region GetShortFileName\n    /// <summary>\n    ///     This method will convert a long filename to a short dos 8.3 one\n    /// </summary>\n    /// <param name=\"fileName\">The long filename</param>\n    /// <returns></returns>\n    private static string GetShortFileName(string fileName)\n    {\n        var name = Path.GetFileNameWithoutExtension(fileName);\n        var extension = Path.GetExtension(fileName);\n\n        if (name != null)\n            name = (name.Length > 8 ? name.Substring(0, 6) + \"~1\" : name).ToUpperInvariant();\n\n        if (extension != null)\n            name += \".\" +\n                    (extension.Length > 3 ? extension.Substring(1, 3) : extension.TrimStart('.'))\n                    .ToUpperInvariant();\n\n        return name;\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all the string and binary <see cref=\"Property\">properties</see> as a <see cref=\"OpenMcdf.CfbStream\" /> to the\n    ///     given <paramref name=\"storage\" />\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\" /></param>\n    /// <param name=\"index\">The <see cref=\"Attachment\"/> index</param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Attachment\"/> object and it's <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage, int index)\n    {\n        var propertiesStream = new AttachmentProperties();\n\n        propertiesStream.AddProperty(PropertyTags.PR_ATTACH_NUM, index, PropertyFlags.PROPATTR_READABLE);\n        propertiesStream.AddProperty(PropertyTags.PR_INSTANCE_KEY, Mapi.GenerateInstanceKey(), PropertyFlags.PROPATTR_READABLE);\n        propertiesStream.AddProperty(PropertyTags.PR_RECORD_KEY, Mapi.GenerateRecordKey(), PropertyFlags.PROPATTR_READABLE);\n        propertiesStream.AddProperty(PropertyTags.PR_RENDERING_POSITION, RenderingPosition, PropertyFlags.PROPATTR_READABLE);\n        propertiesStream.AddProperty(PropertyTags.PR_OBJECT_TYPE, MapiObjectType.MAPI_ATTACH);\n\n        if (IsContactPhoto)\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACHMENT_CONTACTPHOTO, true, PropertyFlags.PROPATTR_READABLE);\n\n        if (!string.IsNullOrEmpty(FileName))\n        {\n            propertiesStream.AddProperty(PropertyTags.PR_DISPLAY_NAME_W, FileName);\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACH_FILENAME_W, GetShortFileName(FileName));\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACH_LONG_FILENAME_W, FileName);\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACH_EXTENSION_W, Path.GetExtension(FileName));\n\n            if (!string.IsNullOrEmpty(ContentId))\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_CONTENT_ID_W, ContentId);\n\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACH_MIME_TAG_W, MimeTypes.GetMimeType(FileName));\n        }\n\n        propertiesStream.AddProperty(PropertyTags.PR_ATTACH_METHOD, Type);\n\n        switch (Type)\n        {\n            case AttachmentType.ATTACH_BY_VALUE:\n            case AttachmentType.ATTACH_EMBEDDED_MSG:\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_DATA_BIN, Stream.ToByteArray());\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_SIZE, Stream.Length);\n                break;\n\n            case AttachmentType.ATTACH_BY_REF_ONLY:\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_DATA_BIN, Array.Empty<byte>());\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_SIZE, _file.Length);\n                propertiesStream.AddProperty(PropertyTags.PR_ATTACH_LONG_PATHNAME_W, _file.FullName);\n                break;\n\n            //case AttachmentType.ATTACH_EMBEDDED_MSG:\n            //    var msgStorage = storage.AddStorage(PropertyTags.PR_ATTACH_DATA_BIN.Name);\n            //    var cf = new CompoundFile(Stream);\n            //    Storage.Copy(cf.RootStorage, msgStorage);\n            //    propertiesStream.AddProperty(PropertyTags.PR_ATTACH_SIZE, Stream.Length);\n            //    propertiesStream.AddProperty(PropertyTags.PR_ATTACH_ENCODING, 0);\n            //    break;\n\n            case AttachmentType.ATTACH_BY_REFERENCE:\n            case AttachmentType.ATTACH_BY_REF_RESOLVE:\n            case AttachmentType.NO_ATTACHMENT:\n            case AttachmentType.ATTACH_OLE:\n                throw new NotSupportedException(\"AttachByReference, AttachByRefResolve, NoAttachment and AttachOle are not supported\");\n        }\n\n        if (IsInline)\n        {\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACHMENT_HIDDEN, true);\n            propertiesStream.AddProperty(PropertyTags.PR_ATTACH_FLAGS, AttachmentFlags.ATT_MHTML_REF);\n        }\n\n        var utcNow = DateTime.UtcNow;\n        propertiesStream.AddProperty(PropertyTags.PR_CREATION_TIME, utcNow);\n        propertiesStream.AddProperty(PropertyTags.PR_LAST_MODIFICATION_TIME, utcNow);\n        propertiesStream.AddProperty(PropertyTags.PR_STORE_SUPPORT_MASK, StoreSupportMaskConst.StoreSupportMask, PropertyFlags.PROPATTR_READABLE);\n        return propertiesStream.WriteProperties(storage);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Contact.cs",
    "content": "﻿//\n// Contact.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing MsgKit.Enums;\n\n// ReSharper disable MemberCanBePrivate.Global\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class used to make a new Outlook contact MSG file\n/// </summary>\npublic class Contact : Email\n{\n    #region Properties\n    /// <summary>\n    ///     The contact image, this needs to be an JPG file\n    /// </summary>\n    public byte[] ContactPicture { get; set; }\n\n    /// <summary>\n    ///     File the contact card as ...\n    /// </summary>\n    public string FileUnder { get; set; }\n\n    /// <summary>\n    ///     The instant messaging address\n    /// </summary>\n    public string InstantMessagingAddress { get; set; }\n\n    /// <summary>\n    ///     Indicates whether the end-user wants this message object hidden from other users who have access to the message object\n    /// </summary>\n    public bool Private { get; set; }\n\n    /// <summary>\n    ///     The birthday\n    /// </summary>\n    public DateTime? BirthDay { get; set; }\n\n    /// <summary>\n    ///     Specifies the wedding anniversary\n    /// </summary>\n    public DateTime? WeddingAnniversary { get; set; }\n\n    /// <summary>\n    ///     Information about the assistant\n    /// </summary>\n    public ContactAssistant Assistant { get; set; }\n\n    /// <summary>\n    ///     Contains a telephone number that the message recipient can use to reach the sender\n    /// </summary>\n    public string CallBackTelePhoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's car telephone number\n    /// </summary>\n    public string CarTelePhoneNumber { get; set; }\n\n    /// <summary>\n    ///     The names of the childrens\n    /// </summary>\n    public List<string> ChildrensNames { get; set; }\n\n    /// <summary>\n    ///     The company's main info\n    /// </summary>\n    public ContactCompanyMain CompanyMain { get; set; }\n\n    /// <summary>\n    ///     The department name\n    /// </summary>\n    public string DepartmentName { get; set; }\n\n    /// <summary>\n    ///     Contains a generational abbreviation that follows the full name of the recipient\n    /// </summary>\n    public string Generation { get; set; }\n\n    /// <summary>\n    ///     Contains the first or given name of the recipient\n    /// </summary>\n    public string GivenName { get; set; }\n\n    /// <summary>\n    ///     Contains the initials for parts of the full name of the recipient\n    /// </summary>\n    public string Initials { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's ISDN-capable telephone number\n    /// </summary>\n    // ReSharper disable once InconsistentNaming\n    public string ISDNNumber { get; set; }\n\n    /// <summary>\n    ///     Contains a value that indicates the language in which the messaging user is writing messages\n    /// </summary>\n    public string Language { get; set; }\n\n    /// <summary>\n    ///     Contains the location of the recipient in a format that is useful to the recipient's organization.\n    /// </summary>\n    public string Location { get; set; }\n\n    /// <summary>\n    ///     Contains the name of the recipient's manager\n    /// </summary>\n    public string ManagerName { get; set; }\n\n    /// <summary>\n    ///     Contains the middle name of a contact\n    /// </summary>\n    public string MiddleName { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's cellular telephone number\n    /// </summary>\n    public string MobileTelephoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the nickname of the contact\n    /// </summary>\n    public string NickName { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's office location\n    /// </summary>\n    public string OfficeLocation { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's office location\n    /// </summary>\n    public string OfficeTelephoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the URL of a user's personal home page\n    /// </summary>\n    public string PersonalHomePage { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's postal address\n    /// </summary>\n    public string PostalAddress { get; set; }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's primary fax machine\n    /// </summary>\n    public string PrimaryFaxNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's primary telephone number\n    /// </summary>\n    public string PrimaryTelephoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the profession of the user\n    /// </summary>\n    public string Profession { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's radio telephone number\n    /// </summary>\n    public string RadioTelephoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the user's spouse name\n    /// </summary>\n    public string SpouseName { get; set; }\n\n    /// <summary>\n    ///     Contains the last or surname of the recipient\n    /// </summary>\n    public string SurName { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's telex number\n    /// </summary>\n    public string TelexNumber { get; set; }\n\n    /// <summary>\n    ///      Contains the recipient's job title\n    /// </summary>\n    public string Title { get; set; }\n\n    /// <summary>\n    ///     Contains the telephone number for the contact's text telephone (TTY) or telecommunication device for the deaf (TDD)\n    /// </summary>\n    // ReSharper disable once InconsistentNaming\n    public string TTYTDDPhoneNumber { get; set; }\n\n    /// <summary>\n    ///     Contains the recipient's pager telephone number\n    /// </summary>\n    public string PagerTelephoneNumber { get; set; }\n\n    /// <summary>\n    ///     E-mail address 1\n    /// </summary>\n    public Address Email1 { get; set; }\n\n    /// <summary>\n    ///     E-mail address 2\n    /// </summary>\n    public Address Email2 { get; set; }\n\n    /// <summary>\n    ///     E-mail address 3\n    /// </summary>\n    public Address Email3 { get; set; }\n\n    ///// <summary>\n    /////     Fax 1\n    ///// </summary>\n    //public string Fax1 { get; set; }\n\n    ///// <summary>\n    /////     Fax 2\n    ///// </summary>\n    //public string Fax2 { get; set; }\n\n    ///// <summary>\n    /////     Fax  3\n    ///// </summary>\n    //public string Fax3 { get; set; }\n\n    /// <summary>\n    ///     Yomi name and Yomi company name are fields for entering the phonetic equivalent for Japanese names.\n    ///     In Japan, there is commonly a Furigana equivalent for the Kanji name that is used for sorting and searching.\n    /// </summary>\n    public ContactYomi Yomi { get; set; }\n\n    /// <summary>\n    ///     The work details\n    /// </summary>\n    public ContactWork Work { get; set; }\n\n    /// <summary>\n    ///     The business details\n    /// </summary>\n    public ContactBusiness Business { get; set; }\n\n    /// <summary>\n    ///     The home details\n    /// </summary>\n    public ContactHome Home { get; set; }\n\n    /// <summary>\n    ///     The other address\n    /// </summary>\n    public ContactOther Other { get; set; }\n\n    /// <summary>\n    ///     Specifies which physical address is the contact's mailing address\n    /// </summary>\n    public PostalAddressId PostalAddressId { get; set; }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Creates this object and sets all the needed properties\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"Email.Sender\"/> of the E-mail</param>\n    /// <param name=\"representing\">The <see cref=\"MsgKit.Representing\"/> sender of the E-mail</param>\n    /// <param name=\"subject\">The subject of the E-mail</param>\n    /// <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n    /// <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    public Contact(\n        Sender sender,\n        Representing representing,\n        string subject,\n        bool draft = false,\n        bool readReceipt = false) : base(sender, representing, subject, draft, readReceipt)\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all the needed properties\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"Email.Sender\"/> of the E-mail</param>\n    /// <param name=\"subject\">The subject of the E-mail</param>\n    /// <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n    /// <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    public Contact(\n        Sender sender,\n        string subject,\n        bool draft = false,\n        bool readReceipt = false) : base(sender, subject, draft, readReceipt)\n    {\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes all the properties that are part of the <see cref=\"Appointment\"/> object either as <see cref=\"OpenMcdf.Storage\"/>'s\n    ///     or <see cref=\"OpenMcdf.CfbStream\"/>'s to the <see cref=\"OpenMcdf.RootStorage\"/>\n    /// </summary>\n    private new void WriteToStorage()\n    {\n        Class = MessageClass.IPM_Contact;\n\n        if (ContactPicture != null)\n        {\n            var memoryStream = new MemoryStream(ContactPicture);\n            Attachments.AddContactPhoto(memoryStream, \"ContactPicture.jpg\");\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidHasPicture, true);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidSmartNoAttach, true);\n        }\n        else\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidHasPicture, false);\n\n        if (!string.IsNullOrWhiteSpace(FileUnder))\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidFileUnder, FileUnder);\n\n        if (!string.IsNullOrWhiteSpace(InstantMessagingAddress))\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidInstantMessagingAddress, InstantMessagingAddress);\n\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidPrivate, Private);\n\n        if (BirthDay.HasValue)\n        {\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidBirthdayLocal, BirthDay);\n            TopLevelProperties.AddProperty(PropertyTags.PR_BIRTHDAY, BirthDay);\n        }\n\n        if (WeddingAnniversary.HasValue)\n        {\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidWeddingAnniversaryLocal, WeddingAnniversary);\n            TopLevelProperties.AddProperty(PropertyTags.PR_WEDDING_ANNIVERSARY, WeddingAnniversary);\n        }\n\n        if (Assistant != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Assistant.Name))\n                TopLevelProperties.AddProperty(PropertyTags.PR_ASSISTANT_W, Assistant.Name);\n\n            if (!string.IsNullOrWhiteSpace(Assistant.TelephoneNumber))\n                TopLevelProperties.AddProperty(PropertyTags.PR_ASSISTANT_TELEPHONE_NUMBER_W,\n                    Assistant.TelephoneNumber);\n        }\n\n        if (!string.IsNullOrWhiteSpace(CallBackTelePhoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_CALLBACK_TELEPHONE_NUMBER_W, CallBackTelePhoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(CarTelePhoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_CAR_TELEPHONE_NUMBER_W, CarTelePhoneNumber);\n\n        if (ChildrensNames != null)\n            TopLevelProperties.AddProperty(PropertyTags.PR_CHILDRENS_NAMES_W, string.Join(\", \", ChildrensNames));\n\n        if (CompanyMain != null)\n        {\n            if (!string.IsNullOrWhiteSpace(CompanyMain.Name))\n                TopLevelProperties.AddProperty(PropertyTags.PR_COMPANY_NAME_W, CompanyMain.Name);\n\n            if (!string.IsNullOrWhiteSpace(CompanyMain.TelephoneNumber))\n                TopLevelProperties.AddProperty(PropertyTags.PR_COMPANY_MAIN_PHONE_NUMBER_W,\n                    CompanyMain.TelephoneNumber);\n        }\n\n        if (!string.IsNullOrWhiteSpace(DepartmentName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_DEPARTMENT_NAME_W, DepartmentName);\n\n        if (!string.IsNullOrWhiteSpace(Generation))\n            TopLevelProperties.AddProperty(PropertyTags.PR_GENERATION_W, Generation);\n\n        if (!string.IsNullOrWhiteSpace(GivenName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_GIVEN_NAME_W, GivenName);\n\n        if (!string.IsNullOrWhiteSpace(Initials))\n            TopLevelProperties.AddProperty(PropertyTags.PR_INITIALS_W, Initials);\n\n        if (!string.IsNullOrWhiteSpace(ISDNNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_ISDN_NUMBER_W, ISDNNumber);\n\n        if (!string.IsNullOrWhiteSpace(Language))\n            TopLevelProperties.AddProperty(PropertyTags.PR_LANGUAGE_W, Language);\n\n        if (!string.IsNullOrWhiteSpace(Location))\n            TopLevelProperties.AddProperty(PropertyTags.PR_LOCATION_W, Location);\n\n        if (!string.IsNullOrWhiteSpace(ManagerName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_MANAGER_NAME_W, ManagerName);\n\n        if (!string.IsNullOrWhiteSpace(MiddleName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_MIDDLE_NAME_W, MiddleName);\n\n        if (!string.IsNullOrWhiteSpace(MobileTelephoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_MOBILE_TELEPHONE_NUMBER_W, MobileTelephoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(NickName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_NICKNAME_W, NickName);\n\n        if (!string.IsNullOrWhiteSpace(OfficeLocation))\n            TopLevelProperties.AddProperty(PropertyTags.PR_OFFICE_LOCATION_W, OfficeLocation);\n\n        if (!string.IsNullOrWhiteSpace(OfficeTelephoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS2_TELEPHONE_NUMBER_W, OfficeTelephoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(PersonalHomePage))\n            TopLevelProperties.AddProperty(PropertyTags.PR_PERSONAL_HOME_PAGE_W, PersonalHomePage);\n\n        if (!string.IsNullOrWhiteSpace(PostalAddress))\n            TopLevelProperties.AddProperty(PropertyTags.PR_POSTAL_ADDRESS_W, PostalAddress);\n\n        var addressBookProviderEmailList = new List<long>();\n\n        if (!string.IsNullOrWhiteSpace(PrimaryFaxNumber))\n        {\n            TopLevelProperties.AddProperty(PropertyTags.PR_PRIMARY_FAX_NUMBER_W, PrimaryFaxNumber);\n            addressBookProviderEmailList.Add(5);\n        }\n\n        if (!string.IsNullOrWhiteSpace(PrimaryTelephoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_PRIMARY_TELEPHONE_NUMBER_W, PrimaryTelephoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(Profession))\n            TopLevelProperties.AddProperty(PropertyTags.PR_PROFESSION_W, Profession);\n\n        if (!string.IsNullOrWhiteSpace(RadioTelephoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_RADIO_TELEPHONE_NUMBER_W, RadioTelephoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(SpouseName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_SPOUSE_NAME_W, SpouseName);\n\n        if (!string.IsNullOrWhiteSpace(SurName))\n            TopLevelProperties.AddProperty(PropertyTags.PR_SURNAME_W, SurName);\n\n        if (!string.IsNullOrWhiteSpace(TelexNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_TELEX_NUMBER_W, TelexNumber);\n\n        if (!string.IsNullOrWhiteSpace(Title))\n            TopLevelProperties.AddProperty(PropertyTags.PR_TITLE_W, Title);\n\n        if (!string.IsNullOrWhiteSpace(TTYTDDPhoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_TTYTDD_PHONE_NUMBER_W, TTYTDDPhoneNumber);\n\n        if (!string.IsNullOrWhiteSpace(PagerTelephoneNumber))\n            TopLevelProperties.AddProperty(PropertyTags.PR_PAGER_TELEPHONE_NUMBER_W, PagerTelephoneNumber);\n\n        var emailList = new List<long>();\n\n        if (Email1 != null)\n        {\n            emailList.Add(NamedPropertyTags.PidLidEmail1DisplayName.Id);\n            addressBookProviderEmailList.Add(0);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail1EmailAddress, Email1.Email);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail1DisplayName, Email1.DisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail1OriginalDisplayName,\n                Email1.OriginalDisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail1AddressType, Email1.AddressTypeString);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail1OriginalEntryId,\n                Email1.OneOffEntryId.ToByteArray());\n        }\n\n        if (Email2 != null)\n        {\n            emailList.Add(NamedPropertyTags.PidLidEmail2DisplayName.Id);\n            addressBookProviderEmailList.Add(1);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail2EmailAddress, Email2.Email);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail2DisplayName, Email2.DisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail2OriginalDisplayName,\n                Email2.OriginalDisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail2AddressType, Email2.AddressTypeString);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail2OriginalEntryId,\n                Email2.OneOffEntryId.ToByteArray());\n        }\n\n        if (Email3 != null)\n        {\n            emailList.Add(NamedPropertyTags.PidLidEmail3DisplayName.Id);\n            addressBookProviderEmailList.Add(2);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail3EmailAddress, Email3.Email);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail3DisplayName, Email3.DisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail3OriginalDisplayName,\n                Email3.OriginalDisplayName);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail3AddressType, Email3.AddressTypeString);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmail3OriginalEntryId,\n                Email3.OneOffEntryId.ToByteArray());\n        }\n\n        if (emailList.Any())\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidEmailList, emailList.ToArray());\n\n        //if (!string.IsNullOrWhiteSpace(Fax1))\n        //{\n        //    var fax1 = new Address(Fax1, SubjectNormalized, AddressType.Fax);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax1EmailAddress, fax1.Email);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax1OriginalDisplayName, fax1.OriginalDisplayName);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax1AddressType, fax1.AddressTypeString);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax1OriginalEntryId, fax1.OneOffEntryId.ToByteArray());\n        //}\n\n        //if (!string.IsNullOrWhiteSpace(Fax2))\n        //{\n        //    var fax2 = new Address(Fax2, SubjectNormalized, AddressType.Fax);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax2EmailAddress, fax2.Email);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax2OriginalDisplayName, fax2.OriginalDisplayName);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax2AddressType, fax2.AddressTypeString);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax2OriginalEntryId, fax2.OneOffEntryId.ToByteArray());\n        //}\n\n        //if (!string.IsNullOrWhiteSpace(Fax3))\n        //{\n        //    var fax3 = new Address(Fax3, SubjectNormalized, AddressType.Fax);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax3EmailAddress, fax3.Email);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax3OriginalDisplayName, fax3.OriginalDisplayName);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax3AddressType, fax3.AddressTypeString);\n        //    NamedProperties.AddProperty(NamedPropertyTags.PidLidFax3OriginalEntryId, fax3.OneOffEntryId.ToByteArray());\n        //}\n\n        if (Yomi != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Yomi.FirstName))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidYomiFirstName, Yomi.FirstName);\n\n            if (!string.IsNullOrWhiteSpace(Yomi.LastName))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidYomiLastName, Yomi.LastName);\n\n            if (!string.IsNullOrWhiteSpace(Yomi.CompanyName))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidYomiCompanyName, Yomi.CompanyName);\n        }\n\n        if (Work != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Work.Address))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddress, Work.Address);\n\n            if (!string.IsNullOrWhiteSpace(Work.Street))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressStreet, Work.Street);\n\n            if (!string.IsNullOrWhiteSpace(Work.PostalCode))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressPostalCode, Work.PostalCode);\n\n            if (!string.IsNullOrWhiteSpace(Work.PostOfficeBox))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressPostOfficeBox, Work.PostOfficeBox);\n\n            if (!string.IsNullOrWhiteSpace(Work.City))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressCity, Work.City);\n\n            if (!string.IsNullOrWhiteSpace(Work.Country))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressCountry, Work.Country);\n\n            if (!string.IsNullOrWhiteSpace(Work.CountryCode))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidWorkAddressCountryCode, Work.CountryCode);\n        }\n\n        if (Business != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Business.Street))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_ADDRESS_STREET_W, Business.Street);\n\n            if (!string.IsNullOrWhiteSpace(Business.City))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_ADDRESS_CITY_W, Business.City);\n\n            if (!string.IsNullOrWhiteSpace(Business.Country))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_ADDRESS_COUNTRY_W, Business.Country);\n\n            if (!string.IsNullOrWhiteSpace(Business.PostalCode))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_ADDRESS_POSTAL_CODE_W, Business.PostalCode);\n\n            if (!string.IsNullOrWhiteSpace(Business.State))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W,\n                    Business.State);\n\n            if (!string.IsNullOrWhiteSpace(Business.HomePage))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_HOME_PAGE_W, Business.HomePage);\n\n            if (!string.IsNullOrWhiteSpace(Business.TelephoneNumber))\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_TELEPHONE_NUMBER_W,\n                    Business.TelephoneNumber);\n\n            if (!string.IsNullOrWhiteSpace(Business.FaxNumber))\n            {\n                TopLevelProperties.AddProperty(PropertyTags.PR_BUSINESS_FAX_NUMBER_W, Business.FaxNumber);\n                addressBookProviderEmailList.Add(3);\n            }\n        }\n\n        if (Home != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Home.Address))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidHomeAddress, Home.Address);\n\n            if (!string.IsNullOrWhiteSpace(Home.Street))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_ADDRESS_STREET_W, Home.Street);\n\n            if (!string.IsNullOrWhiteSpace(Home.PostalCode))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_ADDRESS_POSTAL_CODE_W, Home.PostalCode);\n\n            if (!string.IsNullOrWhiteSpace(Home.City))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_ADDRESS_CITY_W, Home.City);\n\n            if (!string.IsNullOrWhiteSpace(Home.Country))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_ADDRESS_COUNTRY_W, Home.Country);\n\n            if (!string.IsNullOrWhiteSpace(Home.TelephoneNumber))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_TELEPHONE_NUMBER_W, Home.TelephoneNumber);\n\n            if (!string.IsNullOrWhiteSpace(Home.TelephoneNumber2))\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME2_TELEPHONE_NUMBER_W, Home.TelephoneNumber2);\n\n            if (!string.IsNullOrWhiteSpace(Home.FaxNumber))\n            {\n                TopLevelProperties.AddProperty(PropertyTags.PR_HOME_FAX_NUMBER_W, Home.FaxNumber);\n                addressBookProviderEmailList.Add(4);\n            }\n        }\n\n        if (addressBookProviderEmailList.Any())\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidAddressBookProviderEmailList,\n                addressBookProviderEmailList.OrderBy(m => m).ToArray());\n\n        if (Other != null)\n        {\n            if (!string.IsNullOrWhiteSpace(Other.Address))\n                NamedProperties.AddProperty(NamedPropertyTags.PidLidOtherAddress, Other.Address);\n\n            if (!string.IsNullOrWhiteSpace(Other.Street))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_ADDRESS_STREET_W, Other.Street);\n\n            if (!string.IsNullOrWhiteSpace(Other.PostalCode))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_ADDRESS_POSTAL_CODE_W, Other.PostalCode);\n\n            if (!string.IsNullOrWhiteSpace(Other.City))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_ADDRESS_CITY_W, Other.City);\n\n            if (!string.IsNullOrWhiteSpace(Other.Country))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_ADDRESS_COUNTRY_W, Other.Country);\n\n            if (!string.IsNullOrWhiteSpace(Other.State))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W, Other.State);\n\n            if (!string.IsNullOrWhiteSpace(Other.TelephoneNumber))\n                TopLevelProperties.AddProperty(PropertyTags.PR_OTHER_TELEPHONE_NUMBER_W, Other.TelephoneNumber);\n        }\n    }\n    #endregion\n\n    #region Save\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"stream\" />\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    public new void Save(Stream stream)\n    {\n        WriteToStorage();\n        base.Save(stream);\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"fileName\" />\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    public new void Save(string fileName)\n    {\n        WriteToStorage();\n        base.Save(fileName);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactAssistant.cs",
    "content": "﻿//\n// ContactAssistant.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> assistent\n/// </summary>\npublic class ContactAssistant\n{\n    #region Properties\n    /// <summary>\n    ///     The name of the assistant\n    /// </summary>\n    public string Name { get; set; }\n\n    /// <summary>\n    ///     The telephone number of the assistant\n    /// </summary>\n    public string TelephoneNumber { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactBusiness.cs",
    "content": "﻿//\n// ContactBusiness.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> business \n/// </summary>\npublic class ContactBusiness : ContactOther\n{\n    #region Properties\n    /// <summary>\n    ///     The home-page\n    /// </summary>\n    public string HomePage { get; set; }\n\n    /// <summary>\n    ///     The fax number\n    /// </summary>\n    public string FaxNumber { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactCommon.cs",
    "content": "﻿//\n// ContactCommon.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     A placeholder for the <see cref=\"ContactWork\"/>, <see cref=\"ContactOther\"/> and <see cref=\"ContactBusiness\"/> common properties\n/// </summary>\npublic class ContactCommon\n{\n    #region Properties\n    /// <summary>\n    ///     The street for the address\n    /// </summary>\n    public string Street { get; set; }\n\n    /// <summary>\n    ///     The country for the address\n    /// </summary>\n    public string Country { get; set; }\n\n    /// <summary>\n    ///     The postal code for the address\n    /// </summary>\n    public string PostalCode { get; set; }\n\n    /// <summary>\n    ///     The city for the address\n    /// </summary>\n    public string City { get; set; }\n\n    /// <summary>\n    ///     The telephone number\n    /// </summary>\n    public string TelephoneNumber { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactCompanyMain.cs",
    "content": "﻿//\n// ContactAssistant.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> company main info\n/// </summary>\npublic class ContactCompanyMain : ContactAssistant\n{\n}"
  },
  {
    "path": "MsgKit/ContactHome.cs",
    "content": "﻿//\n// ContactHome.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> work address\n/// </summary>\npublic class ContactHome : ContactOther\n{\n    #region Properties\n    /// <summary>\n    ///     The way the home address is displayed in the contact card<br/>\n    ///     Some Street<br/>\n    ///     Zip code Place<br/>\n    ///     Some land<br/>\n    /// </summary>\n    public new string Address { get; set; }\n\n    /// <summary>\n    ///     The fax number\n    /// </summary>\n    public string FaxNumber { get; set; }\n\n    /// <summary>\n    ///     The telephone 2 number\n    /// </summary>\n    public string TelephoneNumber2 { get; set; }\n#endregion\n}"
  },
  {
    "path": "MsgKit/ContactOther.cs",
    "content": "﻿//\n// ContactOther.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> other address\n/// </summary>\npublic class ContactOther : ContactCommon\n{\n    #region Properties\n    /// <summary>\n    ///     The way the home address is displayed in the contact card<br/>\n    ///     Some Street<br/>\n    ///     Zip code Place<br/>\n    ///     Some land<br/>\n    /// </summary>\n    public string Address { get; set; }\n\n    /// <summary>\n    ///     The state for the address\n    /// </summary>\n    public string State { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactWork.cs",
    "content": "﻿//\n// ContactWork.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> work address\n/// </summary>\npublic class ContactWork : ContactCommon\n{\n    #region Properties\n    /// <summary>\n    ///     The way the work address is displayed in the contact card<br/>\n    ///     Some Street<br/>\n    ///     Zip code Place<br/>\n    ///     Some land<br/>\n    /// </summary>\n    public string Address { get; set; }\n\n    /// <summary>\n    ///     The post office box for the address\n    /// </summary>\n    public string PostOfficeBox { get; set; }\n\n    /// <summary>\n    ///     The country code for the address\n    /// </summary>\n    public string CountryCode { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ContactYomi.cs",
    "content": "﻿//\n// ContactYomi.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     Placeholder for a <see cref=\"Contact\"/> other address\n/// </summary>\npublic class ContactYomi\n{\n    #region Properties\n    /// <summary>\n    ///     The first name\n    /// </summary>\n    public string FirstName { get; set; }\n\n    /// <summary>\n    ///     The last name\n    /// </summary>\n    public string LastName { get; set; }\n\n    /// <summary>\n    ///     The company name\n    /// </summary>\n    public string CompanyName { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Converter.cs",
    "content": "﻿//\n// Converter.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing MimeKit;\nusing MsgKit.Exceptions;\nusing MsgKit.Helpers;\nusing MsgKit.Streams;\nusing OpenMcdf;\n\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     This class exposes some methods to convert MSG to EML and vice versa\n/// </summary>\npublic static class Converter\n{\n    #region ConvertEmlToMsg\n    /// <summary>\n    ///     Converts an EML file to MSG format\n    /// </summary>\n    /// <param name=\"emlFileName\">The EML (MIME) file</param>\n    /// <param name=\"msgFileName\">The MSG file</param>\n    public static void ConvertEmlToMsg(string emlFileName, string msgFileName)\n    {\n        using var emlFile = new FileStream(emlFileName, FileMode.Open);\n        using var msgFile = new FileStream(msgFileName, FileMode.CreateNew);\n        ConvertEmlToMsg(emlFile, msgFile);\n    }\n\n    /// <summary>\n    ///     Converts an EML file to MSG format\n    /// </summary>\n    /// <param name=\"emlFile\">The EML (MIME) input stream</param>\n    /// <param name=\"msgFile\">The MSG file output stream</param>\n    public static void ConvertEmlToMsg(Stream emlFile, Stream msgFile)\n    {\n        var eml = MimeMessage.Load(emlFile);\n        var sender = new Sender(string.Empty, string.Empty);\n\n        if (eml.From.Count > 0)\n        {\n            var mailAddress = (MailboxAddress)eml.From[0];\n            sender = new Sender(mailAddress.Address, mailAddress.Name);\n        }\n\n        var representing = new Representing(string.Empty, string.Empty);\n        if (eml.ResentSender != null)\n            representing = new Representing(eml.ResentSender.Address, eml.ResentSender.Name);\n        else if (eml.From.Count > 0)\n        {\n            var mailAddress = (MailboxAddress)eml.From[0];\n            representing = new Representing(mailAddress.Address, mailAddress.Name);\n        }\n\n        var msg = new Email(sender, representing, eml.Subject)\n        {\n            InternetMessageId = eml.MessageId\n        };\n\n        if(eml.Date.UtcDateTime > DateTime.MinValue)\n        {\n            msg.SentOn = eml.Date.UtcDateTime;\n            msg.ReceivedOn = eml.Date.UtcDateTime;\n        }\n\n        using (var memoryStream = new MemoryStream())\n        {\n            eml.Headers.WriteTo(memoryStream);\n            msg.TransportMessageHeadersText = Encoding.ASCII.GetString(memoryStream.ToArray());\n        }\n\n        msg.Priority = eml.Priority switch\n        {\n            MessagePriority.NonUrgent => Enums.MessagePriority.PRIO_NONURGENT,\n            MessagePriority.Normal => Enums.MessagePriority.PRIO_NORMAL,\n            MessagePriority.Urgent => Enums.MessagePriority.PRIO_URGENT,\n            _ => msg.Priority\n        };\n\n        msg.Importance = eml.Importance switch\n        {\n            MessageImportance.Low => Enums.MessageImportance.IMPORTANCE_LOW,\n            MessageImportance.Normal => Enums.MessageImportance.IMPORTANCE_NORMAL,\n            MessageImportance.High => Enums.MessageImportance.IMPORTANCE_HIGH,\n            _ => msg.Importance\n        };\n\n        foreach (var to in eml.To)\n        {\n            if (to is not MailboxAddress mailAddress) continue;\n            msg.Recipients.AddTo(mailAddress.Address, mailAddress.Name);\n        }\n\n        foreach (var cc in eml.Cc)\n        {\n            var mailAddress = (MailboxAddress)cc;\n            msg.Recipients.AddCc(mailAddress.Address, mailAddress.Name);\n        }\n\n        foreach (var bcc in eml.Bcc)\n        {\n            var mailAddress = (MailboxAddress)bcc;\n            msg.Recipients.AddBcc(mailAddress.Address, mailAddress.Name);\n        }\n\n        using (var headerStream = new MemoryStream())\n        {\n            eml.Headers.WriteTo(headerStream);\n            headerStream.Position = 0;\n            msg.TransportMessageHeadersText = Encoding.ASCII.GetString(headerStream.ToArray());\n        }\n\n        var namelessCount = 0;\n        var index = 1;\n\n        // This loops through the top-level parts (i.e. it doesn't open up attachments and continue to traverse).\n        // As such, any included messages are just attachments here.\n        foreach (var bodyPart in eml.BodyParts)\n        {\n            var handled = false;\n\n            // The first text/plain part (that's not an attachment) is the body part.\n            if (!bodyPart.IsAttachment && bodyPart is TextPart text)\n            {\n                // Sets the first matching inline content type for body parts.\n\n                if (msg.BodyText == null && text.IsPlain)\n                {\n                    msg.BodyText = text.Text;\n                    handled = true;\n                }\n\n                if (msg.BodyHtml == null && text.IsHtml)\n                {\n                    msg.BodyHtml = text.Text;\n                    handled = true;\n                }\n\n                if (msg.BodyRtf == null && text.IsRichText)\n                {\n                    msg.BodyRtf = text.Text;\n                    handled = true;\n                }\n            }\n\n            // If the part hasn't previously been handled by \"body\" part handling\n            if (handled) continue;\n            \n            var attachmentStream = new MemoryStream();\n            var fileName = bodyPart.ContentType.Name;\n            var extension = string.Empty;\n\n            switch (bodyPart)\n            {\n                case MessagePart messagePart:\n                {\n                    messagePart.Message.WriteTo(attachmentStream);\n                    if (messagePart.Message != null)\n                        fileName = messagePart.Message.Subject;\n\n                    extension = \".eml\";\n                    break;\n                }\n\n                case MessageDispositionNotification notification:\n                    fileName = notification.FileName;\n                    break;\n                \n                case MessageDeliveryStatus status:\n                    fileName = \"details\";\n                    extension = \".txt\";\n                    status.WriteTo(FormatOptions.Default, attachmentStream, true);\n                    break;\n                \n                default:\n                {\n                    var part = (MimePart)bodyPart;\n                    part.Content?.DecodeTo(attachmentStream);\n                    fileName = part.FileName;\n                    break;\n                }\n            }\n\n            fileName = string.IsNullOrWhiteSpace(fileName)\n                ? $\"part_{++namelessCount:00}\"\n                : FileManager.RemoveInvalidFileNameChars(fileName);\n\n            if (!string.IsNullOrEmpty(extension))\n                fileName += extension;\n\n            var inline = bodyPart.ContentDisposition != null &&\n                         !string.IsNullOrEmpty(bodyPart.ContentId) &&\n                         bodyPart.ContentDisposition.Disposition.Equals(\"inline\",\n                             StringComparison.InvariantCultureIgnoreCase);\n\n            attachmentStream.Position = 0;\n\n            try\n            {\n                msg.Attachments.Add(attachmentStream, fileName, -1, inline, bodyPart.ContentId);\n            }\n            catch (MKAttachmentExists)\n            {\n                var tempFileName = Path.GetFileNameWithoutExtension(fileName);\n                var tempExtension = Path.GetExtension(fileName);\n                msg.Attachments.Add(attachmentStream, $\"{tempFileName}({index}){tempExtension}\", -1, inline,\n                    bodyPart.ContentId);\n                index += 1;\n            }\n        }\n\n        msg.Save(msgFile);\n    }\n    #endregion\n\n    #region ConvertMsgToEml\n    /// <summary>\n    ///     Converts an MSG file to EML format\n    /// </summary>\n    /// <param name=\"msgFileName\">The MSG file</param>\n    /// <param name=\"emlFileName\">The EML (MIME) file</param>\n    public static void ConvertMsgToEml(string msgFileName, string emlFileName)\n    {\n        using var msgFile = new FileStream(msgFileName, FileMode.Open, FileAccess.Read);\n        using var emlFile = new FileStream(emlFileName, FileMode.CreateNew);\n        ConvertMsgToEml(msgFile, emlFile);\n    }\n\n    /// <summary>\n    ///     Converts an MSG file to EML format\n    /// </summary>\n    /// <param name=\"msgFile\">The MSG file input stream</param>\n    /// <param name=\"emlFile\">The EML (MIME) output stream</param>\n    public static void ConvertMsgToEml(Stream msgFile, Stream emlFile)\n    {\n        using var rootStorage = RootStorage.Open(msgFile, StorageModeFlags.LeaveOpen);\n\n        // Read top-level properties\n        var propsStream = rootStorage.OpenStream(PropertyTags.PropertiesStreamName);\n        var topLevelProps = new TopLevelProperties(propsStream);\n\n        // Read variable-size properties from substg streams\n        var subject = ReadUnicodeString(rootStorage, PropertyTags.PR_SUBJECT_W);\n        var bodyText = ReadUnicodeString(rootStorage, PropertyTags.PR_BODY_W);\n        var htmlBytes = ReadBinaryProperty(rootStorage, PropertyTags.PR_HTML);\n        var senderName = ReadUnicodeString(rootStorage, PropertyTags.PR_SENDER_NAME_W);\n        var senderEmail = ReadUnicodeString(rootStorage, PropertyTags.PR_SENDER_EMAIL_ADDRESS_W);\n        var senderSmtp = ReadUnicodeString(rootStorage, PropertyTags.PR_SMTP_ADDRESS_W);\n        var messageId = ReadUnicodeString(rootStorage, PropertyTags.PR_INTERNET_MESSAGE_ID_W);\n\n        // Determine sender SMTP address (prefer SMTP over email, discard Exchange DNs)\n        var senderAddress = senderSmtp ?? senderEmail ?? string.Empty;\n        if (senderAddress.StartsWith(\"/O=\", StringComparison.OrdinalIgnoreCase))\n            senderAddress = string.Empty;\n\n        // Read fixed properties\n        var clientSubmitTime = topLevelProps.FirstOrDefault(p => p.Id == PropertyTags.PR_CLIENT_SUBMIT_TIME.Id);\n        var importance = topLevelProps.FirstOrDefault(p => p.Id == PropertyTags.PR_IMPORTANCE.Id);\n        var priority = topLevelProps.FirstOrDefault(p => p.Id == PropertyTags.PR_PRIORITY.Id);\n\n        // Build MimeMessage\n        var message = new MimeMessage();\n\n        if (!string.IsNullOrEmpty(senderAddress))\n            message.From.Add(new MailboxAddress(senderName ?? string.Empty, senderAddress));\n\n        if (!string.IsNullOrEmpty(subject))\n            message.Subject = subject;\n\n        if (!string.IsNullOrEmpty(messageId))\n            message.MessageId = messageId;\n\n        if (clientSubmitTime != null)\n            message.Date = new DateTimeOffset(clientSubmitTime.ToDateTime);\n\n        if (importance != null)\n        {\n            message.Importance = importance.ToInt switch\n            {\n                0 => MessageImportance.Low,\n                2 => MessageImportance.High,\n                _ => MessageImportance.Normal\n            };\n        }\n\n        if (priority != null)\n        {\n            message.Priority = priority.ToInt switch\n            {\n                -1 => MessagePriority.NonUrgent,\n                1 => MessagePriority.Urgent,\n                _ => MessagePriority.Normal\n            };\n        }\n\n        // Read recipients\n        for (var i = 0; i < topLevelProps.RecipientCount; i++)\n        {\n            var storageName = PropertyTags.RecipientStoragePrefix + i.ToString(\"X8\");\n            if (!rootStorage.TryOpenStorage(storageName, out var recipStorage))\n                continue;\n\n            var recipPropsStream = recipStorage.OpenStream(PropertyTags.PropertiesStreamName);\n            var recipProps = new RecipientProperties(recipPropsStream);\n\n            var displayName = ReadUnicodeString(recipStorage, PropertyTags.PR_DISPLAY_NAME_W);\n            var emailAddress = ReadUnicodeString(recipStorage, PropertyTags.PR_EMAIL_ADDRESS_W);\n            var smtpAddress = ReadUnicodeString(recipStorage, PropertyTags.PR_SMTP_ADDRESS_W);\n\n            var address = smtpAddress ?? emailAddress ?? string.Empty;\n            if (address.StartsWith(\"/O=\", StringComparison.OrdinalIgnoreCase))\n                address = string.Empty;\n\n            if (string.IsNullOrEmpty(address))\n                continue;\n\n            var recipientType = recipProps.FirstOrDefault(p => p.Id == PropertyTags.PR_RECIPIENT_TYPE.Id);\n            var type = recipientType?.ToInt ?? 1;\n\n            var mailbox = new MailboxAddress(displayName ?? string.Empty, address);\n\n            switch (type)\n            {\n                case 1: message.To.Add(mailbox); break;\n                case 2: message.Cc.Add(mailbox); break;\n                case 3: message.Bcc.Add(mailbox); break;\n            }\n        }\n\n        // Build body and read attachments\n        var builder = new BodyBuilder();\n        builder.TextBody = bodyText;\n\n        if (htmlBytes != null)\n            builder.HtmlBody = Encoding.UTF8.GetString(htmlBytes);\n\n        for (var i = 0; i < topLevelProps.AttachmentCount; i++)\n        {\n            var storageName = PropertyTags.AttachmentStoragePrefix + i.ToString(\"X8\");\n            if (!rootStorage.TryOpenStorage(storageName, out var attachStorage))\n                continue;\n\n            var fileName = ReadUnicodeString(attachStorage, PropertyTags.PR_ATTACH_LONG_FILENAME_W)\n                        ?? ReadUnicodeString(attachStorage, PropertyTags.PR_ATTACH_FILENAME_W);\n            var mimeTag = ReadUnicodeString(attachStorage, PropertyTags.PR_ATTACH_MIME_TAG_W);\n            var contentId = ReadUnicodeString(attachStorage, PropertyTags.PR_ATTACH_CONTENT_ID_W);\n            var attachData = ReadBinaryProperty(attachStorage, PropertyTags.PR_ATTACH_DATA_BIN);\n\n            if (attachData == null) continue;\n\n            var contentType = !string.IsNullOrEmpty(mimeTag)\n                ? ContentType.Parse(mimeTag)\n                : new ContentType(\"application\", \"octet-stream\");\n\n            if (!string.IsNullOrEmpty(contentId))\n            {\n                var attachment = builder.LinkedResources.Add(fileName ?? \"inline\", attachData, contentType);\n                attachment.ContentId = contentId;\n            }\n            else\n            {\n                builder.Attachments.Add(fileName ?? \"attachment\", attachData, contentType);\n            }\n        }\n\n        message.Body = builder.ToMessageBody();\n        message.WriteTo(emlFile);\n    }\n    #endregion\n\n    #region ReadUnicodeString\n    /// <summary>\n    ///     Reads a unicode string property from a substg stream in the given storage\n    /// </summary>\n    private static string ReadUnicodeString(Storage storage, PropertyTags.PropertyTag tag)\n    {\n        if (!storage.TryOpenStream(tag.Name, out var stream))\n            return null;\n\n        using (stream)\n        using (var reader = new BinaryReader(stream))\n        {\n            var bytes = reader.ReadBytes((int)stream.Length);\n            return Encoding.Unicode.GetString(bytes).TrimEnd('\\0');\n        }\n    }\n    #endregion\n\n    #region ReadBinaryProperty\n    /// <summary>\n    ///     Reads a binary property from a substg stream in the given storage\n    /// </summary>\n    private static byte[] ReadBinaryProperty(Storage storage, PropertyTags.PropertyTag tag)\n    {\n        if (!storage.TryOpenStream(tag.Name, out var stream))\n            return null;\n\n        using (stream)\n        using (var reader = new BinaryReader(stream))\n        {\n            return reader.ReadBytes((int)stream.Length);\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Email.cs",
    "content": "﻿//\n// Email.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\nusing MsgKit.Mime.Header;\nusing MsgKit.Rtf;\nusing MsgKit.Structures;\nusing OpenMcdf;\nusing MessageImportance = MsgKit.Enums.MessageImportance;\nusing MessagePriority = MsgKit.Enums.MessagePriority;\nusing Stream = System.IO.Stream;\n// ReSharper disable GrammarMistakeInComment\n\n// ReSharper disable MemberCanBePrivate.Global\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class used to make a new Outlook E-mail MSG file\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc979231.aspx\n/// </remarks>\npublic class Email : Message, IDisposable\n{\n    #region Fields\n    /// <summary>\n    ///     The <see cref=\"Regex\" /> to find the prefix in a subject\n    /// </summary>\n    private static readonly Regex SubjectPrefixRegex = new(@\"^(\\D{1,3}:\\s)(.*)$\");\n\n    /// <summary>\n    ///     The E-mail <see cref=\"Recipients\" />\n    /// </summary>\n    private Recipients _recipients;\n\n    /// <summary>\n    ///     The E-mail <see cref=\"Recipients\" />\n    /// </summary>\n    private Recipients _replyToRecipients;\n\n    /// <summary>\n    ///     The E-mail <see cref=\"Attachments\" />\n    /// </summary>\n    private Attachments _attachments;\n\n    /// <summary>\n    ///     The subject of the E-mail\n    /// </summary>\n    private string _subject;\n\n    /// <summary>\n    ///     When set to &lt;c&gt;true&lt;/c&gt; then the &lt;see cref=\"Attachment.Stream\"/&gt;'s\n    ///     will not be disposed when calling the &lt;see cref=\"Dispose\"/&gt; method. Default set to &lt;c&gt;false&lt;/c&gt;\n    /// </summary>\n    private readonly bool _leaveAttachmentStreamsOpen;\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     Returns the sender of the E-mail from the <see cref=\"Recipients\" />\n    /// </summary>\n    public Sender Sender { get; }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user represented by the <see cref=\"Sender\"/>.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are examples of the address properties for the messaging user who is being represented by the\n    ///     <see cref=\"Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n    ///     authorization or verification of the delegate. If no messaging user is being represented, these properties should\n    ///     be set to the e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n    /// </remarks>\n    public Representing Representing { get; }\n\n    /// <summary>\n    ///     Returns the E-mail <see cref=\"Recipients\" />\n    /// </summary>\n    public Recipients Recipients => _recipients ??= new Recipients();\n\n    /// <summary>\n    ///     Returns the E-mail <see cref=\"Recipients\" />\n    /// </summary>\n    public Recipients ReplyToRecipients => _replyToRecipients ??= new Recipients();\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user who receives the message.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are examples of the address properties for the messaging user who receives the message. They must\n    ///     be set by the incoming transport provider.\n    /// </remarks>\n    public Receiving Receiving { get; set; }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user who is represented by the <see cref=\"Receiving\"/> user.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are examples of the address properties for the messaging user who is being represented by the\n    ///     <see cref=\"Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n    ///     authorization or verification of the delegate. If no messaging user is being represented, these properties should\n    ///     be set to the e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n    /// </remarks>\n    public ReceivingRepresenting ReceivingRepresenting { get; internal set; }\n\n    /// <summary>\n    ///     Returns the subject prefix of the E-mail\n    /// </summary>\n    public string SubjectPrefix { get; private set; }\n\n    /// <summary>\n    ///     Returns or sets the subject of the E-mail\n    /// </summary>\n    public string Subject\n    {\n        get => _subject;\n        set\n        {\n            _subject = value;\n            SetSubject();\n        }\n    }\n\n    /// <summary>\n    ///     Returns the normalized subject of the E-mail\n    /// </summary>\n    public string SubjectNormalized { get; private set; }\n\n    /// <summary>\n    ///     Returns or sets the <see cref=\"Enums.MessagePriority\"/>\n    /// </summary>\n    public MessagePriority Priority { get; set; }\n\n    /// <summary>\n    ///     Returns or sets the <see cref=\"Enums.MessageImportance\"/>\n    /// </summary>\n    public MessageImportance Importance { get; set; }\n\n    /// <summary>\n    ///     Returns or sets the text body of the E-mail\n    /// </summary>\n    public string BodyText { get; set; }\n\n    /// <summary>\n    ///     Returns or sets the html body of the E-mail\n    /// </summary>\n    public string BodyHtml { get; set; }\n\n    /// <summary>\n    ///     The compressed RTF body part\n    /// </summary>\n    /// <remarks>\n    ///     When not set then the RTF is generated from <see cref=\"BodyHtml\"/> (when this property is set)\n    /// </remarks>\n    public string BodyRtf { get; set; }\n\n    /// <summary>\n    ///     Returns or set to <c>true</c> when <see cref=\"BodyRtf\"/> is compressed\n    /// </summary>\n    public bool BodyRtfCompressed { get; set; }\n\n    /// <summary>\n    ///     The E-mail <see cref=\"Attachments\" />\n    /// </summary>\n    public Attachments Attachments => _attachments ??= new Attachments();\n\n    /// <summary>\n    ///     Returns or sets the UTC date and time the <see cref=\"Sender\"/> has submitted the\n    ///     <see cref=\"Message\"/>\n    /// </summary>\n    /// <remarks>\n    ///     This property has to be set to UTC datetime. When not set then the current date\n    ///     and time is used\n    /// </remarks>\n    public DateTime? SentOn { get; set; }\n\n    /// <summary>\n    ///     Returns the UTC date and time when the <see cref=\"Message\"/> was received\n    /// </summary>\n    /// <remarks>\n    ///     This property has to be set to UTC datetime\n    /// </remarks>\n    public DateTime? ReceivedOn { get; set; }\n\n    /// <summary>\n    ///     Returns or sets the Internet Message Id\n    /// </summary>\n    /// <remarks>\n    ///     Corresponds to the message ID field as specified in [RFC2822].<br/><br/>\n    ///     If set then this value will be used, when not set the value will be read from the\n    ///     <see cref=\"TransportMessageHeaders\"/> when this property is set\n    /// </remarks>\n    public string InternetMessageId { get; set; }\n\n    /// <summary>\n    ///     Returns or set the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field\n    /// </summary>\n    /// <remarks>\n    ///     If set then this value will be used, when not set the value will be read from the\n    ///     <see cref=\"TransportMessageHeaders\"/> when this property is set\n    /// </remarks>\n    public string InternetReferences { get; set; }\n\n    /// <summary>\n    ///     Returns or sets the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value\n    /// </summary>\n    /// <remarks>\n    ///     If set then this value will be used, when not set the value will be read from the\n    ///     <see cref=\"TransportMessageHeaders\"/> when this property is set\n    /// </remarks>\n    public string InReplyToId { get; set; }\n\n    /// <summary>\n    ///     Sets or returns the <see cref=\"TransportMessageHeaders\"/> property as a string (text).\n    ///     This property expects the headers as a string\n    /// </summary>\n    public string TransportMessageHeadersText\n    {\n        set => TransportMessageHeaders = HeaderExtractor.GetHeaders(value);\n        get => TransportMessageHeaders != null ? TransportMessageHeaders.ToString() : string.Empty;\n    }\n\n    /// <summary>\n    ///     Returns or sets the transport message headers. These are only present when\n    ///     the message has been sent outside an Exchange environment to another mailserver\n    ///     <c>null</c> will be returned when not present\n    /// </summary>\n    /// <remarks>\n    ///     Use the <see cref=\"TransportMessageHeaders\"/> property if you want to set\n    ///     the headers directly from a string otherwise see the example code below.\n    /// </remarks>\n    /// <example>\n    ///     <code>\n    ///     var email = new Email();\n    ///     email.TransportMessageHeaders = new MessageHeader();\n    ///     // ... do something with it, for example\n    ///     email.TransportMessageHeaders.SetHeaderValue(\"X-MY-CUSTOM-HEADER\", \"EXAMPLE VALUE\");\n    ///     </code>\n    /// </example>\n    public MessageHeader TransportMessageHeaders { get; set; }\n\n    /// <summary>\n    ///     Returns <c>true</c> when the message is set as a draft message\n    /// </summary>\n    public bool Draft { get; }\n\n    /// <summary>\n    ///     Returns <c>true</c> when a read receipt is requested\n    /// </summary>\n    public bool ReadRecipient { get; }\n\n    /// <summary>\n    ///     Specifies the format for an editor to use to display a message.\n    /// </summary>\n    public MessageEditorFormat MessageEditorFormat { get; set; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all the needed properties\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"Sender\"/> of the E-mail</param>\n    /// <param name=\"subject\">The subject of the E-mail</param>\n    /// <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n    /// <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    /// <param name=\"leaveAttachmentStreamsOpen\">When set to <c>true</c> then the <see cref=\"Attachment.Stream\"/>'s\n    /// will not be disposed when calling the <see cref=\"Dispose\"/> method. Default set to <c>false</c></param>\n    public Email(Sender sender,\n        string subject,\n        bool draft = false,\n        bool readReceipt = false,\n        bool leaveAttachmentStreamsOpen = false)\n    {\n        Sender = sender;\n        Subject = subject;\n        Importance = MessageImportance.IMPORTANCE_NORMAL;\n        IconIndex = MessageIconIndex.NewMail;\n        Draft = draft;\n        ReadRecipient = readReceipt;\n        _leaveAttachmentStreamsOpen = leaveAttachmentStreamsOpen;\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all the needed properties\n    /// </summary>\n    /// <param name=\"sender\">The <see cref=\"Sender\"/> of the E-mail</param>\n    /// <param name=\"representing\">The <see cref=\"MsgKit.Representing\"/> sender of the E-mail</param>\n    /// <param name=\"subject\">The subject of the E-mail</param>\n    /// <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n    /// <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    /// <param name=\"leaveAttachmentStreamsOpen\">When set to <c>true</c> then the <see cref=\"Attachment.Stream\"/>'s\n    /// will not be disposed when calling the <see cref=\"Dispose\"/> method. Default set to <c>false</c></param>\n    public Email(Sender sender,\n        Representing representing,\n        string subject,\n        bool draft = false,\n        bool readReceipt = false,\n        bool leaveAttachmentStreamsOpen = false)\n    {\n        Sender = sender;\n        Representing = representing;\n        Subject = subject;\n        Importance = MessageImportance.IMPORTANCE_NORMAL;\n        IconIndex = MessageIconIndex.NewMail;\n        Draft = draft;\n        ReadRecipient = readReceipt;\n        _leaveAttachmentStreamsOpen = leaveAttachmentStreamsOpen;\n    }\n    #endregion\n\n    #region SetSubject\n    /// <summary>\n    ///     These properties are computed by message store or transport providers from the PR_SUBJECT (PidTagSubject)\n    ///     and PR_SUBJECT_PREFIX (PidTagSubjectPrefix) properties in the following manner. If the PR_SUBJECT_PREFIX\n    ///     is present and is an initial substring of PR_SUBJECT, PR_NORMALIZED_SUBJECT and associated properties are\n    ///     set to the contents of PR_SUBJECT with the prefix removed. If PR_SUBJECT_PREFIX is present, but it is not\n    ///     an initial substring of PR_SUBJECT, PR_SUBJECT_PREFIX is deleted and recalculated from PR_SUBJECT using\n    ///     the following rule: If the string contained in PR_SUBJECT begins with one to three non-numeric characters\n    ///     followed by a colon and a space, then the string together with the colon and the blank becomes the prefix.\n    ///     Numbers, blanks, and punctuation characters are not valid prefix characters. If PR_SUBJECT_PREFIX is not\n    ///     present, it is calculated from PR_SUBJECT using the rule outlined in the previous step.This property then\n    ///     is set to the contents of PR_SUBJECT with the prefix removed.\n    /// </summary>\n    /// <remarks>\n    ///     When PR_SUBJECT_PREFIX is an empty string, PR_SUBJECT and PR_NORMALIZED_SUBJECT are the same. Ultimately,\n    ///     this property should be the part of PR_SUBJECT following the prefix. If there is no prefix, this property\n    ///     becomes the same as PR_SUBJECT.\n    /// </remarks>\n    protected void SetSubject()\n    {\n        if (!string.IsNullOrEmpty(SubjectPrefix) && !string.IsNullOrEmpty(Subject))\n        {\n            if (Subject.StartsWith(SubjectPrefix))\n            {\n                SubjectNormalized = Subject.Substring(SubjectPrefix.Length);\n            }\n            else\n            {\n                var matches = SubjectPrefixRegex.Matches(Subject);\n                if (matches.Count > 0)\n                {\n                    SubjectPrefix = matches.OfType<Match>().First().Groups[1].Value;\n                    SubjectNormalized = matches.OfType<Match>().First().Groups[2].Value;\n                }\n            }\n        }\n        else if (!string.IsNullOrEmpty(Subject))\n        {\n            var matches = SubjectPrefixRegex.Matches(Subject);\n            if (matches.Count > 0)\n            {\n                SubjectPrefix = matches.OfType<Match>().First().Groups[1].Value;\n                SubjectNormalized = matches.OfType<Match>().First().Groups[2].Value;\n            }\n            else\n                SubjectNormalized = Subject;\n        }\n        else\n            SubjectNormalized = Subject;\n\n        SubjectPrefix ??= string.Empty;\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes all the properties that are part of the <see cref=\"Email\"/> object either as <see cref=\"OpenMcdf.Storage\"/>'s\n    ///     or <see cref=\"CfbStream\"/>'s to the <see cref=\"RootStorage\"/>\n    /// </summary>\n    internal void WriteToStorage()\n    {\n        var rootStorage = CompoundFile;\n\n        if (Class == MessageClass.Unknown)\n            Class = MessageClass.IPM_Note;\n\n        MessageSize += Recipients.WriteToStorage(rootStorage);\n        MessageSize += Attachments.WriteToStorage(rootStorage);\n\n        var recipientCount = Recipients.Count;\n        var attachmentCount = Attachments.Count;\n        TopLevelProperties.RecipientCount = recipientCount;\n        TopLevelProperties.AttachmentCount = attachmentCount;\n        TopLevelProperties.NextRecipientId = recipientCount;\n        TopLevelProperties.NextAttachmentId = attachmentCount;\n\n        TopLevelProperties.AddProperty(PropertyTags.PR_ENTRYID, Mapi.GenerateEntryId());\n        TopLevelProperties.AddProperty(PropertyTags.PR_INSTANCE_KEY, Mapi.GenerateInstanceKey());\n        TopLevelProperties.AddProperty(PropertyTags.PR_STORE_SUPPORT_MASK, StoreSupportMaskConst.StoreSupportMask, PropertyFlags.PROPATTR_READABLE);\n        TopLevelProperties.AddProperty(PropertyTags.PR_STORE_UNICODE_MASK, StoreSupportMaskConst.StoreSupportMask, PropertyFlags.PROPATTR_READABLE);\n        TopLevelProperties.AddProperty(PropertyTags.PR_ALTERNATE_RECIPIENT_ALLOWED, true, PropertyFlags.PROPATTR_READABLE);\n        TopLevelProperties.AddProperty(PropertyTags.PR_HASATTACH, attachmentCount > 0);\n\n        if (TransportMessageHeaders != null)\n        {\n            TopLevelProperties.AddProperty(PropertyTags.PR_TRANSPORT_MESSAGE_HEADERS_W,\n                TransportMessageHeaders.ToString());\n\n            if (!string.IsNullOrWhiteSpace(TransportMessageHeaders.MessageId))\n                TopLevelProperties.AddProperty(PropertyTags.PR_INTERNET_MESSAGE_ID_W,\n                    TransportMessageHeaders.MessageId);\n\n            if (TransportMessageHeaders.References.Any())\n                TopLevelProperties.AddProperty(PropertyTags.PR_INTERNET_REFERENCES_W,\n                    TransportMessageHeaders.References.Last());\n\n            if (TransportMessageHeaders.InReplyTo.Any())\n                TopLevelProperties.AddProperty(PropertyTags.PR_IN_REPLY_TO_ID_W,\n                    TransportMessageHeaders.InReplyTo.Last());\n        }\n\n        if (!string.IsNullOrWhiteSpace(InternetMessageId))\n            TopLevelProperties.AddOrReplaceProperty(PropertyTags.PR_INTERNET_MESSAGE_ID_W, InternetMessageId);\n\n        if (!string.IsNullOrWhiteSpace(InternetReferences))\n            TopLevelProperties.AddOrReplaceProperty(PropertyTags.PR_INTERNET_REFERENCES_W, InternetReferences);\n\n        if (!string.IsNullOrWhiteSpace(InReplyToId))\n            TopLevelProperties.AddOrReplaceProperty(PropertyTags.PR_IN_REPLY_TO_ID_W, InReplyToId);\n\n        var messageFlags = MessageFlags.MSGFLAG_UNMODIFIED;\n\n        if (attachmentCount > 0)\n            messageFlags |= MessageFlags.MSGFLAG_HASATTACH;\n\n        TopLevelProperties.AddProperty(PropertyTags.PR_INTERNET_CPID, Encoding.UTF8.CodePage);\n\n        TopLevelProperties.AddProperty(PropertyTags.PR_BODY_W, BodyText);\n\n        if (!string.IsNullOrEmpty(BodyHtml) && !Draft)\n        {\n            TopLevelProperties.AddProperty(PropertyTags.PR_HTML, BodyHtml);\n            TopLevelProperties.AddProperty(PropertyTags.PR_RTF_IN_SYNC, false);\n        }\n        else if (string.IsNullOrWhiteSpace(BodyRtf) && !string.IsNullOrWhiteSpace(BodyHtml))\n        {\n            BodyRtf = Encapsulator.Encapsulate(BodyHtml);\n            BodyRtfCompressed = true;\n        }\n\n        if (!string.IsNullOrWhiteSpace(BodyRtf))\n        {\n            TopLevelProperties.AddProperty(PropertyTags.PR_RTF_COMPRESSED, new Compressor().Compress(Encoding.ASCII.GetBytes(BodyRtf)));\n            TopLevelProperties.AddProperty(PropertyTags.PR_RTF_IN_SYNC, BodyRtfCompressed);\n        }\n\n        if (MessageEditorFormat != MessageEditorFormat.EDITOR_FORMAT_DONTKNOW)\n            TopLevelProperties.AddProperty(PropertyTags.PR_MSG_EDITOR_FORMAT, MessageEditorFormat);\n\n        if (ReceivedOn.HasValue && ReceivedOn > DateTime.MinValue)\n            TopLevelProperties.AddProperty(PropertyTags.PR_MESSAGE_DELIVERY_TIME, ReceivedOn.Value.ToUniversalTime());\n\n        if (SentOn.HasValue && SentOn > DateTime.MinValue)\n            TopLevelProperties.AddProperty(PropertyTags.PR_CLIENT_SUBMIT_TIME, SentOn.Value.ToUniversalTime());\n\n        TopLevelProperties.AddProperty(PropertyTags.PR_ACCESS, MapiAccess.MAPI_ACCESS_DELETE | MapiAccess.MAPI_ACCESS_MODIFY | MapiAccess.MAPI_ACCESS_READ);\n        TopLevelProperties.AddProperty(PropertyTags.PR_ACCESS_LEVEL, MapiAccess.MAPI_ACCESS_MODIFY);\n        TopLevelProperties.AddProperty(PropertyTags.PR_OBJECT_TYPE, MapiObjectType.MAPI_MESSAGE);\n\n        SetSubject();\n        TopLevelProperties.AddProperty(PropertyTags.PR_SUBJECT_W, Subject);\n        TopLevelProperties.AddProperty(PropertyTags.PR_NORMALIZED_SUBJECT_W, SubjectNormalized);\n        TopLevelProperties.AddProperty(PropertyTags.PR_SUBJECT_PREFIX_W, SubjectPrefix);\n        TopLevelProperties.AddProperty(PropertyTags.PR_CONVERSATION_TOPIC_W, SubjectNormalized);\n\n        // http://www.meridiandiscovery.com/how-to/e-mail-conversation-index-metadata-computer-forensics/\n        // http://stackoverflow.com/questions/11860540/does-outlook-embed-a-messageid-or-equivalent-in-its-email-elements\n        //propertiesStream.AddProperty(PropertyTags.PR_CONVERSATION_INDEX, Subject);\n\n        // TODO: Change modification time when this message is opened and only modified\n        var utcNow = DateTime.UtcNow;\n        TopLevelProperties.AddProperty(PropertyTags.PR_CREATION_TIME, utcNow);\n        TopLevelProperties.AddProperty(PropertyTags.PR_LAST_MODIFICATION_TIME, utcNow);\n        TopLevelProperties.AddProperty(PropertyTags.PR_PRIORITY, Priority);\n        TopLevelProperties.AddProperty(PropertyTags.PR_IMPORTANCE, Importance);\n        TopLevelProperties.AddProperty(PropertyTags.PR_MESSAGE_LOCALE_ID, CultureInfo.CurrentCulture.LCID);\n\n        if (Draft)\n        {\n            messageFlags |= MessageFlags.MSGFLAG_UNSENT;\n\n            // Only set the IconIndex when it is not changed from NewEmail to something else\n            if (IconIndex == MessageIconIndex.NewMail)\n                IconIndex = MessageIconIndex.UnsentMail;\n        }\n\n        if (ReadRecipient)\n        {\n            TopLevelProperties.AddProperty(PropertyTags.PR_READ_RECEIPT_REQUESTED, true);\n            var reportTag = new ReportTag { ANSIText = Subject };\n            TopLevelProperties.AddProperty(PropertyTags.PR_REPORT_TAG, reportTag.ToByteArray());\n        }\n\n        TopLevelProperties.AddProperty(PropertyTags.PR_MESSAGE_FLAGS, messageFlags);\n        TopLevelProperties.AddProperty(PropertyTags.PR_ICON_INDEX, IconIndex);\n\n        Sender?.WriteProperties(TopLevelProperties);\n        Receiving?.WriteProperties(TopLevelProperties);\n        Representing?.WriteProperties(TopLevelProperties);\n        ReceivingRepresenting?.WriteProperties(TopLevelProperties);\n\n        if (recipientCount > 0)\n        {\n            var displayTo = new List<string>();\n            var displayCc = new List<string>();\n            var displayBcc = new List<string>();\n\n            foreach (var recipient in Recipients)\n            {\n                switch (recipient.RecipientType)\n                {\n                    case RecipientType.To:\n                        if (!string.IsNullOrWhiteSpace(recipient.DisplayName))\n                            displayTo.Add(recipient.DisplayName);\n                        else if (!string.IsNullOrWhiteSpace(recipient.Email))\n                            displayTo.Add(recipient.Email);\n                        break;\n\n                    case RecipientType.Cc:\n                        if (!string.IsNullOrWhiteSpace(recipient.DisplayName))\n                            displayCc.Add(recipient.DisplayName);\n                        else if (!string.IsNullOrWhiteSpace(recipient.Email))\n                            displayCc.Add(recipient.Email);\n                        break;\n\n                    case RecipientType.Bcc:\n                        if (!string.IsNullOrWhiteSpace(recipient.DisplayName))\n                            displayBcc.Add(recipient.DisplayName);\n                        else if (!string.IsNullOrWhiteSpace(recipient.Email))\n                            displayBcc.Add(recipient.Email);\n                        break;\n\n                    default:\n                        throw new ArgumentOutOfRangeException();\n                }\n            }\n\n            var replyToRecipients = new List<string>();\n\n            foreach (var recipient in ReplyToRecipients)\n            {\n                replyToRecipients.Add(recipient.Email);\n            }\n\n            TopLevelProperties.AddProperty(PropertyTags.PR_DISPLAY_TO_W, string.Join(\";\", displayTo),\n                PropertyFlags.PROPATTR_READABLE);\n            TopLevelProperties.AddProperty(PropertyTags.PR_DISPLAY_CC_W, string.Join(\";\", displayCc),\n                PropertyFlags.PROPATTR_READABLE);\n            TopLevelProperties.AddProperty(PropertyTags.PR_DISPLAY_BCC_W, string.Join(\";\", displayBcc),\n                PropertyFlags.PROPATTR_READABLE);\n            TopLevelProperties.AddProperty(PropertyTags.PR_REPLY_RECIPIENT_NAMES_W,\n                string.Join(\";\", replyToRecipients), PropertyFlags.PROPATTR_READABLE);\n        }\n    }\n    #endregion\n\n    #region Save\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"stream\" />\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    public new void Save(Stream stream)\n    {\n        WriteToStorage();\n        base.Save(stream);\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"fileName\" />\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    public new void Save(string fileName)\n    {\n        WriteToStorage();\n        base.Save(fileName);\n    }\n    #endregion\n\n    #region Dispose\n    /// <summary>\n    ///     Disposes all the attachment streams\n    /// </summary>\n    public new void Dispose()\n    {\n        if (!_leaveAttachmentStreamsOpen)\n            foreach (var attachment in _attachments)\n                attachment.Stream?.Dispose();\n\n        base.Dispose();\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Enums/AddressBookEntryIdType.cs",
    "content": "//\n// AddressBookEntryIdType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     An integer representing the type of the object. It MUST be one of the values from the following table.\n/// </summary>\npublic enum AddressBookEntryIdType\n{\n    /// <summary>\n    /// A local mail user\n    /// </summary>\n    LocalMailUser = 0x00000000,\n\n    /// <summary>\n    /// A distribution list\n    /// </summary>\n    DistributionList = 0x00000001,\n\n    /// <summary>\n    /// A bulletinboard or public folder\n    /// </summary>\n    BulletinBoardOrPublicFolder = 0x00000002,\n\n    /// <summary>\n    /// An automated mailbox\n    /// </summary>\n    AutomatedMailBox = 0x00000003,\n\n    /// <summary>\n    /// An organiztional mailbox\n    /// </summary>\n    OrganizationalMailBox = 0x00000004,\n\n    /// <summary>\n    /// A private distribtion list\n    /// </summary>\n    PrivateDistributionList = 0x00000005,\n\n    /// <summary>\n    /// A remote mail user\n    /// </summary>\n    RemoteMailUser = 0x00000006,\n\n    /// <summary>\n    /// A container\n    /// </summary>\n    Container = 0x00000100,\n\n    /// <summary>\n    /// A template\n    /// </summary>\n    Template = 0x00000101,\n\n    /// <summary>\n    /// One off user\n    /// </summary>\n    OneOffUser = 0x00000102,\n\n    /// <summary>\n    /// Search\n    /// </summary>\n    Search = 0x00000200\n}"
  },
  {
    "path": "MsgKit/Enums/AddressType.cs",
    "content": "﻿//\n// AddressType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains the messaging user's e-mail address type, such as SMTP.\n/// </summary>\npublic enum AddressType\n{\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    Unknown,\n\n    /// <summary>\n    ///     Exchange\n    /// </summary>\n    Ex,\n\n    /// <summary>\n    ///     Simple Mail Transfer Protocol\n    /// </summary>\n    Smtp,\n\n    /// <summary>\n    ///     Fax\n    /// </summary>\n    Fax,\n\n    /// <summary>\n    ///     MHS\n    /// </summary>\n    Mhs,\n\n    /// <summary>\n    ///     PROFS\n    /// </summary>\n    Profs,\n\n    /// <summary>\n    ///     X400\n    /// </summary>\n    X400\n}"
  },
  {
    "path": "MsgKit/Enums/AppointmentState.cs",
    "content": "// ReSharper disable InconsistentNaming\n\n//\n// AppointmentState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidAppointmentStateFlags \"/> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc815362(v=office.15).aspx\n/// </remarks>\npublic enum AppointmentState : uint\n{\n    /// <summary>\n    ///     This flag indicates that the object is a meeting object or a meeting-related object.\n    /// </summary>\n    asfMeeting = 0x00000001,\n\n    /// <summary>\n    ///     This flag indicates that the represented object was received from someone else.\n    /// </summary>\n    asfReceived = 0x00000002,\n\n    /// <summary>\n    ///     This flag indicates that the meeting object represented by the object has been canceled.\n    /// </summary>\n    asfCanceled = 0x00000004,\n\n    /// <summary>\n    ///     Full update.\n    /// </summary>\n    mtgInfo = 0x00020000,\n\n    /// <summary>\n    ///     A newer meeting request or meeting update was received after this one.\n    /// </summary>\n    mtgOutOfDate = 0x00080000,\n\n    /// <summary>\n    ///     This is set on the delegators copy when a delegate handles meeting-related objects.\n    /// </summary>\n    mtgDelegatorCopy = 0x00100000\n}"
  },
  {
    "path": "MsgKit/Enums/AttachmentFlags.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// AttachmentType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains a bitmask of flags for an attachment.\n/// </summary>\n/// <remarks>\n///     See https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/cc765876(v=office.12)\n/// </remarks>\npublic enum AttachmentFlags : uint\n{\n    /// <summary>\n    ///     Indicates that this attachment is not available to HTML rendering applications and should be ignored in\n    ///     Multipurpose Internet Mail Extensions (MIME) processing.\n    /// </summary>\n    ATT_INVISIBLE_IN_HTML = 0x00000001,\n\n    /// <summary>\n    ///     Indicates that this attachment is not available to applications rendering in Rich Text Format (RTF) and should be\n    ///     ignored by MAPI.\n    /// </summary>\n    ATT_INVISIBLE_IN_RTF = 0x00000002,\n\n    /// <summary>\n    ///     The Attachment object is referenced and rendered within the HTML body of the associated Message object.\n    /// </summary>\n    ATT_MHTML_REF = 0x00000004\n}"
  },
  {
    "path": "MsgKit/Enums/AttachmentType.cs",
    "content": "// ReSharper disable InconsistentNaming\n\n//\n// AttachmentType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The type of the attachment\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc815439.aspx\n/// </remarks>\npublic enum AttachmentType : uint\n{\n    /// <summary>\n    ///     There is no attachment\n    /// </summary>\n    NO_ATTACHMENT = 0x00000000,\n\n    /// <summary>\n    ///     The  <see cref=\"PropertyTags.PR_ATTACH_DATA_BIN\" /> property contains the attachment data\n    /// </summary>\n    ATTACH_BY_VALUE = 0x00000001,\n\n    /// <summary>\n    ///     The <see cref=\"PropertyTags.PR_ATTACH_PATHNAME_W\" /> or <see cref=\"PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n    ///     property contains a fully qualified path identifying the attachment to recipients with access to a common file server\n    /// </summary>\n    ATTACH_BY_REFERENCE = 0x0002,\n\n    /// <summary>\n    ///     The <see cref=\"PropertyTags.PR_ATTACH_PATHNAME_W\" /> or <see cref=\"PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n    ///     property contains a fully qualified path identifying the attachment\n    /// </summary>\n    ATTACH_BY_REF_RESOLVE = 0x0003,\n\n    /// <summary>\n    ///     The <see cref=\"PropertyTags.PR_ATTACH_PATHNAME_W\" /> or <see cref=\"PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n    ///     property contains a fully qualified path identifying the attachment\n    /// </summary>\n    ATTACH_BY_REF_ONLY = 0x0004,\n\n    /// <summary>\n    ///     The  <see cref=\"PropertyTags.PR_ATTACH_DATA_OBJ\" /> (PidTagAttachDataObject) property contains an embedded object\n    ///     that supports the IMessage interface\n    /// </summary>\n    ATTACH_EMBEDDED_MSG = 0x0005,\n\n    /// <summary>\n    ///     The attachment is an embedded OLE object\n    /// </summary>\n    ATTACH_OLE = 0x0006,\n\n    /// <summary>\n    ///     The <see cref=\"PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" /> property contains a fully qualified path identifying the attachment.\n    ///     The <see cref=\"PropertyTags.PR_NAME_A\" /> PidNameAttachmentProviderType defines the web service API manipulating the attachment.\n    /// </summary>\n    ATTACH_BY_WEB_REFERENCE = 0x0007\n}"
  },
  {
    "path": "MsgKit/Enums/MapiAccess.cs",
    "content": "﻿//\n// MapiAccess.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains a bitmask of flags indicating the operations that are available to the client for the object.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc979218.aspx\n///     This property is read-only for the client. It must be a bitwise OR of zero or more values from the following table.\n/// </remarks>\n[Flags]\npublic enum MapiAccess : uint\n{\n    /// <summary>\n    ///     Write\n    /// </summary>\n    MAPI_ACCESS_MODIFY = 0x00000001,\n\n    /// <summary>\n    ///     Read\n    /// </summary>\n    MAPI_ACCESS_READ = 0x00000002,\n\n    /// <summary>\n    ///     Delete\n    /// </summary>\n    MAPI_ACCESS_DELETE = 0x00000004,\n\n    /// <summary>\n    ///     Create subfolders in the folder hierarchy\n    /// </summary>\n    MAPI_ACCESS_CREATE_HIERARCHY = 0x00000008,\n\n    /// <summary>\n    ///     Create content messages\n    /// </summary>\n    MAPI_ACCESS_CREATE_CONTENTS = 0x00000010,\n\n    /// <summary>\n    ///     Create associated content messages\n    /// </summary>\n    MAPI_ACCESS_CREATE_ASSOCIATED = 0x00000020\n}"
  },
  {
    "path": "MsgKit/Enums/MapiObjectType.cs",
    "content": "﻿//\n// MapiObjectType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains the type of an object.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc815487.aspx\n///     The object type contained in this property corresponds to the primary interface available for an object accessible\n///     through the OpenEntry interface. It is usually obtained by consulting the lpulObjType parameter returned by the\n///     appropriate OpenEntry method. When the interface is obtained in other ways, call IMAPIProp::GetProps to obtain the\n///     value for this property.\n/// </remarks>\n[Flags]\npublic enum MapiObjectType : uint\n{\n    /// <summary>\n    ///     Address book container object\n    /// </summary>\n    MAPI_ABCONT = 4,\n\n    /// <summary>\n    ///     Address book object\n    /// </summary>\n    MAPI_ADDRBOOK = 2,\n\n    /// <summary>\n    ///     Message attachment object\n    /// </summary>\n    MAPI_ATTACH = 7,\n\n    /// <summary>\n    ///     Distribution list object\n    /// </summary>\n    MAPI_DISTLIST = 8,\n\n    /// <summary>\n    ///     Folder object\n    /// </summary>\n    MAPI_FOLDER = 3,\n\n    /// <summary>\n    ///     Form object\n    /// </summary>\n    MAPI_FORMINFO = 12,\n\n    /// <summary>\n    ///     Messaging user object\n    /// </summary>\n    MAPI_MAILUSER = 6,\n\n    /// <summary>\n    ///     Message object\n    /// </summary>\n    MAPI_MESSAGE = 5,\n\n    /// <summary>\n    ///     Profile section object\n    /// </summary>\n    MAPI_PROFSECT = 9,\n\n    /// <summary>\n    ///     Session object\n    /// </summary>\n    MAPI_SESSION = 11,\n\n    /// <summary>\n    ///     Status object\n    /// </summary>\n    MAPI_STATUS = 10,\n\n    /// <summary>\n    ///     Message store object\n    /// </summary>\n    MAPI_STORE = 1\n}"
  },
  {
    "path": "MsgKit/Enums/MeetingType.cs",
    "content": "// ReSharper disable InconsistentNaming\n\n//\n// MeetingType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidMeetingType\"/> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc815362(v=office.15).aspx\n/// </remarks>\npublic enum MeetingType : uint\n{\n    /// <summary>\n    ///     Unspecified.\n    /// </summary>\n    mtgEmpty = 0x00000000,\n\n    /// <summary>\n    ///     nitial meeting request.\n    /// </summary>\n    mtgRequest = 0x00000001,\n\n    /// <summary>\n    ///     Full update.\n    /// </summary>\n    mtgFull = 0x00010000,\n\n    /// <summary>\n    ///     Full update.\n    /// </summary>\n    mtgInfo = 0x00020000,\n\n    /// <summary>\n    ///     A newer meeting request or meeting update was received after this one.\n    /// </summary>\n    mtgOutOfDate = 0x00080000,\n\n    /// <summary>\n    ///     This is set on the delegators copy when a delegate handles meeting-related objects.\n    /// </summary>\n    mtgDelegatorCopy = 0x00100000\n}"
  },
  {
    "path": "MsgKit/Enums/MessageClass.cs",
    "content": "//\n// MessageClass.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The MessageClass element is an optional element that specifies the message class of this e-mail message.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee200767(v=exchg.80).aspx\n/// </remarks>\npublic enum MessageClass\n{\n    /// <summary>\n    ///     The message type is unknown\n    /// </summary>\n    Unknown,\n\n    /// <summary>\n    ///     Normal e-mail message.\n    /// </summary>\n    IPM_Note,\n\n    /// <summary>\n    ///     The message is encrypted and can also be signed.\n    /// </summary>\n    IPM_Note_SMIME,\n\n    /// <summary>\n    ///     The message is clear signed.\n    /// </summary>\n    IPM_Note_SMIME_MultipartSigned,\n\n    /// <summary>\n    ///     The message is a secure read receipt.\n    /// </summary>\n    IPM_Note_Receipt_SMIME,\n\n    /// <summary>\n    ///     Post.\n    /// </summary>\n    IPM_Post,\n\n    /// <summary>\n    ///     Octel voice message.\n    /// </summary>\n    IPM_Octel_Voice,\n\n    /// <summary>\n    ///     Electronic voice notes.\n    /// </summary>\n    IPM_Voicenotes,\n\n    /// <summary>\n    ///     Shared message.\n    /// </summary>\n    IPM_Sharing,\n\n    /// <summary>\n    ///     Non-delivery report for a standard message.\n    /// </summary>\n    REPORT_IPM_NOTE_NDR,\n\n    /// <summary>\n    ///     Delivery receipt for a standard message.\n    /// </summary>\n    REPORT_IPM_NOTE_DR,\n\n    /// <summary>\n    ///     Delivery receipt for a delayed message.\n    /// </summary>\n    REPORT_IPM_NOTE_DELAYED,\n\n    /// <summary>\n    ///     Read receipt for a standard message.\n    /// </summary>\n    REPORT_IPM_NOTE_IPNRN,\n\n    /// <summary>\n    ///     Non-read receipt for a standard message.\n    /// </summary>\n    REPORT_IPM_NOTE_IPNNRN,\n\n    /// <summary>\n    ///     Non-delivery report for a meeting request.\n    /// </summary>\n    REPORT_IPM_SCHEDULE_MEETING_REQUEST_NDR,\n\n    /// <summary>\n    ///     Non-delivery report for a positive meeting response (accept).\n    /// </summary>\n    REPORT_IPM_SCHEDULE_MEETING_RESP_POS_NDR,\n\n    /// <summary>\n    ///     Non-delivery report for a Tentative meeting response.\n    /// </summary>\n    REPORT_IPM_SCHEDULE_MEETING_RESP_TENT_NDR,\n\n    /// <summary>\n    ///     Non-delivery report for a cancelled meeting notification.\n    /// </summary>\n    REPORT_IPM_SCHEDULE_MEETING_CANCELED_NDR,\n\n    /// <summary>\n    ///     Non-delivery report for a Secure MIME (S/MIME) encrypted and opaque-signed message.\n    /// </summary>\n    REPORT_IPM_NOTE_SMIME_NDR,\n\n    /// <summary>\n    ///     Delivery receipt for an S/MIME encrypted and opaque-signed message.\n    /// </summary>\n    REPORT_IPM_NOTE_SMIME_DR,\n\n    /// <summary>\n    ///     Non-delivery report for an S/MIME clear-signed message.\n    /// </summary>\n    REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_NDR,\n\n    /// <summary>\n    ///     Delivery receipt for an S/MIME clear-signed message.\n    /// </summary>\n    REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_DR,\n\n    /// <summary>\n    ///     An appointment\n    /// </summary>\n    IPM_Appointment,\n\n    /// <summary>\n    ///     Task\n    /// </summary>\n    IPM_Task,\n\n    /// <summary>\n    ///     A contact\n    /// </summary>\n    IPM_Contact\n}"
  },
  {
    "path": "MsgKit/Enums/MessageEditorFormat.cs",
    "content": "﻿//\n// MessageEditorFormat.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Specifies the format for an editor to use to display a message.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc765727.aspx\n/// </remarks>\npublic enum MessageEditorFormat\n{\n    /// <summary>\n    ///     The format for the editor to use is unknown.\n    /// </summary>\n    EDITOR_FORMAT_DONTKNOW = 0x00000000,\n\n    /// <summary>\n    ///     The editor should display the message in plain text format.\n    /// </summary>\n    EDITOR_FORMAT_PLAINTEXT = 0x00000001,\n\n    /// <summary>\n    ///     The editor should display the message in HTML format.\n    /// </summary>\n    EDITOR_FORMAT_HTML = 0x00000002,\n\n    /// <summary>\n    ///     The editor should display the message in Rich Text Format.\n    /// </summary>\n    EDITOR_FORMAT_RTF = 0x00000003\n}"
  },
  {
    "path": "MsgKit/Enums/MessageFlags.cs",
    "content": "﻿//\n// MessageFlags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains a bitmask of flags that indicate the origin and current state of a message.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc839733(v=office.15).aspx\n///     This property is a nontransmittable message property exposed at both the sending and receiving ends of a\n///     transmission, with different values depending upon the client application or store provider involved. This property\n///     is initialized by the client or message store provider when a message is created and saved for the first time and\n///     then updated periodically by the message store provider, a transport provider, and the MAPI spooler as the message\n///     is processed and its state changes.\n///     This property exists on a message both before and after submission, and on all copies of the received\n///     message. Although it is not a recipient property, it is exposed differently to each recipient according to whether\n///     it has been read or modified by that recipient.\n/// </remarks>\n[Flags]\npublic enum MessageFlags : uint\n{\n    /// <summary>\n    ///     The message is marked as having been read. This can occur as the result of a call at any time to\n    ///     IMessage::SetReadFlag or IMAPIFolder::SetReadFlags. Clients can also set this flag by calling a message's\n    ///     IMAPIProp::SetProps method before the message has been saved for the first time. This flag is ignored if the\n    ///     ASSOCIATED flag is set.\n    /// </summary>\n    MSGFLAG_READ = 0x0001,\n\n    /// <summary>\n    ///     The outgoing message has not been modified since the first time that it was saved; the incoming message has not\n    ///     been modified since it was delivered.\n    /// </summary>\n    MSGFLAG_UNMODIFIED = 0x0002,\n\n    /// <summary>\n    ///     The message is marked for sending as a result of a call to IMessage::SubmitMessage. Message store providers set\n    ///     this flag; the client has read-only access.\n    /// </summary>\n    MSGFLAG_SUBMIT = 0x0004,\n\n    /// <summary>\n    ///     The message is still being composed. It is saved, but has not been sent. The client or provider has read/write\n    ///     access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter. If a client doesn't set\n    ///     this flag by the time the message is sent, the message store provider sets it when IMessage::SubmitMessage is\n    ///     called. Typically, this flag is cleared after the message is sent.\n    /// </summary>\n    MSGFLAG_UNSENT = 0x0008,\n\n    /// <summary>\n    ///     The message has at least one attachment. This flag corresponds to the message's PR_HASATTACH (PidTagHasAttachments)\n    ///     property. The client has read-only access to this flag.\n    /// </summary>\n    MSGFLAG_HASATTACH = 0x0010,\n\n    /// <summary>\n    ///     The messaging user sending was the messaging user receiving the message. The client or provider has read/write\n    ///     access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter. This flag is meant to be\n    ///     set by the transport provider.\n    /// </summary>\n    MSGFLAG_FROMME = 0x0020,\n\n    /// <summary>\n    ///     The message is an associated message of a folder. The client or provider has read-only access to this flag. The\n    ///     READ flag is ignored for associated messages, which do not retain a read/unread state.\n    /// </summary>\n    MSGFLAG_ASSOCIATED = 0x040,\n\n    /// <summary>\n    ///     The message includes a request for a resend operation with a nondelivery report. The client or provider has\n    ///     read/write access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter.\n    /// </summary>\n    MSGFLAG_RESEND = 0x0080,\n\n    /// <summary>\n    ///     A read report needs to be sent for the message. The client or provider has read-only access to this flag.\n    /// </summary>\n    MSGFLAG_NOTIFYREAD = 0x100,\n\n    /// <summary>\n    ///     A nonread report needs to be sent for the message. The client or provider has read-only access to this flag.\n    /// </summary>\n    MSGFLAG_NOTIFYUNREAD = 0x0200,\n\n    /// <summary>\n    ///     The message has been read at least once. This flag is set or cleared by the server whenever the MSGFLAG_READ flag\n    ///     is set or cleared.\n    /// </summary>\n    MSGFLAG_EVERREAD = 0x0400,\n\n    /// <summary>\n    ///     The incoming message arrived over an X.400 link. It originated either outside the organization or from a source the\n    ///     gateway cannot consider trusted. The client should display an appropriate message to the user. Transport providers\n    ///     set this flag; the client has read-only access.\n    /// </summary>\n    MSGFLAG_ORIGIN_X400 = 0x1000,\n\n    /// <summary>\n    ///     The incoming message arrived over the Internet. It originated either outside the organization or from a source the\n    ///     gateway cannot consider trusted. The client should display an appropriate message to the user. Transport providers\n    ///     set this flag; the client has read-only access.\n    /// </summary>\n    MSGFLAG_ORIGIN_INTERNET = 0x2000,\n\n    /// <summary>\n    ///     The incoming message arrived over an external link other than X.400 or the Internet. It originated either outside\n    ///     the organization or from a source the gateway cannot consider trusted. The client should display an appropriate\n    ///     message to the user. Transport providers set this flag; the client has read-only access.\n    /// </summary>\n    MSGFLAG_ORIGIN_MISC_EXT = 0x8000\n}"
  },
  {
    "path": "MsgKit/Enums/MessageFormat.cs",
    "content": "﻿//\n// MessageFormat.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The messageformat to use\n/// </summary>\npublic enum MessageFormat\n{\n    /// <summary>\n    ///     Send a plain text message body.\n    /// </summary>\n    TextOnly,\n\n    /// <summary>\n    ///     Send an HTML message body.\n    /// </summary>\n    HtmlOnly,\n\n    /// <summary>\n    ///     Send a multipart / alternative body with both plain text and HTML.\n    /// </summary>\n    TextAndHtml\n}"
  },
  {
    "path": "MsgKit/Enums/MessageIconIndex.cs",
    "content": "﻿//\n// MessageIconIndex.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains a number that indicates which icon to use when you display a group of e-mail objects.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc815472(v=office.15).aspx\n///     This property, if it exists, is a hint to the client. The client may ignore the value of this property.\n/// </remarks>\n[Flags]\npublic enum MessageIconIndex : uint\n{\n    /// <summary>\n    ///     New mail\n    /// </summary>\n    NewMail = 0x00000000,\n\n    /// <summary>\n    ///     Post\n    /// </summary>\n    Post = 0x00000001,\n\n    /// <summary>\n    ///     Other\n    /// </summary>\n    Other = 0x00000003,\n\n    /// <summary>\n    ///     Read mail\n    /// </summary>\n    ReadMail = 0x00000100,\n\n    /// <summary>\n    ///     Unread mail\n    /// </summary>\n    UnreadMail = 0x00000101,\n\n    /// <summary>\n    ///     Submitted mail\n    /// </summary>\n    SubmittedMail = 0x00000102,\n\n    /// <summary>\n    ///     Unsent mail\n    /// </summary>\n    UnsentMail = 0x00000103,\n\n    /// <summary>\n    ///     Receipt mail\n    /// </summary>\n    ReceiptMail = 0x00000104,\n\n    /// <summary>\n    ///     Replied mail\n    /// </summary>\n    RepliedMail = 0x00000105,\n\n    /// <summary>\n    ///     Forwarded mail\n    /// </summary>\n    ForwardedMail = 0x00000106,\n\n    /// <summary>\n    ///     Remote mail\n    /// </summary>\n    RemoteMail = 0x00000107,\n\n    /// <summary>\n    ///     Delivery receipt\n    /// </summary>\n    DeliveryReceipt = 0x00000108,\n\n    /// <summary>\n    ///     Read receipt \n    /// </summary>\n    ReadReceipt = 0x00000109,\n\n    /// <summary>\n    ///     Non delivery report\n    /// </summary>\n    NondeliveryReport = 0x0000010A,\n\n    /// <summary>\n    ///     Non read receipt\n    /// </summary>\n    NonReadReceipt = 0x0000010B,\n\n    /// <summary>\n    ///     Recall S mail\n    /// </summary>\n    RecallSMail = 0x0000010C,\n\n    /// <summary>\n    ///     Recall F mail\n    /// </summary>\n    RecallFMail = 0x0000010D,\n\n    /// <summary>\n    ///     Tracking mail\n    /// </summary>\n    TrackingMail = 0x0000010E,\n\n    /// <summary>\n    ///     Out of office mail\n    /// </summary>\n    OutOfOfficeMail = 0x0000011B,\n\n    /// <summary>\n    ///     Recall mail\n    /// </summary>\n    RecallMail = 0x0000011C,\n\n    /// <summary>\n    ///     Tracked mail\n    /// </summary>\n    TrackedMail = 0x00000130,\n\n    /// <summary>\n    ///     Contact\n    /// </summary>\n    Contact = 0x00000200,\n\n    /// <summary>\n    ///     Distribution list\n    /// </summary>\n    DistributionList = 0x00000202,\n\n    /// <summary>\n    ///     Sticky note blue\n    /// </summary>\n    StickyNoteBlue = 0x00000300,\n\n    /// <summary>\n    ///     Sticky note green\n    /// </summary>\n    StickyNoteGreen = 0x00000301,\n\n    /// <summary>\n    ///     Sticky note pink\n    /// </summary>\n    StickyNotePink = 0x00000302,\n\n    /// <summary>\n    ///     Sticky note yellow\n    /// </summary>\n    StickyNoteYellow = 0x00000303,\n\n    /// <summary>\n    ///     Sticky note white\n    /// </summary>\n    StickyNoteWhite = 0x00000304,\n\n    /// <summary>\n    ///     Single instance appointment\n    /// </summary>\n    SingleInstanceAppointment = 0x00000400,\n\n    /// <summary>\n    ///     Recurring appointment\n    /// </summary>\n    RecurringAppointment = 0x00000401,\n\n    /// <summary>\n    ///     Single instance meeting\n    /// </summary>\n    SingleInstanceMeeting = 0x00000402,\n\n    /// <summary>\n    ///     Recurring meeting\n    /// </summary>\n    RecurringMeeting = 0x00000403,\n\n    /// <summary>\n    ///     Meeting request\n    /// </summary>\n    MeetingRequest = 0x00000404,\n\n    /// <summary>\n    ///     Accept\n    /// </summary>\n    Accept = 0x00000405,\n\n    /// <summary>\n    ///     Decline\n    /// </summary>\n    Decline = 0x00000406,\n\n    /// <summary>\n    ///     Tentativly\n    /// </summary>\n    Tentativly = 0x00000407,\n\n    /// <summary>\n    ///     Cancellation\n    /// </summary>\n    Cancellation = 0x00000408,\n\n    /// <summary>\n    ///     Informational update\n    /// </summary>\n    InformationalUpdate = 0x00000409,\n\n    /// <summary>\n    ///     Task/task\n    /// </summary>\n    TaskTask = 0x00000500,\n\n    /// <summary>\n    ///     Unassigned recurring task\n    /// </summary>\n    UnassignedRecurringTask = 0x00000501,\n\n    /// <summary>\n    ///     Assignee's task\n    /// </summary>\n    AssigneesTask = 0x00000502,\n\n    /// <summary>\n    ///     Assigner's task\n    /// </summary>\n    AssignersTask = 0x00000503,\n\n    /// <summary>\n    ///     Task request\n    /// </summary>\n    TaskRequest = 0x00000504,\n\n    /// <summary>\n    ///     Task acceptance\n    /// </summary>\n    TaskAcceptance = 0x00000505,\n\n    /// <summary>\n    ///     Task rejection\n    /// </summary>\n    TaskRejection = 0x00000506,\n\n    /// <summary>\n    ///     Journal conversation\n    /// </summary>\n    JournalConversation = 0x00000601,\n\n    /// <summary>\n    ///     Journal e-mail message\n    /// </summary>\n    JournalEmailMessage = 0x00000602,\n\n    /// <summary>\n    ///     Journal meeting request\n    /// </summary>\n    JournalMeetingRequest = 0x00000603,\n\n    /// <summary>\n    ///     Journal meeting response\n    /// </summary>\n    JournalMeetingResponse = 0x00000604,\n\n    /// <summary>\n    ///     Journal task request\n    /// </summary>\n    JournalTaskRequest = 0x00000606,\n\n    /// <summary>\n    ///     Journal task response\n    /// </summary>\n    JournalTaskResponse = 0x00000607,\n\n    /// <summary>\n    ///     Journal note\n    /// </summary>\n    JournalNote = 0x00000608,\n\n    /// <summary>\n    ///     Journal fax\n    /// </summary>\n    JournalFax = 0x00000609,\n\n    /// <summary>\n    ///     Journal phone call\n    /// </summary>\n    JournalPhoneCall = 0x0000060A,\n\n    /// <summary>\n    ///     Journal letter\n    /// </summary>\n    JournalLetter = 0x0000060C,\n\n    /// <summary>\n    ///     Journal Microsoft Office Word\n    /// </summary>\n    JournalMicrosoftOfficeWord = 0x0000060D,\n\n    /// <summary>\n    ///     Journal Microsoft Office Excel\n    /// </summary>\n    JournalMicrosoftOfficeExcel = 0x0000060E,\n\n    /// <summary>\n    ///     Journal Microsoft Office PowerPoint\n    /// </summary>\n    JournalMicrosoftOfficePowerPoint = 0x0000060F,\n\n    /// <summary>\n    ///     Journal Microsoft Office Access\n    /// </summary>\n    JournalMicrosoftOfficeAccess = 0x00000610,\n\n    /// <summary>\n    ///     Journal document\n    /// </summary>\n    JournalDocument = 0x00000612,\n\n    /// <summary>\n    ///     Journal meeting\n    /// </summary>\n    JournalMeeting = 0x00000613,\n\n    /// <summary>\n    ///     Journal meeting cancellation\n    /// </summary>\n    JournalMeetingCancellation = 0x00000614,\n\n    /// <summary>\n    ///     Journal remote session\n    /// </summary>\n    JournalRemoteSession = 0x00000615\n}"
  },
  {
    "path": "MsgKit/Enums/MessageImportance.cs",
    "content": "//\n// MessageImportance.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains the relative priority of a message.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc815346(v=office.15).aspx\n/// </remarks>\npublic enum MessageImportance\n{\n    /// <summary>\n    ///     The message has low importance.\n    /// </summary>\n    IMPORTANCE_LOW = 0,\n\n    /// <summary>\n    ///     The message has normal importance.\n    /// </summary>\n    IMPORTANCE_NORMAL = 1,\n\n    /// <summary>\n    ///     The message has high importance.\n    /// </summary>\n    IMPORTANCE_HIGH = 2\n}"
  },
  {
    "path": "MsgKit/Enums/MessagePriority.cs",
    "content": "//\n// MessagePriority.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Contains a value that indicates the message sender's opinion of the importance of a message. \n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc765646(v=office.15).aspx\n/// </remarks>\npublic enum MessagePriority\n{\n    /// <summary>\n    ///     The message is not urgent.\n    /// </summary>\n    PRIO_NONURGENT = 0,\n\n    /// <summary>\n    ///     The message has normal priority.\n    /// </summary>\n    PRIO_NORMAL = 1,\n\n    /// <summary>\n    ///     The message is urgent.\n    /// </summary>\n    PRIO_URGENT = 2\n}"
  },
  {
    "path": "MsgKit/Enums/PostalAddressId.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// PostalAddressId.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Specifies which physical address is the contact's mailing address\n/// </summary>\n/// <remarks>\n///     See https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidpostaladdressid-canonical-property\n/// </remarks>\npublic enum PostalAddressId : uint\n{\n    /// <summary>\n    ///     No address is selected as the mailing address\n    /// </summary>\n    NO_ADDRESS = 0x00000000,\n\n    /// <summary>\n    ///     The Home Address is the mailing address\n    /// </summary>\n    HOME_ADDRESS = 0x00000001,\n\n    /// <summary>\n    ///     The Work Address is the mailing address.\n    /// </summary>\n    WORK_ADDRESS = 0x00000002,\n\n    /// <summary>\n    ///     The Other Address is the mailing address\n    /// </summary>\n    OTHER_ADDRESS = 0x00000003,\n}"
  },
  {
    "path": "MsgKit/Enums/PropertyFlags.cs",
    "content": "//\n// PropertyFlags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Flags used to set on a <see cref=\"Structures.Property\" />\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee158556(v=exchg.80).aspx\n/// </remarks>\n[Flags]\npublic enum PropertyFlags : uint\n{\n    // ReSharper disable InconsistentNaming\n    /// <summary>\n    ///     If this flag is set for a property, that property MUST NOT be deleted from the .msg file\n    ///     (irrespective of which storage it is contained in) and implementations MUST return an error\n    ///     if any attempt is made to do so. This flag is set in circumstances where the implementation\n    ///     depends on that property always being present in the .msg file once it is written there.\n    /// </summary>\n    PROPATTR_MANDATORY = 0x00000001,\n\n    /// <summary>\n    ///     If this flag is not set on a property, that property MUST NOT be read from the .msg file\n    ///     and implementations MUST return an error if any attempt is made to read it. This flag is\n    ///     set on all properties unless there is an implementation-specific reason to prevent a property\n    ///     from being read from the .msg file.\n    /// </summary>\n    PROPATTR_READABLE = 0x00000002,\n\n    /// <summary>\n    ///     If this flag is not set on a property, that property MUST NOT be modified or deleted and\n    ///     implementations MUST return an error if any attempt is made to do so. This flag is set in\n    ///     circumstances where the implementation depends on the properties being writable.\n    /// </summary>\n    PROPATTR_WRITABLE = 0x00000004\n    // ReSharper restore InconsistentNaming\n}"
  },
  {
    "path": "MsgKit/Enums/PropertyKind.cs",
    "content": "//\n// PropertyKind.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Kind (1 byte): The possible values for the Kind field are in the following table.\n/// </summary>\n[Flags]\npublic enum PropertyKind\n{\n    /// <summary>\n    ///     The property is identified by the LID field (numerical named property)\n    /// </summary>\n    Lid = 0x00,\n\n    /// <summary>\n    ///     The property is identified by the Name field (string named property)\n    /// </summary>\n    Name = 0x01,\n\n    /// <summary>\n    ///     The property does not have an associated PropertyName field.\n    /// </summary>\n    NotAssociated = 0xFF\n}"
  },
  {
    "path": "MsgKit/Enums/PropertyType.cs",
    "content": "//\n// PropertyType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The type of a property in the properties stream\n/// </summary>\npublic enum PropertyType : ushort\n{\n    /// <summary>\n    ///     Any: this property type value matches any type; a server MUST return the actual type in its response. Servers\n    ///     MUST NOT return this type in response to a client request other than NspiGetIDsFromNames or the\n    ///     RopGetPropertyIdsFromNamesROP request ([MS-OXCROPS] section 2.2.8.1). (PT_UNSPECIFIED)\n    /// </summary>\n    PT_UNSPECIFIED = 0x0000,\n\n    /// <summary>\n    ///     None: This property is a placeholder. (PT_NULL)\n    /// </summary>\n    PT_NULL = 0x0001,\n\n    /// <summary>\n    ///     2 bytes; a 16-bit integer (PT_I2, i2, ui2)\n    /// </summary>\n    PT_SHORT = 0x0002,\n\n    /// <summary>\n    ///     4 bytes; a 32-bit integer (PT_LONG, PT_I4, int, ui4)\n    /// </summary>\n    PT_LONG = 0x0003,\n\n    /// <summary>\n    ///     4 bytes; a 32-bit floating point number (PT_FLOAT, PT_R4, float, r4)\n    /// </summary>\n    PT_FLOAT = 0x0004,\n\n    /// <summary>\n    ///     8 bytes; a 64-bit floating point number (PT_DOUBLE, PT_R8, r8)\n    /// </summary>\n    PT_DOUBLE = 0x0005,\n\n    /// <summary>\n    ///     8 bytes; a 64-bit floating point number in which the whole number part represents the number of days since\n    ///     December 30, 1899, and the fractional part represents the fraction of a day since midnight (PT_APPTIME)\n    /// </summary>\n    PT_APPTIME = 0x0007,\n\n    /// <summary>\n    ///     4 bytes; a 32-bit integer encoding error information as specified in section 2.4.1. (PT_ERROR)\n    /// </summary>\n    PT_ERROR = 0x000A,\n\n    /// <summary>\n    ///     1 byte; restricted to 1 or 0 (PT_BOOLEAN. bool)\n    /// </summary>\n    PT_BOOLEAN = 0x000B,\n\n    /// <summary>\n    ///     The property value is a Component Object Model (COM) object, as specified in section 2.11.1.5. (PT_OBJECT)\n    /// </summary>\n    PT_OBJECT = 0x000D,\n\n    /// <summary>\n    ///     8 bytes; a 64-bit integer (PT_LONGLONG, PT_I8, i8, ui8)\n    /// </summary>\n    PT_I8 = 0x0014,\n\n    /// <summary>\n    ///     8 bytes; a 64-bit integer (PT_LONGLONG, PT_I8, i8, ui8)\n    /// </summary>\n    PT_LONGLONG = 0x0014,\n\n    /// <summary>\n    ///     Variable size; a string of Unicode characters in UTF-16LE format encoding with terminating null character\n    ///     (0x0000). (PT_UNICODE, string)\n    /// </summary>\n    PT_UNICODE = 0x001F,\n\n    /// <summary>\n    ///     Variable size; a string of multibyte characters in externally specified encoding with terminating null\n    ///     character (single 0 byte). (PT_STRING8) ... ANSI format\n    /// </summary>\n    PT_STRING8 = 0x001E,\n\n    /// <summary>\n    ///     8 bytes; a 64-bit integer representing the number of 100-nanosecond intervals since January 1, 1601\n    ///     (PT_SYSTIME, time, datetime, datetime.tz, datetime.rfc1123, Date, time, time.tz)\n    /// </summary>\n    PT_SYSTIME = 0x0040,\n\n    /// <summary>\n    ///     16 bytes; a GUID with Data1, Data2, and Data3 fields in little-endian format (PT_CLSID, UUID)\n    /// </summary>\n    PT_CLSID = 0x0048,\n\n    /// <summary>\n    ///     Variable size; a 16-bit COUNT field followed by a structure as specified in section 2.11.1.4. (PT_SVREID)\n    /// </summary>\n    PT_SVREID = 0x00FB,\n\n    /// <summary>\n    ///     Variable size; a byte array representing one or more Restriction structures as specified in section 2.12.\n    ///     (PT_SRESTRICT)\n    /// </summary>\n    PT_SRESTRICT = 0x00FD,\n\n    /// <summary>\n    ///     Variable size; a 16-bit COUNT field followed by that many rule (4) action (3) structures, as specified in\n    ///     [MS-OXORULE] section 2.2.5. (PT_ACTIONS)\n    /// </summary>\n    PT_ACTIONS = 0x00FE,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many bytes. (PT_BINARY)\n    /// </summary>\n    PT_BINARY = 0x0102,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_SHORT values. (PT_MV_SHORT, PT_MV_I2, mv.i2)\n    /// </summary>\n    PT_MV_SHORT = 0x1002,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_LONG values. (PT_MV_LONG, PT_MV_I4, mv.i4)\n    /// </summary>\n    PT_MV_LONG = 0x1003,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_FLOAT values. (PT_MV_FLOAT, PT_MV_R4, mv.float)\n    /// </summary>\n    PT_MV_FLOAT = 0x1004,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_DOUBLE values. (PT_MV_DOUBLE, PT_MV_R8)\n    /// </summary>\n    PT_MV_DOUBLE = 0x1005,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_CURRENCY values. (PT_MV_CURRENCY, mv.fixed.14.4)\n    /// </summary>\n    PT_MV_CURRENCY = 0x1006,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_APPTIME values. (PT_MV_APPTIME)\n    /// </summary>\n    PT_MV_APPTIME = 0x1007,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_LONGLONGvalues. (PT_MV_I8, PT_MV_I8)\n    /// </summary>\n    PT_MV_LONGLONG = 0x1014,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_UNICODE values. (PT_MV_UNICODE)\n    /// </summary>\n    PT_MV_TSTRING = 0x101F,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_UNICODE values. (PT_MV_UNICODE)\n    /// </summary>\n    PT_MV_UNICODE = 0x101F,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_STRING8 values. (PT_MV_STRING8, mv.string)\n    /// </summary>\n    PT_MV_STRING8 = 0x101E,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_SYSTIME values. (PT_MV_SYSTIME)\n    /// </summary>\n    PT_MV_SYSTIME = 0x1040,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_CLSID values. (PT_MV_CLSID, mv.uuid)\n    /// </summary>\n    PT_MV_CLSID = 0x1048,\n\n    /// <summary>\n    ///     Variable size; a COUNT field followed by that many PT_MV_BINARY values. (PT_MV_BINARY, mv.bin.hex)\n    /// </summary>\n    PT_MV_BINARY = 0x1102,\n}"
  },
  {
    "path": "MsgKit/Enums/RecipientFlags.cs",
    "content": "//\n// RecipientFlags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Specifies a bit field that describes the recipient status.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc815629.aspx\n/// </remarks>\n[Flags]\npublic enum RecipientFlags : uint\n{\n    /// <summary>\n    ///     The recipient is a Sendable Attendee. This flag is only used in the dispidApptUnsendableRecips\n    ///     (PidLidAppointmentUnsendableRecipients) property.\n    /// </summary>\n    RecipSendable = 0x00000001,\n\n    /// <summary>\n    ///     The RecipientRow on which this flag is set represents the meeting Organizer.\n    /// </summary>\n    RecipOrganizer = 0x0000002,\n\n    /// <summary>\n    ///     Indicates that the attendee gave a response for the exception on which this RecipientRow resides. This flag is only\n    ///     used in a RecipientRow of an exception embedded message object of the organizers meeting object.\n    /// </summary>\n    RecipExceptionalResponse = 0x00000010,\n\n    /// <summary>\n    ///     Indicates that although the RecipientRow exists, it should be treated as if the corresponding recipient does not.\n    ///     This flag is only used in a RecipientRow of an exception embedded message object of the organizers meeting object.\n    /// </summary>\n    RecipExceptionalDeleted = 0x00000020,\n\n    /// <summary>\n    ///     Indicates the recipient is an original attendee. This flag is only used in the dispidApptUnsendableRecips property.\n    /// </summary>\n    RecipOriginal = 0x00000100\n}"
  },
  {
    "path": "MsgKit/Enums/RecipientRowAddressType.cs",
    "content": "﻿//\n// RecipientRowAddressType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Structures;\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The <see cref=\"RecipientRow.RecipientRowDisplayType\" />\n/// </summary>\npublic enum RecipientRowAddressType\n{\n    /// <summary>\n    ///     No type is set\n    /// </summary>\n    NoType = 0x0,\n\n    /// <summary>\n    ///     X500DN\n    /// </summary>\n    X500Dn = 0x1,\n\n    /// <summary>\n    ///     Ms mail\n    /// </summary>\n    MsMail = 0x2,\n\n    /// <summary>\n    ///     SMTP\n    /// </summary>\n    Smtp = 0x3,\n\n    /// <summary>\n    ///     Fax\n    /// </summary>\n    Fax = 0x4,\n\n    /// <summary>\n    ///     Professional office system\n    /// </summary>\n    ProfessionalOfficeSystem = 0x5,\n\n    /// <summary>\n    ///     Personal distribution list 1\n    /// </summary>\n    PersonalDistributionList1 = 0x6,\n\n    /// <summary>\n    ///     Personal distribution list 2\n    /// </summary>\n    PersonalDistributionList2 = 0x7\n}"
  },
  {
    "path": "MsgKit/Enums/RecipientRowDisplayType.cs",
    "content": "﻿//\n// RecipientRowAddressType.cs\n//\n// Author: RecipientRowDisplayType and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     An enumeration. This field MUST be present when the Type field\n///     of the RecipientFlags field is set to X500DN(0x1) and MUST NOT be present otherwise.This\n///     value specifies the display type of this address.Valid values for this field are specified in the\n///     following table.\n/// </summary>\npublic enum RecipientRowDisplayType\n{\n    /// <summary>\n    ///     A messaging user\n    /// </summary>\n    MessagingUser = 0x00,\n\n    /// <summary>\n    ///     A distribution list\n    /// </summary>\n    DistributionList = 0x01,\n\n    /// <summary>\n    ///     A forum, such as a bulletin board service or a public or shared folder\n    /// </summary>\n    Forum = 0x02,\n\n    /// <summary>\n    ///     An automated agent\n    /// </summary>\n    AutomatedAgent = 0x03,\n\n    /// <summary>\n    ///     An Address Book object defined for a large group, such as helpdesk, accounting, coordinator, or\n    ///     department\n    /// </summary>\n    AddressBook = 0x04,\n\n    /// <summary>\n    ///     A private, personally administered distribution list\n    /// </summary>\n    PrivateDistributionList = 0x05,\n\n    /// <summary>\n    ///     An Address Book object known to be from a foreign or remote messaging system\n    /// </summary>\n    RemoteAddressBook = 0x06\n}"
  },
  {
    "path": "MsgKit/Enums/RecipientType.cs",
    "content": "//\n// RecipientType.cs\n//\n// Author: RecipientRowDisplayType and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The recipient type\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc839620(v=office.15).aspx\n/// </remarks>\npublic enum RecipientType : uint\n{\n    /// <summary>\n    ///     The recipient is the message originator\n    /// </summary>\n    Originator = 0x0000,\n\n    /// <summary>\n    ///     The recipient is a primary (To) recipient. Clients are required to handle primary recipients. All other types are optional.\n    /// </summary>\n    To = 0x0001,\n\n    /// <summary>\n    ///     The recipient is a carbon copy (CC) recipient, a recipient that receives a message in addition to the primary recipients.\n    /// </summary>\n    Cc = 0x0002,\n\n    /// <summary>\n    ///     The recipient is a blind carbon copy (BCC) recipient. Primary and carbon copy recipients are unaware of the existence of BCC recipients. \n    /// </summary>\n    Bcc = 0x0003,\n\n    /// <summary>\n    ///     The recipient is a resource (e.g. a room)\n    /// </summary>\n    Resource = 0x0004,\n\n    /// <summary>\n    ///     The recipient is a room (uses PR_RECIPIENT_TYPE_EXE) needs Exchange 2007 or higher\n    /// </summary>\n    Room = 0x0007\n}"
  },
  {
    "path": "MsgKit/Enums/RecurrencePatternCalendarType.cs",
    "content": "﻿//\n// RecurrencePatternCalendarType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     An integer that specifies the type of calendar that is used. The acceptable values for the calendar type are listed\n///     in the following table.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic enum RecurrencePatternCalendarType\n{\n    /// <summary>\n    ///     The default value for the calendar type is Gregorian.\n    ///     If the value of the PatternType field is HjMonth, HjMonthNth, or HjMonthEnd and the value of the CalendarType field\n    ///     is Default, this recurrence uses the Hijri calendar.\n    /// </summary>\n    Default = 0x0000,\n\n    /// <summary>\n    ///     Gregorian (localized) calendar\n    /// </summary>\n    CAL_GREGORIAN = 0x0001,\n\n    /// <summary>\n    ///     Gregorian (U.S.) calendar\n    /// </summary>\n    CAL_GREGORIAN_US = 0x0002,\n\n    /// <summary>\n    ///     Japanese Emperor era calendar\n    /// </summary>\n    CAL_JAPAN = 0x0003,\n\n    /// <summary>\n    ///     Taiwan calendar\n    /// </summary>\n    CAL_TAIWAN = 0x0004,\n\n    /// <summary>\n    ///     Korean Tangun era calendar\n    /// </summary>\n    CAL_KOREA = 0x0005,\n\n    /// <summary>\n    ///     Hijri (Arabic Lunar) calendar\n    /// </summary>\n    CAL_HIJRI = 0x0006,\n\n    /// <summary>\n    ///     Thai calendar\n    /// </summary>\n    CAL_THAI = 0x0007,\n\n    /// <summary>\n    ///     Hebrew lunar calendar\n    /// </summary>\n    CAL_HEBREW = 0x0008,\n\n    /// <summary>\n    ///     Gregorian Middle East French calendar\n    /// </summary>\n    CAL_GREGORIAN_ME_FRENCH = 0x0009,\n\n    /// <summary>\n    ///     Gregorian Arabic calendar\n    /// </summary>\n    CAL_GREGORIAN_ARABIC = 0x000A,\n\n    /// <summary>\n    ///     Gregorian transliterated English calendar\n    /// </summary>\n    CAL_GREGORIAN_XLIT_ENGLISH = 0x000B,\n\n    /// <summary>\n    ///     Gregorian transliterated French calendar\n    /// </summary>\n    CAL_GREGORIAN_XLIT_FRENCH = 0x000C,\n\n    /// <summary>\n    ///     Japanese lunar calendar\n    /// </summary>\n    CAL_LUNAR_JAPANESE = 0x000E,\n\n    /// <summary>\n    ///     Chinese lunar calendar\n    /// </summary>\n    CAL_CHINESE_LUNAR = 0x000F,\n\n    /// <summary>\n    ///     Saka era calendar\n    /// </summary>\n    CAL_SAKA = 0x0010,\n\n    /// <summary>\n    ///     Lunar ETO Chinese calendar\n    /// </summary>\n    CAL_LUNAR_ETO_CHN = 0x0011,\n\n    /// <summary>\n    ///     Lunar ETO Korean calendar\n    /// </summary>\n    CAL_LUNAR_ETO_KOR = 0x0012,\n\n    /// <summary>\n    ///     Lunar Rokuyou calendar\n    /// </summary>\n    CAL_LUNAR_ROKUYOU = 0x0013,\n\n    /// <summary>\n    ///     Korean lunar calendar\n    /// </summary>\n    CAL_LUNAR_KOREAN = 0x0014,\n\n    /// <summary>\n    ///     Um Al Qura calendar\n    /// </summary>\n    CAL_UMALQURA = 0x0017\n}"
  },
  {
    "path": "MsgKit/Enums/RecurrencePatternFirstDOWDay.cs",
    "content": "﻿//\n// RecurrencePatternFirstDOWDay.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n/// An integer that specifies the day on which the calendar week begins. The default value is Sunday (0x00000000). \n/// This field MUST be set to one of the values listed in the following table.\n/// </summary>\n/// <remarks>\n/// See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic enum RecurrencePatternFirstDOWDay\n{\n    /// <summary>\n    /// Sunday\n    /// </summary>\n    Sunday = 0x00000000,\n\n    /// <summary>\n    /// Monday\n    /// </summary>\n    Monday = 0x00000001,\n\n    /// <summary>\n    /// Tuesday\n    /// </summary>\n    Tuesday = 0x00000002,\n\n    /// <summary>\n    /// Wednesday\n    /// </summary>\n    Wednesday = 0x00000003,\n\n    /// <summary>\n    /// Thursday\n    /// </summary>\n    Thursday = 0x00000004,\n\n    /// <summary>\n    /// Friday\n    /// </summary>\n    Friday = 0x00000005,\n\n    /// <summary>\n    /// Saterday\n    /// </summary>\n    Saturday = 0x00000006\n}"
  },
  {
    "path": "MsgKit/Enums/RecurrencePatternFrequency.cs",
    "content": "﻿//\n// RecurrencePatternFirstDateTimeFrequency.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     The value and meaning of the FirstDateTime field for each type of recurrence frequency are specified in the\n///     following table. For details about how the value is calculated, see section 2.2.1.44.1.1.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic enum RecurrencePatternFrequency\n{\n    /// <summary>\n    ///     Daily\n    /// </summary>\n    Daily,\n\n    /// <summary>\n    ///     Weelky\n    /// </summary>\n    Weekly,\n\n    /// <summary>\n    ///     Monthly\n    /// </summary>\n    Monthly\n}"
  },
  {
    "path": "MsgKit/Enums/RecurrencePatternPatternType.cs",
    "content": "﻿//\n// RecurrencePatternPatternType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     PatternType (2 bytes): An integer that specifies the type of recurrence pattern. The valid recurrence pattern types\n///     are listed in the following table.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic enum RecurrencePatternPatternType\n{\n    /// <summary>\n    ///     The event has a daily recurrence.\n    /// </summary>\n    Day = 0x0000,\n\n    /// <summary>\n    ///     The event has a weekly recurrence.\n    /// </summary>\n    Week = 0x0001,\n\n    /// <summary>\n    ///     The event has a monthly recurrence.\n    /// </summary>\n    Month = 0x0002,\n\n    /// <summary>\n    ///     The event has a month-end recurrence.\n    /// </summary>\n    MonthEnd = 0x0004,\n\n    /// <summary>\n    ///     The event has an every nth month pattern.\n    /// </summary>\n    MonthNth = 0x0003,\n\n    /// <summary>\n    ///     The event has a monthly recurrence in the Hijri calendar. For this value in the PatternType field, the value of the\n    ///     CalendarType field MUST be set to 0x0000.\n    /// </summary>\n    HjMonth = 0x0000A,\n\n    /// <summary>\n    ///     The event has an every nth month pattern in the Hijri calendar. For this value in the PatternType field, the value\n    ///     of the CalendarType field MUST be set to 0x0000.\n    /// </summary>\n    HjMonthNth = 0x000B,\n\n    /// <summary>\n    ///     The event has a month end recurrence in the Hijri calendar. For this value in the PatternType field, the value of\n    ///     the CalendarType field MUST be set to 0x0000.\n    /// </summary>\n    HjMonthEnd = 0x000C\n}"
  },
  {
    "path": "MsgKit/Enums/RecurrencePatternRecurrenceRangeType.cs",
    "content": "﻿//\n// RecurrencePatternRecurrenceRangeType.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     EndType (4 bytes):  An integer that specifies the ending type for the recurrence. This field MUST be set to one of\n///     the values listed in the following table.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic enum RecurrencePatternRecurrenceRangeType\n{\n    /// <summary>\n    ///     End after date\n    /// </summary>\n    EndAfterDate = 0x00002021,\n\n    /// <summary>\n    ///     End after N occurrences\n    /// </summary>\n    EndAfterNoccurences = 0x00002022,\n\n    /// <summary>\n    ///     Never end\n    /// </summary>\n    NeverEnd = 0x00002023\n}"
  },
  {
    "path": "MsgKit/Enums/StoreSupportMask.cs",
    "content": "//\n// RecipientType.cs\n//\n// Author: RecipientRowDisplayType and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit.Enums;\n\ninternal class StoreSupportMaskConst\n{\n    public const StoreSupportMask StoreSupportMask = Enums.StoreSupportMask.STORE_ATTACH_OK |\n                                                     //StoreSupportMask.STORE_CATEGORIZE_OK |\n                                                     Enums.StoreSupportMask.STORE_CREATE_OK |\n                                                     //StoreSupportMask.STORE_ENTRYID_UNIQUE |\n                                                     Enums.StoreSupportMask.STORE_MODIFY_OK |\n                                                     //StoreSupportMask.STORE_MV_PROPS_OK |\n                                                     //StoreSupportMask.STORE_OLE_OK |\n                                                     //StoreSupportMask.STORE_RTF_OK |\n                                                     Enums.StoreSupportMask.STORE_HTML_OK |\n                                                     Enums.StoreSupportMask.STORE_UNICODE_OK;\n}\n\n/// <summary>\n///     This property discloses the capabilities of a message store to client applications planning to send it a message.\n///     The flags can facilitate decisions by a client or another store, such as whether to send PR_BODY (PidTagBody) or\n///     only <see cref=\"PropertyTags.PR_RTF_COMPRESSED\" /> (PidTagRtfCompressed). A client should never set \n///     <see cref=\"PropertyTags.PR_STORE_SUPPORT_MASK\" /> an attempt returns MAPI_E_COMPUTED.\n/// </summary>\n[Flags]\ninternal enum StoreSupportMask : uint\n{\n    /// <summary>\n    ///     The message store supports properties containing ANSI (8-bit) characters.\n    /// </summary>\n    STORE_ANSI_OK = 0x00020000,\n\n    /// <summary>\n    ///     The message store supports attachments (OLE or non-OLE) to messages.\n    /// </summary>\n    STORE_ATTACH_OK = 0x00000020,\n\n    /// <summary>\n    ///     The message store supports categorized views of tables.\n    /// </summary>\n    STORE_CATEGORIZE_OK = 0x00000400,\n\n    /// <summary>\n    ///     The message store supports creation of new messages.\n    /// </summary>\n    STORE_CREATE_OK = 0x00000010,\n\n    /// <summary>\n    ///     Entry identifiers for the objects in the message store are unique, that is, never reused during the life of the\n    ///     store.\n    /// </summary>\n    STORE_ENTRYID_UNIQUE = 0x00000001,\n\n    /// <summary>\n    ///     The message store supports HTML messages, stored in the <see cref=\"PropertyTags.PR_HTML\" /> (PidTagBodyHtml) \n    ///     property. Note that STORE_HTML_OK is not defined in versions of MAPIDEFS.H that are included with Microsoft Exchange \n    ///     2000 Server and earlier. If your development environment uses a MAPIDEFS.H file that does not include STORE_HTML_OK, \n    ///     use the value 0x00010000 instead.\n    /// </summary>\n    STORE_HTML_OK = 0x00010000,\n\n    /// <summary>\n    ///     In a wrapped PST store, indicates that when a new message arrives at the store, the store does rules and spam\n    ///     filter processing on the message separately. The store calls IMAPISupport::Notify, setting fnevNewMail in the\n    ///     NOTIFICATION structure that is passed as a parameter, and then passes the details of the new message to the\n    ///     listening client. Subsequently, when the listening client receives the notification, it does not process rules on\n    ///     the message.\n    /// </summary>\n    STORE_ITEMPROC = 0x00200000,\n\n    /// <summary>\n    ///     This flag is reserved and should not be used.\n    /// </summary>\n    STORE_LOCALSTORE = 0x00080000,\n\n    /// <summary>\n    ///     The message store supports modification of its existing messages.\n    /// </summary>\n    STORE_MODIFY_OK = 0x00000008,\n\n    /// <summary>\n    ///     The message store supports multivalued properties, guarantees the stability of value order in a multivalued\n    ///     property throughout a save operation, and supports instantiation of multivalued properties in tables.\n    /// </summary>\n    STORE_MV_PROPS_OK = 0x00000200,\n\n    /// <summary>\n    ///     The message store supports notifications.\n    /// </summary>\n    STORE_NOTIFY_OK = 0x00000100,\n\n    /// <summary>\n    ///     The message store supports OLE attachments. The OLE data is accessible through an IStorage interface, such as that\n    ///     available through the PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) property\n    /// </summary>\n    STORE_OLE_OK = 0x00000040,\n\n    /// <summary>\n    ///     The folders in this store are public (multi-user), not private (possibly multi-instance but not multi-user).\n    /// </summary>\n    STORE_PUBLIC_FOLDERS = 0x00004000,\n\n    /// <summary>\n    ///     The MAPI Protocol Handler will not crawl the store, and the store is responsible to push any changes through\n    ///     notifications to the indexer to have messages indexed.\n    /// </summary>\n    STORE_PUSHER_OK = 0x00800000,\n\n    /// <summary>\n    ///     All interfaces for the message store have a read-only access level.\n    /// </summary>\n    STORE_READONLY = 0x00000002,\n\n    /// <summary>\n    ///     The message store supports restrictions.\n    /// </summary>\n    STORE_RESTRICTION_OK = 0x00001000,\n\n    /// <summary>\n    ///     The message store supports Rich Text Format (RTF) messages, usually compressed, and the store itself keeps \n    ///     <see cref=\"PropertyTags.PR_BODY_W\" /> and <see cref=\"PropertyTags.PR_RTF_COMPRESSED\" /> synchronized.\n    /// </summary>\n    STORE_RTF_OK = 0x00000800,\n\n    /// <summary>\n    ///     The message store supports search-results folders.\n    /// </summary>\n    STORE_SEARCH_OK = 0x00000004,\n\n    /// <summary>\n    ///     The message store supports sorting views of tables.\n    /// </summary>\n    STORE_SORT_OK = 0x00002000,\n\n    /// <summary>\n    ///     The message store supports marking a message for submission.\n    /// </summary>\n    STORE_SUBMIT_OK = 0x00000080,\n\n    /// <summary>\n    ///     The message store supports storage of RTF messages in uncompressed form. An uncompressed RTF stream is identified\n    ///     by the value dwMagicUncompressedRTF in the stream header. The dwMagicUncompressedRTF value is defined in the\n    ///     RTFLIB.H file\n    /// </summary>\n    STORE_UNCOMPRESSED_RTF = 0x00008000,\n\n    /// <summary>\n    ///     The message store supports properties containing Unicode characters.\n    /// </summary>\n    STORE_UNICODE_OK = 0x00040000\n}"
  },
  {
    "path": "MsgKit/Enums/TaskAcceptanceState.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidAcceptanceState\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc839689.aspx\n/// </remarks>\npublic enum TaskAcceptanceState : uint\n{\n    /// <summary>\n    ///     The task is not assigned.\n    /// </summary>\n    NotAssigned = 0x00000000,\n\n    /// <summary>\n    ///     The task’s acceptance status is unknown.\n    /// </summary>\n    Unknow = 0x00000001,\n\n    /// <summary>\n    ///     The task assignee accepted the task. This value is set when the client processes a task acceptance.\n    /// </summary>\n    Accepted = 0x00000002,\n\n    /// <summary>\n    ///     The task assignee rejected the task. This value is set when the client processes a task rejection.\n    /// </summary>\n    Refused = 0x00000003\n}"
  },
  {
    "path": "MsgKit/Enums/TaskHistory.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskHistory\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee160354(v=EXCHG.80).aspx\n/// </remarks>\npublic enum TaskHistory : uint\n{\n    /// <summary>\n    ///     No changes were made.\n    /// </summary>\n    NoChange = 0x00000000,\n\n    /// <summary>\n    ///     The task assignee accepted this Task object.\n    /// </summary>\n    Accepted = 0x00000001,\n\n    /// <summary>\n    ///     The task assignee rejected this Task object.\n    /// </summary>\n    Rejected = 0x00000002,\n\n    /// <summary>\n    ///     Another property was changed.\n    /// </summary>\n    Modified = 0x00000003,\n\n    /// <summary>\n    ///     The PidLidTaskDueDate property(section 2.2.2.2.5) changed.\n    /// </summary>\n    DueDateModified = 0x00000004,\n\n    /// <summary>\n    ///     The Task object has been assigned to a task assignee.\n    /// </summary>\n    Assigned = 0x00000005\n}"
  },
  {
    "path": "MsgKit/Enums/TaskMode.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskMode\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee178286(v=exchg.80).aspx\n/// </remarks>\npublic enum TaskMode : uint\n{\n    /// <summary>\n    ///     The Task object is not assigned.\n    /// </summary>\n    NotAssigned = 0,\n\n    /// <summary>\n    ///     The Task object is embedded in a task request.\n    /// </summary>\n    Requests = 1,\n\n    /// <summary>\n    ///     The Task object has been accepted by the task assignee.\n    /// </summary>\n    Accepted = 2,\n\n    /// <summary>\n    ///     The Task object was rejected by the task assignee.\n    /// </summary>\n    Rejected = 3,\n\n    /// <summary>\n    ///     The Task object is embedded in a task update.\n    /// </summary>\n    Update = 4,\n\n    /// <summary>\n    ///     The Task object was assigned to the task assigner (self-delegation).\n    /// </summary>\n    SelfDelegation = 5\n}"
  },
  {
    "path": "MsgKit/Enums/TaskMultipleRecipients .cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskMultipleRecipients\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee218493(v=exchg.80).aspx\n/// </remarks>\npublic enum TaskMultipleRecipients : uint\n{\n    /// <summary>\n    ///     The Task object has multiple primary recipients.\n    /// </summary>\n    Sent = 0x00000000,\n\n    /// <summary>\n    ///     Although the \"Sent\" flag was not set, the client detected that the Task object has multiple primary recipients.\n    /// </summary>\n    Received = 0x00000001\n}"
  },
  {
    "path": "MsgKit/Enums/TaskOwnership.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskOwnership\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee204243(v=EXCHG.80).aspx\n/// </remarks>\npublic enum TaskOwnership : uint\n{\n    /// <summary>\n    ///     The Task object is not assigned.\n    /// </summary>\n    NotAssigned = 0x00000000,\n\n    /// <summary>\n    ///     The Task object is the task assigner's copy of the Task object.\n    /// </summary>\n    Assigner = 0x00000001,\n\n    /// <summary>\n    ///     The Task object is the task assignee's copy of the Task object.\n    /// </summary>\n    Assignee = 0x00000002\n}"
  },
  {
    "path": "MsgKit/Enums/TaskState.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskState\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/cc765590(v=office.12).aspx\n/// </remarks>\npublic enum TaskState : uint\n{\n    /// <summary>\n    ///     This task was created to correspond to a task that was embedded in a task rejection but could not be found locally.\n    /// </summary>\n    NotFound = 0x00000000,\n\n    /// <summary>\n    ///     The task is not assigned.\n    /// </summary>\n    NotAssigned = 0x00000001,\n\n    /// <summary>\n    ///     The task is the task assignee’s copy of an assigned task.\n    /// </summary>\n    AssigneeCopy = 0x00000002,\n\n    /// <summary>\n    ///     The task is the task assigner’s copy of an assigned task.\n    /// </summary>\n    AssignerCopy = 0x00000003,\n\n    /// <summary>\n    ///     The task is the task assigner’s copy of a rejected task.\n    /// </summary>\n    AssignerCopyRejected = 0x00000004\n}"
  },
  {
    "path": "MsgKit/Enums/TaskStatus.cs",
    "content": "﻿// ReSharper disable InconsistentNaming\n\n//\n// TaskAcceptanceState.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Nicolas Fournier <nic_rf@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit.Enums;\n\n/// <summary>\n///     Valid values for the <see cref=\"NamedPropertyTags.PidLidTaskStatus\" /> property\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee159828(v=exchg.80).aspx\n/// </remarks>\npublic enum TaskStatus : uint\n{\n    /// <summary>\n    ///     The user has not started work on the Task object. If the property is set to this value, the value of the\n    ///     PidLidPercentComplete property (section 2.2.2.2.3) MUST be 0.0.\n    /// </summary>\n    NotStarted = 0x00000000,\n\n    /// <summary>\n    ///     The user's work on this Task object is in progress. If the property is set to this value, the value of the\n    ///     PidLidPercentComplete property MUST be greater than 0.0 and less than 1.0.\n    /// </summary>\n    InProgress = 0x00000001,\n\n    /// <summary>\n    ///     The user's work on this Task object is complete. If the property is set to this value, the value of the\n    ///     PidLidPercentComplete property MUST be 1.0, the value of the PidLidTaskDateCompleted property (section 2.2.2.2.9)\n    ///     MUST be the current date, and the value of the PidLidTaskComplete property (section 2.2.2.2.20) MUST be 0x01.\n    /// </summary>\n    Completed = 0x00000002,\n\n    /// <summary>\n    ///     The user is waiting on somebody else.\n    /// </summary>\n    Waiting = 0x00000003,\n\n    /// <summary>\n    ///     The user has deferred work on the Task object.\n    /// </summary>\n    Deferred = 0x00000004\n}"
  },
  {
    "path": "MsgKit/Exceptions/MKAttachment.cs",
    "content": "﻿//\n// MWAttachment.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Exceptions;\n\n/// <summary>\n/// Raised when an attachment exception occurs\n/// </summary>\npublic class MKAttachment : Exception\n{\n    internal MKAttachment()\n    {\n    }\n\n    internal MKAttachment(string message) : base(message)\n    {\n    }\n\n    internal MKAttachment(string message, Exception inner) : base(message, inner)\n    {\n    }\n}"
  },
  {
    "path": "MsgKit/Exceptions/MKAttachmentExists.cs",
    "content": "﻿//\n// MWAttachmentExists.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Exceptions;\n\n/// <summary>\n/// Raised when an attachment with the same name already exists\n/// </summary>\npublic class MKAttachmentExists : Exception\n{\n    internal MKAttachmentExists()\n    {\n    }\n\n    internal MKAttachmentExists(string message) : base(message)\n    {\n    }\n\n    internal MKAttachmentExists(string message, Exception inner) : base(message, inner)\n    {\n    }\n}"
  },
  {
    "path": "MsgKit/Exceptions/MKInvalidProperty.cs",
    "content": "﻿//\n// MWInvalidProperty.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Exceptions;\n\n/// <summary>\n///     Raised when a property is invalid\n/// </summary>\npublic class MKInvalidProperty : Exception\n{\n    internal MKInvalidProperty()\n    {\n    }\n\n    internal MKInvalidProperty(string message) : base(message)\n    {\n    }\n\n    internal MKInvalidProperty(string message, Exception inner) : base(message, inner)\n    {\n    }\n}"
  },
  {
    "path": "MsgKit/Exceptions/MKMessageSaved.cs",
    "content": "﻿//\n// MKMessageSaved.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Exceptions;\n\n/// <summary>\n/// Raised when somebody tries to modify a mesage when it already has been saved\n/// </summary>\npublic class MKMessageSaved : Exception\n{\n    internal MKMessageSaved()\n    {\n    }\n\n    internal MKMessageSaved(string message) : base(message)\n    {\n    }\n\n    internal MKMessageSaved(string message, Exception inner) : base(message, inner)\n    {\n    }\n}"
  },
  {
    "path": "MsgKit/Exceptions/MKPropertyNotFound.cs",
    "content": "﻿//\n// MWPropertyNotFound.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Exceptions;\n\n/// <summary>\n///     Raised when a property is not found\n/// </summary>\npublic class MKPropertyNotFound : Exception\n{\n    internal MKPropertyNotFound()\n    {\n    }\n\n    internal MKPropertyNotFound(string message) : base(message)\n    {\n    }\n\n    internal MKPropertyNotFound(string message, Exception inner) : base(message, inner)\n    {\n    }\n}"
  },
  {
    "path": "MsgKit/Helpers/Conversion.cs",
    "content": "﻿//\n// Conversion.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing System.Runtime.Serialization.Formatters.Binary;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains conversion related helper methods\n/// </summary>\ninternal static class Conversion\n{\n    #region ObjectToByteArray\n    /// <summary>\n    ///     Converts an object to an byte array\n    /// </summary>\n    /// <param name=\"obj\">The object to convert</param>\n    /// <returns></returns>\n    public static byte[] ObjectToByteArray(Object obj)\n    {\n        if (obj == null)\n            return null;\n\n        var binaryFormatter = new BinaryFormatter();\n        using (var memoryStream = new MemoryStream())\n        {\n            binaryFormatter.Serialize(memoryStream, obj);\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n\n    #region ByteArrayToObject\n    /// <summary>\n    ///     Converts a byte array to an Object\n    /// </summary>\n    /// <param name=\"array\">The byte array</param>\n    /// <returns></returns>\n    public static Object ByteArrayToObject(byte[] array)\n    {\n        using (var memmoryStream = new MemoryStream())\n        {\n            var binaryFormatter = new BinaryFormatter();\n            memmoryStream.Write(array, 0, array.Length);\n            memmoryStream.Seek(0, SeekOrigin.Begin);\n            return binaryFormatter.Deserialize(memmoryStream);\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/Crc32Calculator.cs",
    "content": "﻿//\n// Crc32Calculator.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n/// This class is used to calculate CRC32. Of a byte buffer. \n/// </summary>\ninternal class Crc32Calculator\n{\n    #region Crc32Table\n    private static readonly uint[] Crc32Table =\n    {\n        0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419,\n        0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4,\n        0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,\n        0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n        0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856,\n        0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,\n        0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,\n        0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n        0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3,\n        0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A,\n        0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,\n        0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n        0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190,\n        0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,\n        0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,\n        0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n        0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED,\n        0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,\n        0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,\n        0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n        0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A,\n        0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,\n        0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,\n        0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n        0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17,\n        0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6,\n        0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,\n        0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n        0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344,\n        0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,\n        0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,\n        0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n        0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1,\n        0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C,\n        0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,\n        0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n        0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE,\n        0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,\n        0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,\n        0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n        0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B,\n        0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,\n        0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,\n        0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n        0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278,\n        0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,\n        0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,\n        0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n        0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,\n        0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8,\n        0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,\n        0x2D02EF8D\n    };\n    #endregion\n\n    #region CalculateCrc32\n    public static uint CalculateCrc32(byte[] buffer)\n    {\n        uint result = 0;\n        foreach (var b in buffer)\n            result = Crc32Table[(result ^ b) & 0xFF] ^ (result >> 8);\n        return result;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/EmailAddress.cs",
    "content": "﻿//\n// EmailAddress.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.Text.RegularExpressions;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains E-mail related helper methods\n/// </summary>\ninternal static class EmailAddress\n{\n    #region IsEmailAddressValid\n    /// <summary>\n    /// Return true when the E-mail address is valid\n    /// </summary>\n    /// <param name=\"emailAddress\"></param>\n    /// <returns></returns>\n    public static bool IsEmailAddressValid(string emailAddress)\n    {\n        if (string.IsNullOrEmpty(emailAddress))\n            return false;\n\n        var regex = new Regex(@\"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*\", RegexOptions.IgnoreCase);\n        var matches = regex.Matches(emailAddress);\n\n        return matches.Count == 1;\n    }\n    #endregion\n\n    #region RemoveSingleQuotes\n    /// <summary>\n    /// Removes trailing en ending single quotes from an E-mail address when they exist\n    /// </summary>\n    /// <param name=\"email\"></param>\n    /// <returns></returns>\n    public static string RemoveSingleQuotes(string email)\n    {\n        if (string.IsNullOrEmpty(email))\n            return string.Empty;\n\n        if (email.StartsWith(\"'\"))\n            email = email.Substring(1, email.Length - 1);\n\n        if (email.EndsWith(\"'\"))\n            email = email.Substring(0, email.Length - 1);\n\n        return email;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/Exception.cs",
    "content": "﻿//\n// Exception.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains exception related helper methods\n/// </summary>\ninternal static class Exception\n{\n    #region GetInnerException\n    /// <summary>\n    /// Get the complete inner exception tree\n    /// </summary>\n    /// <param name=\"e\">The exception object</param>\n    /// <returns></returns>\n    public static string GetInnerException(System.Exception e)\n    {\n        var exception = e.Message + Environment.NewLine;\n        if (e.InnerException != null)\n            exception += GetInnerException(e.InnerException);\n        return exception;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/ExtensionMethods.cs",
    "content": "﻿using OpenMcdf;\n\nnamespace MsgKit.Helpers;\n\ninternal static class ExtensionMethods\n{\n    /// <summary>\n    ///     Gets the storage or creates it when it not exist\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"name\">The name of the storage</param>\n    /// <returns></returns>\n    internal static Storage GetStorage(this Storage storage, string name) \n    {\n        return storage.TryOpenStorage(name, out var st) ? st : storage.CreateStorage(name);\n    }\n\n    /// <summary>\n    ///     Gets the stream or creates it when it not exist\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <param name=\"name\">The name of the storage</param>\n    /// <returns></returns>\n    internal static CfbStream GetStream(this Storage storage, string name) \n    {\n        return storage.TryOpenStream(name, out var st) ? st : storage.CreateStream(name);\n    }\n}"
  },
  {
    "path": "MsgKit/Helpers/FileManager.cs",
    "content": "﻿//\n// FileManager.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n/// This class contains file management functions that are not available in the .NET framework\n/// </summary>\ninternal static class FileManager\n{\n    #region Consts\n    /// <summary>\n    /// De maximale pad lengte in Windows\n    /// </summary>\n    private const int MaxPath = 248;\n\n    /// <summary>\n    /// De maximale lengte voor een bestandsnaam\n    /// </summary>\n    private const int MaxFileNameLength = 255;\n    #endregion\n\n    #region CheckForDirectorySeparator\n    /// <summary>\n    /// Check if there is a directory separator char at the end of the string and if not add it\n    /// </summary>\n    /// <param name=\"line\"></param>\n    /// <returns></returns>\n    public static string CheckForDirectorySeparator(string line)\n    {\n        var separator = Path.DirectorySeparatorChar.ToString();\n\n        if (line.EndsWith(separator))\n            return line;\n\n        return line + separator;\n    }\n    #endregion\n\n    #region FileExistsMakeNew\n    /// <summary>\n    /// Checks if a file already exists and if so adds a number until the file is unique\n    /// </summary>\n    /// <param name=\"fileName\">The file to check</param>\n    /// <param name=\"validateLongFileName\">When true validation will be performed on the max path lengt</param>\n    /// <param name=\"extraTruncateSize\"></param>\n    /// <returns></returns>\n    /// <exception cref=\"ArgumentException\">Raised when no path or file name is given in the <paramref name=\"fileName\"/></exception>\n    /// <exception cref=\"PathTooLongException\">Raised when it is not possible to truncate the <paramref name=\"fileName\"/></exception>\n    public static string FileExistsMakeNew(string fileName, bool validateLongFileName = true,\n        int extraTruncateSize = -1)\n    {\n        var tempFileName = fileName;\n        var fileNameWithoutExtension = GetFileNameWithoutExtension(fileName);\n        var extension = GetExtension(fileName);\n        var path = CheckForDirectorySeparator(GetDirectoryName(fileName));\n\n        if (fileNameWithoutExtension.Length + extension.Length > MaxFileNameLength)\n        {\n            fileNameWithoutExtension = fileNameWithoutExtension.Substring(0, MaxFileNameLength - extension.Length);\n            tempFileName = path + fileName;\n        }\n\n        tempFileName = validateLongFileName ? ValidateLongFileName(tempFileName, extraTruncateSize) : tempFileName;\n\n        var i = 2;\n        while (File.Exists(tempFileName))\n        {\n            tempFileName = path + fileNameWithoutExtension + \"_\" + i + extension;\n            tempFileName = validateLongFileName\n                ? ValidateLongFileName(tempFileName, extraTruncateSize)\n                : tempFileName;\n            i += 1;\n        }\n\n        return tempFileName;\n    }\n    #endregion\n\n    #region RemoveInvalidCharsFromFileName\n    /// <summary>\n    /// Removes illegal filename characters\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    /// <returns></returns>\n    public static string RemoveInvalidFileNameChars(string fileName)\n    {\n        if (string.IsNullOrEmpty(fileName))\n            return fileName;\n\n        var result = Path.GetInvalidFileNameChars()\n            .Aggregate(fileName, (current, c) => current.Replace(c.ToString(CultureInfo.InvariantCulture), \"_\"));\n\n        result = result.Replace(\",\", string.Empty);\n\n        return result;\n    }\n    #endregion\n\n    #region ValidateLongFileName\n    /// <summary>\n    /// Validates the length of <paramref name=\"fileName\"/>, when this is longer then\n    /// 260 chars it will be truncated.\n    /// zodat deze wel past\n    /// </summary>\n    /// <param name=\"fileName\">The filename with path</param>\n    /// <param name=\"extraTruncateSize\">Optional extra truncate size, when not used the filename is truncated until it fits</param>\n    /// <returns></returns>\n    /// <exception cref=\"ArgumentException\">Raised when no path or file name is given in the <paramref name=\"fileName\"/></exception>\n    /// <exception cref=\"PathTooLongException\">Raised when it is not possible to truncate the <paramref name=\"fileName\"/></exception>\n    public static string ValidateLongFileName(string fileName, int extraTruncateSize = -1)\n    {\n        var fileNameWithoutExtension = GetFileNameWithoutExtension(fileName);\n\n        if (string.IsNullOrWhiteSpace(fileNameWithoutExtension))\n            throw new ArgumentException(@\"No file name is given, e.g. c:\\temp\\temp.txt\", nameof(fileName));\n\n        var extension = GetExtension(fileName);\n\n        if (string.IsNullOrWhiteSpace(extension))\n            extension = string.Empty;\n\n        var path = GetDirectoryName(fileName);\n\n        if (string.IsNullOrWhiteSpace(path))\n            throw new ArgumentException(@\"No path is given, e.g. c:\\temp\\temp.txt\", nameof(fileName));\n\n        path = CheckForDirectorySeparator(path);\n\n        if (fileName.Length <= MaxPath)\n            return fileName;\n\n        var maxFileNameLength = MaxPath - path.Length - extension.Length;\n        if (extraTruncateSize != -1)\n            maxFileNameLength -= extraTruncateSize;\n\n        if (maxFileNameLength < 1)\n            throw new PathTooLongException(\"Unable the truncate the fileName '\" + fileName + \"', current size '\" +\n                                           fileName.Length + \"'\");\n\n        return path + fileNameWithoutExtension.Substring(0, maxFileNameLength) + extension;\n    }\n    #endregion\n\n    #region GetExtension\n    /// <summary>\n    /// Returns the extension of the specified <paramref name=\"path\"/> string\n    /// </summary>\n    /// <param name=\"path\">The path of the file</param>\n    /// <returns></returns>\n    /// <exception cref=\"ArgumentException\">Raised when no path is given</exception>\n    public static string GetExtension(string path)\n    {\n        if (string.IsNullOrWhiteSpace(path))\n            throw new ArgumentException(\"path\");\n\n        var splittedPath = path.Split(Path.DirectorySeparatorChar);\n        var fileName = splittedPath[splittedPath.Length - 1];\n\n        var index = fileName.LastIndexOf(\".\", StringComparison.Ordinal);\n\n        return index == -1\n            ? string.Empty\n            : fileName.Substring(fileName.LastIndexOf(\".\", StringComparison.Ordinal), fileName.Length - index);\n    }\n    #endregion\n\n    #region GetFileNameWithoutExtension\n    /// <summary>\n    /// Returns the file name of the specified <paramref name=\"path\"/> string without the extension\n    /// </summary>\n    /// <param name=\"path\">The path of the file</param>\n    /// <returns></returns>\n    /// <exception cref=\"ArgumentException\"></exception>\n    public static string GetFileNameWithoutExtension(string path)\n    {\n        if (string.IsNullOrWhiteSpace(path))\n            throw new ArgumentException(@\"No path given\", nameof(path));\n\n        var splittedPath = path.Split(Path.DirectorySeparatorChar);\n        var fileName = splittedPath[splittedPath.Length - 1];\n        return !fileName.Contains(\".\")\n            ? fileName\n            : fileName.Substring(0, fileName.LastIndexOf(\".\", StringComparison.Ordinal));\n    }\n    #endregion\n\n    #region GetDirectoryName\n    /// <summary>\n    /// Returns the directory information for the specified <paramref name=\"path\"/> string\n    /// </summary>\n    /// <param name=\"path\">The path of a file or directory</param>\n    /// <returns></returns>\n    public static string GetDirectoryName(string path)\n    {\n        //GetDirectoryName('C:\\MyDir\\MySubDir\\myfile.ext') returns 'C:\\MyDir\\MySubDir'\n        //GetDirectoryName('C:\\MyDir\\MySubDir') returns 'C:\\MyDir'\n        //GetDirectoryName('C:\\MyDir\\') returns 'C:\\MyDir'\n        //GetDirectoryName('C:\\MyDir') returns 'C:\\'\n        //GetDirectoryName('C:\\') returns ''\n\n        var splittedPath = path.Split(Path.DirectorySeparatorChar);\n\n        if (splittedPath.Length <= 1)\n            return string.Empty;\n\n        var result = splittedPath[0];\n\n        for (var i = 1; i < splittedPath.Length - 1; i++)\n            result += Path.DirectorySeparatorChar + splittedPath[i];\n\n        return result;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/Mapi.cs",
    "content": "﻿//\n// Mapi.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Text;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains MAPI related helper methods\n/// </summary>\ninternal static class Mapi\n{\n    #region Fields\n    private static byte[] _instanceKey;\n    #endregion\n\n    #region GenerateSearchKey\n    /// <summary>\n    ///     A search key is used to compare the data in two objects. An object's search key is stored in its\n    ///     <see cref=\"PropertyTags.PR_SEARCH_KEY\" /> (PidTagSearchKey) property. Because a search key\n    ///     represents an object's data and not the object itself, two different objects with the same data can have the same\n    ///     search key. When an object is copied, for example, both the original object and its copy have the same data and the\n    ///     same search key. Messages and messaging users have search keys. The search key of a message is a unique identifier\n    ///     of  the message's data. Message store providers furnish a message's <see cref=\"PropertyTags.PR_SEARCH_KEY\" />\n    ///     property at message creation time.The search key of an address book entry is computed from its address type(\n    ///     <see cref=\"PropertyTags.PR_ADDRTYPE_W\" /> (PidTagAddressType)) and address\n    ///     (<see cref=\"PropertyTags.PR_EMAIL_ADDRESS_W\" /> (PidTagEmailAddress)). If the address book entry is writable, \n    ///     its search key might not be available until the address type and address have been set by using the \n    ///     IMAPIProp::SetProps method and the entry has been saved by using the IMAPIProp::SaveChanges method.When these\n    ///     address properties change, it is possible for the corresponding search key not to be synchronized with the new\n    ///     values until the changes have been committed with a SaveChanges call. The value of an object's record key can be \n    ///     the same as or different than the value of its search key, depending on the service provider. Some service providers \n    ///     use the same value for an object's search key, record key, and entry identifier.Other service providers assign unique \n    ///     values for each of its objects identifiers.\n    /// </summary>\n    /// <returns></returns>\n    public static byte[] GenerateSearchKey(string addressType, string emailAddress)\n    {\n        var searchKey = addressType + emailAddress;\n        return Encoding.Unicode.GetBytes(searchKey);\n    }\n    #endregion\n\n    #region GenerateRecordKey\n    /// <summary>\n    ///     A record key is used to compare two objects. Message store and address book objects must have record keys, which\n    ///     are stored in their <see cref=\"PropertyTags.PR_RECORD_KEY\" /> (PidTagRecordKey) property. Because a record key\n    ///     identifies an object and not its data, every instance of an object has a unique record key. The scope of a record\n    ///     key for folders and messages is the message store. The scope for address book containers, messaging users, and\n    ///     distribution lists is the set of top-level containers provided by MAPI for use in the integrated address book.\n    ///     Record keys can be duplicated in another resource. For example, different messages in two different message stores\n    ///     can have the same record key. This is different from long-term entry identifiers; because long-term entry\n    ///     identifiers contain a reference to the service provider, they have a wider scope.A message store's record key is\n    ///     similar in scope to a long-term entry identifier; it should be unique across all message store providers. To ensure\n    ///     this uniqueness, message store providers typically set their record key to a value that is the combination of their\n    ///     <see cref=\"PropertyTags.PR_MDB_PROVIDER\" /> (PidTagStoreProvider) property and an identifier that is unique to the\n    ///     message store.\n    /// </summary>\n    /// <returns></returns>\n    public static byte[] GenerateRecordKey()\n    {\n        var guid = Guid.NewGuid();\n        return guid.ToByteArray();\n    }\n    #endregion\n\n    #region GenerateInstanceKey\n    /// <summary>\n    ///     This property is a binary value that uniquely identifies a row in a table view. It is a required column in most\n    ///     tables. If a row is included in two views, there are two different instance keys. The instance key of a row may\n    ///     differ each time the table is opened, but remains constant while the table is open. Rows added while a table is in\n    ///     use do not reuse an instance key that was previously used.\n    ///     message store.\n    /// </summary>\n    /// <returns></returns>\n    public static byte[] GenerateInstanceKey()\n    {\n        if (_instanceKey == null)\n        {\n            _instanceKey = new byte[4];\n            Buffer.BlockCopy(Guid.NewGuid().ToByteArray(), 0, _instanceKey, 0, 4);\n        }\n\n        return _instanceKey;\n    }\n    #endregion\n\n    #region GenerateEntryId\n    /// <summary>\n    ///     The PR_ENTRYID property contains a MAPI entry identifier used to open and edit properties of a particular MAPI\n    ///     object.\n    /// </summary>\n    /// <remarks>\n    ///     The PR_ENTRYID property identifies an object for OpenEntry to instantiate and provides access to all of its\n    ///     properties through the appropriate derived interface of IMAPIProp. PR_ENTRYID is one of the base address properties\n    ///     for all messaging users. The PR_ENTRYID for CEMAPI always contains long-term identifiers. <br/>\n    ///     - Required on folder objects <br/>\n    ///     - Required on message store objects <br/>\n    ///     - Required on status objects  <br/>\n    ///     - Changed in a copy operation <br/>\n    ///     - Unique within entire world\n    /// </remarks>\n    /// <returns></returns>\n    public static byte[] GenerateEntryId()\n    {\n        return Encoding.Unicode.GetBytes(Guid.NewGuid().ToString());\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/MimeType.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n/// A mapping of file name extensions to the corresponding MIME-type.\n/// </summary>\n/// <remarks>\n/// A mapping of file name extensions to the corresponding MIME-type.\n/// </remarks>\npublic static class MimeTypes\n{\n    #region Fields\n    /// <summary>\n    /// A dictionary of mimetypes\n    /// </summary>\n    // ReSharper disable once InconsistentNaming\n    public static readonly Dictionary<string, string> mimeTypes;\n    #endregion\n\n    #region Constructor\n    static MimeTypes()\n    {\n        mimeTypes = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);\n        mimeTypes.Add(\"323\", \"text/h323\");\n        mimeTypes.Add(\"3dmf\", \"x-world/x-3dmf\");\n        mimeTypes.Add(\"3dm\", \"x-world/x-3dmf\");\n        mimeTypes.Add(\"3g2\", \"video/3gpp2\");\n        mimeTypes.Add(\"3gp\", \"video/3gpp\");\n        mimeTypes.Add(\"7z\", \"application/x-7z-compressed\");\n        mimeTypes.Add(\"aab\", \"application/x-authorware-bin\");\n        mimeTypes.Add(\"aac\", \"audio/aac\");\n        mimeTypes.Add(\"aam\", \"application/x-authorware-map\");\n        mimeTypes.Add(\"aas\", \"application/x-authorware-seg\");\n        mimeTypes.Add(\"abc\", \"text/vnd.abc\");\n        mimeTypes.Add(\"acgi\", \"text/html\");\n        mimeTypes.Add(\"acx\", \"application/internet-property-stream\");\n        mimeTypes.Add(\"afl\", \"video/animaflex\");\n        mimeTypes.Add(\"ai\", \"application/postscript\");\n        mimeTypes.Add(\"aif\", \"audio/aiff\");\n        mimeTypes.Add(\"aifc\", \"audio/aiff\");\n        mimeTypes.Add(\"aiff\", \"audio/aiff\");\n        mimeTypes.Add(\"aim\", \"application/x-aim\");\n        mimeTypes.Add(\"aip\", \"text/x-audiosoft-intra\");\n        mimeTypes.Add(\"ani\", \"application/x-navi-animation\");\n        mimeTypes.Add(\"aos\", \"application/x-nokia-9000-communicator-add-on-software\");\n        mimeTypes.Add(\"appcache\", \"text/cache-manifest\");\n        mimeTypes.Add(\"application\", \"application/x-ms-application\");\n        mimeTypes.Add(\"aps\", \"application/mime\");\n        mimeTypes.Add(\"art\", \"image/x-jg\");\n        mimeTypes.Add(\"asf\", \"video/x-ms-asf\");\n        mimeTypes.Add(\"asm\", \"text/x-asm\");\n        mimeTypes.Add(\"asp\", \"text/asp\");\n        mimeTypes.Add(\"asr\", \"video/x-ms-asf\");\n        mimeTypes.Add(\"asx\", \"application/x-mplayer2\");\n        mimeTypes.Add(\"atom\", \"application/atom+xml\");\n        mimeTypes.Add(\"au\", \"audio/x-au\");\n        mimeTypes.Add(\"avi\", \"video/avi\");\n        mimeTypes.Add(\"avs\", \"video/avs-video\");\n        mimeTypes.Add(\"axs\", \"application/olescript\");\n        mimeTypes.Add(\"bas\", \"text/plain\");\n        mimeTypes.Add(\"bcpio\", \"application/x-bcpio\");\n        mimeTypes.Add(\"bin\", \"application/octet-stream\");\n        mimeTypes.Add(\"bm\", \"image/bmp\");\n        mimeTypes.Add(\"bmp\", \"image/bmp\");\n        mimeTypes.Add(\"boo\", \"application/book\");\n        mimeTypes.Add(\"book\", \"application/book\");\n        mimeTypes.Add(\"boz\", \"application/x-bzip2\");\n        mimeTypes.Add(\"bsh\", \"application/x-bsh\");\n        mimeTypes.Add(\"bz2\", \"application/x-bzip2\");\n        mimeTypes.Add(\"bz\", \"application/x-bzip\");\n        mimeTypes.Add(\"cat\", \"application/vnd.ms-pki.seccat\");\n        mimeTypes.Add(\"ccad\", \"application/clariscad\");\n        mimeTypes.Add(\"cco\", \"application/x-cocoa\");\n        mimeTypes.Add(\"cc\", \"text/plain\");\n        mimeTypes.Add(\"cdf\", \"application/cdf\");\n        mimeTypes.Add(\"cer\", \"application/pkix-cert\");\n        mimeTypes.Add(\"cha\", \"application/x-chat\");\n        mimeTypes.Add(\"chat\", \"application/x-chat\");\n        mimeTypes.Add(\"class\", \"application/x-java-applet\");\n        mimeTypes.Add(\"clp\", \"application/x-msclip\");\n        mimeTypes.Add(\"cmx\", \"image/x-cmx\");\n        mimeTypes.Add(\"cod\", \"image/cis-cod\");\n        mimeTypes.Add(\"coffee\", \"text/x-coffeescript\");\n        mimeTypes.Add(\"conf\", \"text/plain\");\n        mimeTypes.Add(\"cpio\", \"application/x-cpio\");\n        mimeTypes.Add(\"cpp\", \"text/plain\");\n        mimeTypes.Add(\"cpt\", \"application/x-cpt\");\n        mimeTypes.Add(\"crd\", \"application/x-mscardfile\");\n        mimeTypes.Add(\"crl\", \"application/pkix-crl\");\n        mimeTypes.Add(\"crt\", \"application/pkix-cert\");\n        mimeTypes.Add(\"csh\", \"application/x-csh\");\n        mimeTypes.Add(\"css\", \"text/css\");\n        mimeTypes.Add(\"c\", \"text/plain\");\n        mimeTypes.Add(\"c++\", \"text/plain\");\n        mimeTypes.Add(\"cxx\", \"text/plain\");\n        mimeTypes.Add(\"dart\", \"application/dart\");\n        mimeTypes.Add(\"dcr\", \"application/x-director\");\n        mimeTypes.Add(\"deb\", \"application/x-deb\");\n        mimeTypes.Add(\"deepv\", \"application/x-deepv\");\n        mimeTypes.Add(\"def\", \"text/plain\");\n        mimeTypes.Add(\"deploy\", \"application/octet-stream\");\n        mimeTypes.Add(\"der\", \"application/x-x509-ca-cert\");\n        mimeTypes.Add(\"dib\", \"image/bmp\");\n        mimeTypes.Add(\"dif\", \"video/x-dv\");\n        mimeTypes.Add(\"dir\", \"application/x-director\");\n        mimeTypes.Add(\"disco\", \"text/xml\");\n        mimeTypes.Add(\"dll\", \"application/x-msdownload\");\n        mimeTypes.Add(\"dl\", \"video/dl\");\n        mimeTypes.Add(\"doc\", \"application/msword\");\n        mimeTypes.Add(\"docm\", \"application/vnd.ms-word.document.macroEnabled.12\");\n        mimeTypes.Add(\"docx\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\");\n        mimeTypes.Add(\"dot\", \"application/msword\");\n        mimeTypes.Add(\"dotm\", \"application/vnd.ms-word.template.macroEnabled.12\");\n        mimeTypes.Add(\"dotx\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\");\n        mimeTypes.Add(\"dp\", \"application/commonground\");\n        mimeTypes.Add(\"drw\", \"application/drafting\");\n        mimeTypes.Add(\"dtd\", \"application/xml-dtd\");\n        mimeTypes.Add(\"dvi\", \"application/x-dvi\");\n        mimeTypes.Add(\"dv\", \"video/x-dv\");\n        mimeTypes.Add(\"dwf\", \"drawing/x-dwf (old)\");\n        mimeTypes.Add(\"dwg\", \"application/acad\");\n        mimeTypes.Add(\"dxf\", \"application/dxf\");\n        mimeTypes.Add(\"dxr\", \"application/x-director\");\n        mimeTypes.Add(\"elc\", \"application/x-elc\");\n        mimeTypes.Add(\"el\", \"text/x-script.elisp\");\n        mimeTypes.Add(\"eml\", \"message/rfc822\");\n        mimeTypes.Add(\"eot\", \"application/vnd.bw-fontobject\");\n        mimeTypes.Add(\"eps\", \"application/postscript\");\n        mimeTypes.Add(\"es\", \"application/x-esrehber\");\n        mimeTypes.Add(\"etx\", \"text/x-setext\");\n        mimeTypes.Add(\"evy\", \"application/envoy\");\n        mimeTypes.Add(\"exe\", \"application/octet-stream\");\n        mimeTypes.Add(\"f77\", \"text/plain\");\n        mimeTypes.Add(\"f90\", \"text/plain\");\n        mimeTypes.Add(\"fdf\", \"application/vnd.fdf\");\n        mimeTypes.Add(\"fif\", \"image/fif\");\n        mimeTypes.Add(\"flac\", \"audio/x-flac\");\n        mimeTypes.Add(\"fli\", \"video/fli\");\n        mimeTypes.Add(\"flo\", \"image/florian\");\n        mimeTypes.Add(\"flr\", \"x-world/x-vrml\");\n        mimeTypes.Add(\"flx\", \"text/vnd.fmi.flexstor\");\n        mimeTypes.Add(\"fmf\", \"video/x-atomic3d-feature\");\n        mimeTypes.Add(\"for\", \"text/plain\");\n        mimeTypes.Add(\"fpx\", \"image/vnd.fpx\");\n        mimeTypes.Add(\"frl\", \"application/freeloader\");\n        mimeTypes.Add(\"f\", \"text/plain\");\n        mimeTypes.Add(\"funk\", \"audio/make\");\n        mimeTypes.Add(\"g3\", \"image/g3fax\");\n        mimeTypes.Add(\"gif\", \"image/gif\");\n        mimeTypes.Add(\"gl\", \"video/gl\");\n        mimeTypes.Add(\"gsd\", \"audio/x-gsm\");\n        mimeTypes.Add(\"gsm\", \"audio/x-gsm\");\n        mimeTypes.Add(\"gsp\", \"application/x-gsp\");\n        mimeTypes.Add(\"gss\", \"application/x-gss\");\n        mimeTypes.Add(\"gtar\", \"application/x-gtar\");\n        mimeTypes.Add(\"g\", \"text/plain\");\n        mimeTypes.Add(\"gz\", \"application/x-gzip\");\n        mimeTypes.Add(\"gzip\", \"application/x-gzip\");\n        mimeTypes.Add(\"hdf\", \"application/x-hdf\");\n        mimeTypes.Add(\"help\", \"application/x-helpfile\");\n        mimeTypes.Add(\"hgl\", \"application/vnd.hp-HPGL\");\n        mimeTypes.Add(\"hh\", \"text/plain\");\n        mimeTypes.Add(\"hlb\", \"text/x-script\");\n        mimeTypes.Add(\"hlp\", \"application/x-helpfile\");\n        mimeTypes.Add(\"hpg\", \"application/vnd.hp-HPGL\");\n        mimeTypes.Add(\"hpgl\", \"application/vnd.hp-HPGL\");\n        mimeTypes.Add(\"hqx\", \"application/binhex\");\n        mimeTypes.Add(\"hta\", \"application/hta\");\n        mimeTypes.Add(\"htc\", \"text/x-component\");\n        mimeTypes.Add(\"h\", \"text/plain\");\n        mimeTypes.Add(\"htmls\", \"text/html\");\n        mimeTypes.Add(\"html\", \"text/html\");\n        mimeTypes.Add(\"htm\", \"text/html\");\n        mimeTypes.Add(\"htt\", \"text/webviewhtml\");\n        mimeTypes.Add(\"htx\", \"text/html\");\n        mimeTypes.Add(\"ice\", \"x-conference/x-cooltalk\");\n        mimeTypes.Add(\"ico\", \"image/x-icon\");\n        mimeTypes.Add(\"ics\", \"text/calendar\");\n        mimeTypes.Add(\"idc\", \"text/plain\");\n        mimeTypes.Add(\"ief\", \"image/ief\");\n        mimeTypes.Add(\"iefs\", \"image/ief\");\n        mimeTypes.Add(\"iges\", \"application/iges\");\n        mimeTypes.Add(\"igs\", \"application/iges\");\n        mimeTypes.Add(\"iii\", \"application/x-iphone\");\n        mimeTypes.Add(\"ima\", \"application/x-ima\");\n        mimeTypes.Add(\"imap\", \"application/x-httpd-imap\");\n        mimeTypes.Add(\"inf\", \"application/inf\");\n        mimeTypes.Add(\"ins\", \"application/x-internett-signup\");\n        mimeTypes.Add(\"ip\", \"application/x-ip2\");\n        mimeTypes.Add(\"isp\", \"application/x-internet-signup\");\n        mimeTypes.Add(\"isu\", \"video/x-isvideo\");\n        mimeTypes.Add(\"it\", \"audio/it\");\n        mimeTypes.Add(\"iv\", \"application/x-inventor\");\n        mimeTypes.Add(\"ivf\", \"video/x-ivf\");\n        mimeTypes.Add(\"ivr\", \"i-world/i-vrml\");\n        mimeTypes.Add(\"ivy\", \"application/x-livescreen\");\n        mimeTypes.Add(\"jam\", \"audio/x-jam\");\n        mimeTypes.Add(\"jar\", \"application/java-archive\");\n        mimeTypes.Add(\"java\", \"text/plain\");\n        mimeTypes.Add(\"jav\", \"text/plain\");\n        mimeTypes.Add(\"jcm\", \"application/x-java-commerce\");\n        mimeTypes.Add(\"jfif\", \"image/jpeg\");\n        mimeTypes.Add(\"jfif-tbnl\", \"image/jpeg\");\n        mimeTypes.Add(\"jpeg\", \"image/jpeg\");\n        mimeTypes.Add(\"jpe\", \"image/jpeg\");\n        mimeTypes.Add(\"jpg\", \"image/jpeg\");\n        mimeTypes.Add(\"jps\", \"image/x-jps\");\n        mimeTypes.Add(\"js\", \"application/javascript\");\n        mimeTypes.Add(\"json\", \"application/json\");\n        mimeTypes.Add(\"jut\", \"image/jutvision\");\n        mimeTypes.Add(\"kar\", \"audio/midi\");\n        mimeTypes.Add(\"ksh\", \"text/x-script.ksh\");\n        mimeTypes.Add(\"la\", \"audio/nspaudio\");\n        mimeTypes.Add(\"lam\", \"audio/x-liveaudio\");\n        mimeTypes.Add(\"latex\", \"application/x-latex\");\n        mimeTypes.Add(\"list\", \"text/plain\");\n        mimeTypes.Add(\"lma\", \"audio/nspaudio\");\n        mimeTypes.Add(\"log\", \"text/plain\");\n        mimeTypes.Add(\"lsp\", \"application/x-lisp\");\n        mimeTypes.Add(\"lst\", \"text/plain\");\n        mimeTypes.Add(\"lsx\", \"text/x-la-asf\");\n        mimeTypes.Add(\"ltx\", \"application/x-latex\");\n        mimeTypes.Add(\"m13\", \"application/x-msmediaview\");\n        mimeTypes.Add(\"m14\", \"application/x-msmediaview\");\n        mimeTypes.Add(\"m1v\", \"video/mpeg\");\n        mimeTypes.Add(\"m2a\", \"audio/mpeg\");\n        mimeTypes.Add(\"m2v\", \"video/mpeg\");\n        mimeTypes.Add(\"m3u\", \"audio/x-mpequrl\");\n        mimeTypes.Add(\"m4a\", \"audio/mp4\");\n        mimeTypes.Add(\"m4v\", \"video/mp4\");\n        mimeTypes.Add(\"man\", \"application/x-troff-man\");\n        mimeTypes.Add(\"manifest\", \"application/x-ms-manifest\");\n        mimeTypes.Add(\"map\", \"application/x-navimap\");\n        mimeTypes.Add(\"mar\", \"text/plain\");\n        mimeTypes.Add(\"mbd\", \"application/mbedlet\");\n        mimeTypes.Add(\"mc$\", \"application/x-magic-cap-package-1.0\");\n        mimeTypes.Add(\"mcd\", \"application/mcad\");\n        mimeTypes.Add(\"mcf\", \"image/vasa\");\n        mimeTypes.Add(\"mcp\", \"application/netmc\");\n        mimeTypes.Add(\"mdb\", \"application/x-msaccess\");\n        mimeTypes.Add(\"mesh\", \"model/mesh\");\n        mimeTypes.Add(\"me\", \"application/x-troff-me\");\n        mimeTypes.Add(\"mid\", \"audio/midi\");\n        mimeTypes.Add(\"midi\", \"audio/midi\");\n        mimeTypes.Add(\"mif\", \"application/x-mif\");\n        mimeTypes.Add(\"mjf\", \"audio/x-vnd.AudioExplosion.MjuiceMediaFile\");\n        mimeTypes.Add(\"mjpg\", \"video/x-motion-jpeg\");\n        mimeTypes.Add(\"mm\", \"application/base64\");\n        mimeTypes.Add(\"mme\", \"application/base64\");\n        mimeTypes.Add(\"mny\", \"application/x-msmoney\");\n        mimeTypes.Add(\"mod\", \"audio/mod\");\n        mimeTypes.Add(\"mov\", \"video/quicktime\");\n        mimeTypes.Add(\"movie\", \"video/x-sgi-movie\");\n        mimeTypes.Add(\"mp2\", \"video/mpeg\");\n        mimeTypes.Add(\"mp3\", \"audio/mpeg\");\n        mimeTypes.Add(\"mp4\", \"video/mp4\");\n        mimeTypes.Add(\"mp4a\", \"audio/mp4\");\n        mimeTypes.Add(\"mp4v\", \"video/mp4\");\n        mimeTypes.Add(\"mpa\", \"audio/mpeg\");\n        mimeTypes.Add(\"mpc\", \"application/x-project\");\n        mimeTypes.Add(\"mpeg\", \"video/mpeg\");\n        mimeTypes.Add(\"mpe\", \"video/mpeg\");\n        mimeTypes.Add(\"mpga\", \"audio/mpeg\");\n        mimeTypes.Add(\"mpg\", \"video/mpeg\");\n        mimeTypes.Add(\"mpp\", \"application/vnd.ms-project\");\n        mimeTypes.Add(\"mpt\", \"application/x-project\");\n        mimeTypes.Add(\"mpv2\", \"video/mpeg\");\n        mimeTypes.Add(\"mpv\", \"application/x-project\");\n        mimeTypes.Add(\"mpx\", \"application/x-project\");\n        mimeTypes.Add(\"mrc\", \"application/marc\");\n        mimeTypes.Add(\"ms\", \"application/x-troff-ms\");\n        mimeTypes.Add(\"msh\", \"model/mesh\");\n        mimeTypes.Add(\"m\", \"text/plain\");\n        mimeTypes.Add(\"mvb\", \"application/x-msmediaview\");\n        mimeTypes.Add(\"mv\", \"video/x-sgi-movie\");\n        mimeTypes.Add(\"my\", \"audio/make\");\n        mimeTypes.Add(\"mzz\", \"application/x-vnd.AudioExplosion.mzz\");\n        mimeTypes.Add(\"nap\", \"image/naplps\");\n        mimeTypes.Add(\"naplps\", \"image/naplps\");\n        mimeTypes.Add(\"nc\", \"application/x-netcdf\");\n        mimeTypes.Add(\"ncm\", \"application/vnd.nokia.configuration-message\");\n        mimeTypes.Add(\"niff\", \"image/x-niff\");\n        mimeTypes.Add(\"nif\", \"image/x-niff\");\n        mimeTypes.Add(\"nix\", \"application/x-mix-transfer\");\n        mimeTypes.Add(\"nsc\", \"application/x-conference\");\n        mimeTypes.Add(\"nvd\", \"application/x-navidoc\");\n        mimeTypes.Add(\"nws\", \"message/rfc822\");\n        mimeTypes.Add(\"oda\", \"application/oda\");\n        mimeTypes.Add(\"ods\", \"application/oleobject\");\n        mimeTypes.Add(\"oga\", \"audio/ogg\");\n        mimeTypes.Add(\"ogg\", \"audio/ogg\");\n        mimeTypes.Add(\"ogv\", \"video/ogg\");\n        mimeTypes.Add(\"ogx\", \"application/ogg\");\n        mimeTypes.Add(\"omc\", \"application/x-omc\");\n        mimeTypes.Add(\"omcd\", \"application/x-omcdatamaker\");\n        mimeTypes.Add(\"omcr\", \"application/x-omcregerator\");\n        mimeTypes.Add(\"opus\", \"audio/ogg\");\n        mimeTypes.Add(\"oxps\", \"application/oxps\");\n        mimeTypes.Add(\"p10\", \"application/pkcs10\");\n        mimeTypes.Add(\"p12\", \"application/pkcs-12\");\n        mimeTypes.Add(\"p7a\", \"application/x-pkcs7-signature\");\n        mimeTypes.Add(\"p7b\", \"application/x-pkcs7-certificates\");\n        mimeTypes.Add(\"p7c\", \"application/pkcs7-mime\");\n        mimeTypes.Add(\"p7m\", \"application/pkcs7-mime\");\n        mimeTypes.Add(\"p7r\", \"application/x-pkcs7-certreqresp\");\n        mimeTypes.Add(\"p7s\", \"application/pkcs7-signature\");\n        mimeTypes.Add(\"part\", \"application/pro_eng\");\n        mimeTypes.Add(\"pas\", \"text/pascal\");\n        mimeTypes.Add(\"pbm\", \"image/x-portable-bitmap\");\n        mimeTypes.Add(\"pcl\", \"application/x-pcl\");\n        mimeTypes.Add(\"pct\", \"image/x-pict\");\n        mimeTypes.Add(\"pcx\", \"image/x-pcx\");\n        mimeTypes.Add(\"pdb\", \"chemical/x-pdb\");\n        mimeTypes.Add(\"pdf\", \"application/pdf\");\n        mimeTypes.Add(\"pfunk\", \"audio/make\");\n        mimeTypes.Add(\"pfx\", \"application/x-pkcs12\");\n        mimeTypes.Add(\"pgm\", \"image/x-portable-graymap\");\n        mimeTypes.Add(\"pic\", \"image/pict\");\n        mimeTypes.Add(\"pict\", \"image/pict\");\n        mimeTypes.Add(\"pkg\", \"application/x-newton-compatible-pkg\");\n        mimeTypes.Add(\"pko\", \"application/vnd.ms-pki.pko\");\n        mimeTypes.Add(\"pl\", \"text/plain\");\n        mimeTypes.Add(\"plx\", \"application/x-PiXCLscript\");\n        mimeTypes.Add(\"pm4\", \"application/x-pagemaker\");\n        mimeTypes.Add(\"pm5\", \"application/x-pagemaker\");\n        mimeTypes.Add(\"pma\", \"application/x-perfmon\");\n        mimeTypes.Add(\"pmc\", \"application/x-perfmon\");\n        mimeTypes.Add(\"pm\", \"image/x-xpixmap\");\n        mimeTypes.Add(\"pml\", \"application/x-perfmon\");\n        mimeTypes.Add(\"pmr\", \"application/x-perfmon\");\n        mimeTypes.Add(\"pmw\", \"application/x-perfmon\");\n        mimeTypes.Add(\"png\", \"image/png\");\n        mimeTypes.Add(\"pnm\", \"application/x-portable-anymap\");\n        mimeTypes.Add(\"pot\", \"application/vnd.ms-powerpoint\");\n        mimeTypes.Add(\"potm\", \"application/vnd.ms-powerpoint.template.macroEnabled.12\");\n        mimeTypes.Add(\"potx\", \"application/vnd.openxmlformats-officedocument.presentationml.template\");\n        mimeTypes.Add(\"pov\", \"model/x-pov\");\n        mimeTypes.Add(\"ppa\", \"application/vnd.ms-powerpoint\");\n        mimeTypes.Add(\"ppam\", \"application/vnd.ms-powerpoint.addin.macroEnabled.12\");\n        mimeTypes.Add(\"ppm\", \"image/x-portable-pixmap\");\n        mimeTypes.Add(\"pps\", \"application/vnd.ms-powerpoint\");\n        mimeTypes.Add(\"ppsm\", \"application/vnd.ms-powerpoint.slideshow.macroEnabled.12\");\n        mimeTypes.Add(\"ppsx\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\");\n        mimeTypes.Add(\"ppt\", \"application/vnd.ms-powerpoint\");\n        mimeTypes.Add(\"pptm\", \"application/vnd.ms-powerpoint.presentation.macroEnabled.12\");\n        mimeTypes.Add(\"pptx\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\");\n        mimeTypes.Add(\"ppz\", \"application/mspowerpoint\");\n        mimeTypes.Add(\"pre\", \"application/x-freelance\");\n        mimeTypes.Add(\"prf\", \"application/pics-rules\");\n        mimeTypes.Add(\"prt\", \"application/pro_eng\");\n        mimeTypes.Add(\"ps\", \"application/postscript\");\n        mimeTypes.Add(\"p\", \"text/x-pascal\");\n        mimeTypes.Add(\"pub\", \"application/x-mspublisher\");\n        mimeTypes.Add(\"pvu\", \"paleovu/x-pv\");\n        mimeTypes.Add(\"pwz\", \"application/vnd.ms-powerpoint\");\n        mimeTypes.Add(\"pyc\", \"applicaiton/x-bytecode.python\");\n        mimeTypes.Add(\"py\", \"text/x-script.phyton\");\n        mimeTypes.Add(\"qcp\", \"audio/vnd.qcelp\");\n        mimeTypes.Add(\"qd3d\", \"x-world/x-3dmf\");\n        mimeTypes.Add(\"qd3\", \"x-world/x-3dmf\");\n        mimeTypes.Add(\"qif\", \"image/x-quicktime\");\n        mimeTypes.Add(\"qtc\", \"video/x-qtc\");\n        mimeTypes.Add(\"qtif\", \"image/x-quicktime\");\n        mimeTypes.Add(\"qti\", \"image/x-quicktime\");\n        mimeTypes.Add(\"qt\", \"video/quicktime\");\n        mimeTypes.Add(\"ra\", \"audio/x-pn-realaudio\");\n        mimeTypes.Add(\"ram\", \"audio/x-pn-realaudio\");\n        mimeTypes.Add(\"ras\", \"application/x-cmu-raster\");\n        mimeTypes.Add(\"rast\", \"image/cmu-raster\");\n        mimeTypes.Add(\"rexx\", \"text/x-script.rexx\");\n        mimeTypes.Add(\"rf\", \"image/vnd.rn-realflash\");\n        mimeTypes.Add(\"rgb\", \"image/x-rgb\");\n        mimeTypes.Add(\"rm\", \"application/vnd.rn-realmedia\");\n        mimeTypes.Add(\"rmi\", \"audio/mid\");\n        mimeTypes.Add(\"rmm\", \"audio/x-pn-realaudio\");\n        mimeTypes.Add(\"rmp\", \"audio/x-pn-realaudio\");\n        mimeTypes.Add(\"rng\", \"application/ringing-tones\");\n        mimeTypes.Add(\"rnx\", \"application/vnd.rn-realplayer\");\n        mimeTypes.Add(\"roff\", \"application/x-troff\");\n        mimeTypes.Add(\"rp\", \"image/vnd.rn-realpix\");\n        mimeTypes.Add(\"rpm\", \"audio/x-pn-realaudio-plugin\");\n        mimeTypes.Add(\"rss\", \"application/rss+xml\");\n        mimeTypes.Add(\"rtf\", \"text/richtext\");\n        mimeTypes.Add(\"rt\", \"text/richtext\");\n        mimeTypes.Add(\"rtx\", \"text/richtext\");\n        mimeTypes.Add(\"rv\", \"video/vnd.rn-realvideo\");\n        mimeTypes.Add(\"s3m\", \"audio/s3m\");\n        mimeTypes.Add(\"sbk\", \"application/x-tbook\");\n        mimeTypes.Add(\"scd\", \"application/x-msschedule\");\n        mimeTypes.Add(\"scm\", \"application/x-lotusscreencam\");\n        mimeTypes.Add(\"sct\", \"text/scriptlet\");\n        mimeTypes.Add(\"sdml\", \"text/plain\");\n        mimeTypes.Add(\"sdp\", \"application/sdp\");\n        mimeTypes.Add(\"sdr\", \"application/sounder\");\n        mimeTypes.Add(\"sea\", \"application/sea\");\n        mimeTypes.Add(\"set\", \"application/set\");\n        mimeTypes.Add(\"setpay\", \"application/set-payment-initiation\");\n        mimeTypes.Add(\"setreg\", \"application/set-registration-initiation\");\n        mimeTypes.Add(\"sgml\", \"text/sgml\");\n        mimeTypes.Add(\"sgm\", \"text/sgml\");\n        mimeTypes.Add(\"shar\", \"application/x-bsh\");\n        mimeTypes.Add(\"sh\", \"text/x-script.sh\");\n        mimeTypes.Add(\"shtml\", \"text/html\");\n        mimeTypes.Add(\"sid\", \"audio/x-psid\");\n        mimeTypes.Add(\"silo\", \"model/mesh\");\n        mimeTypes.Add(\"sit\", \"application/x-sit\");\n        mimeTypes.Add(\"skd\", \"application/x-koan\");\n        mimeTypes.Add(\"skm\", \"application/x-koan\");\n        mimeTypes.Add(\"skp\", \"application/x-koan\");\n        mimeTypes.Add(\"skt\", \"application/x-koan\");\n        mimeTypes.Add(\"sl\", \"application/x-seelogo\");\n        mimeTypes.Add(\"smi\", \"application/smil\");\n        mimeTypes.Add(\"smil\", \"application/smil\");\n        mimeTypes.Add(\"snd\", \"audio/basic\");\n        mimeTypes.Add(\"sol\", \"application/solids\");\n        mimeTypes.Add(\"spc\", \"application/x-pkcs7-certificates\");\n        mimeTypes.Add(\"spl\", \"application/futuresplash\");\n        mimeTypes.Add(\"spr\", \"application/x-sprite\");\n        mimeTypes.Add(\"sprite\", \"application/x-sprite\");\n        mimeTypes.Add(\"spx\", \"audio/ogg\");\n        mimeTypes.Add(\"src\", \"application/x-wais-source\");\n        mimeTypes.Add(\"ssi\", \"text/x-server-parsed-html\");\n        mimeTypes.Add(\"ssm\", \"application/streamingmedia\");\n        mimeTypes.Add(\"sst\", \"application/vnd.ms-pki.certstore\");\n        mimeTypes.Add(\"step\", \"application/step\");\n        mimeTypes.Add(\"s\", \"text/x-asm\");\n        mimeTypes.Add(\"stl\", \"application/sla\");\n        mimeTypes.Add(\"stm\", \"text/html\");\n        mimeTypes.Add(\"stp\", \"application/step\");\n        mimeTypes.Add(\"sv4cpio\", \"application/x-sv4cpio\");\n        mimeTypes.Add(\"sv4crc\", \"application/x-sv4crc\");\n        mimeTypes.Add(\"svf\", \"image/x-dwg\");\n        mimeTypes.Add(\"svg\", \"image/svg+xml\");\n        mimeTypes.Add(\"svr\", \"application/x-world\");\n        mimeTypes.Add(\"swf\", \"application/x-shockwave-flash\");\n        mimeTypes.Add(\"talk\", \"text/x-speech\");\n        mimeTypes.Add(\"t\", \"application/x-troff\");\n        mimeTypes.Add(\"tar\", \"application/x-tar\");\n        mimeTypes.Add(\"tbk\", \"application/toolbook\");\n        mimeTypes.Add(\"tcl\", \"text/x-script.tcl\");\n        mimeTypes.Add(\"tcsh\", \"text/x-script.tcsh\");\n        mimeTypes.Add(\"tex\", \"application/x-tex\");\n        mimeTypes.Add(\"texi\", \"application/x-texinfo\");\n        mimeTypes.Add(\"texinfo\", \"application/x-texinfo\");\n        mimeTypes.Add(\"text\", \"text/plain\");\n        mimeTypes.Add(\"tgz\", \"application/x-compressed\");\n        mimeTypes.Add(\"tiff\", \"image/tiff\");\n        mimeTypes.Add(\"tif\", \"image/tiff\");\n        mimeTypes.Add(\"tr\", \"application/x-troff\");\n        mimeTypes.Add(\"trm\", \"application/x-msterminal\");\n        mimeTypes.Add(\"ts\", \"text/x-typescript\");\n        mimeTypes.Add(\"tsi\", \"audio/tsp-audio\");\n        mimeTypes.Add(\"tsp\", \"audio/tsplayer\");\n        mimeTypes.Add(\"tsv\", \"text/tab-separated-values\");\n        mimeTypes.Add(\"ttf\", \"application/x-font-ttf\");\n        mimeTypes.Add(\"turbot\", \"image/florian\");\n        mimeTypes.Add(\"txt\", \"text/plain\");\n        mimeTypes.Add(\"uil\", \"text/x-uil\");\n        mimeTypes.Add(\"uls\", \"text/iuls\");\n        mimeTypes.Add(\"unis\", \"text/uri-list\");\n        mimeTypes.Add(\"uni\", \"text/uri-list\");\n        mimeTypes.Add(\"unv\", \"application/i-deas\");\n        mimeTypes.Add(\"uris\", \"text/uri-list\");\n        mimeTypes.Add(\"uri\", \"text/uri-list\");\n        mimeTypes.Add(\"ustar\", \"multipart/x-ustar\");\n        mimeTypes.Add(\"uue\", \"text/x-uuencode\");\n        mimeTypes.Add(\"uu\", \"text/x-uuencode\");\n        mimeTypes.Add(\"vcd\", \"application/x-cdlink\");\n        mimeTypes.Add(\"vcf\", \"text/vcard\");\n        mimeTypes.Add(\"vcard\", \"text/vcard\");\n        mimeTypes.Add(\"vcs\", \"text/x-vCalendar\");\n        mimeTypes.Add(\"vda\", \"application/vda\");\n        mimeTypes.Add(\"vdo\", \"video/vdo\");\n        mimeTypes.Add(\"vew\", \"application/groupwise\");\n        mimeTypes.Add(\"vivo\", \"video/vivo\");\n        mimeTypes.Add(\"viv\", \"video/vivo\");\n        mimeTypes.Add(\"vmd\", \"application/vocaltec-media-desc\");\n        mimeTypes.Add(\"vmf\", \"application/vocaltec-media-file\");\n        mimeTypes.Add(\"voc\", \"audio/voc\");\n        mimeTypes.Add(\"vos\", \"video/vosaic\");\n        mimeTypes.Add(\"vox\", \"audio/voxware\");\n        mimeTypes.Add(\"vqe\", \"audio/x-twinvq-plugin\");\n        mimeTypes.Add(\"vqf\", \"audio/x-twinvq\");\n        mimeTypes.Add(\"vql\", \"audio/x-twinvq-plugin\");\n        mimeTypes.Add(\"vrml\", \"application/x-vrml\");\n        mimeTypes.Add(\"vrt\", \"x-world/x-vrt\");\n        mimeTypes.Add(\"vsd\", \"application/x-visio\");\n        mimeTypes.Add(\"vst\", \"application/x-visio\");\n        mimeTypes.Add(\"vsw\", \"application/x-visio\");\n        mimeTypes.Add(\"w60\", \"application/wordperfect6.0\");\n        mimeTypes.Add(\"w61\", \"application/wordperfect6.1\");\n        mimeTypes.Add(\"w6w\", \"application/msword\");\n        mimeTypes.Add(\"wav\", \"audio/wav\");\n        mimeTypes.Add(\"wb1\", \"application/x-qpro\");\n        mimeTypes.Add(\"wbmp\", \"image/vnd.wap.wbmp\");\n        mimeTypes.Add(\"wcm\", \"application/vnd.ms-works\");\n        mimeTypes.Add(\"wdb\", \"application/vnd.ms-works\");\n        mimeTypes.Add(\"web\", \"application/vnd.xara\");\n        mimeTypes.Add(\"webm\", \"video/webm\");\n        mimeTypes.Add(\"wiz\", \"application/msword\");\n        mimeTypes.Add(\"wk1\", \"application/x-123\");\n        mimeTypes.Add(\"wks\", \"application/vnd.ms-works\");\n        mimeTypes.Add(\"wmf\", \"windows/metafile\");\n        mimeTypes.Add(\"wmlc\", \"application/vnd.wap.wmlc\");\n        mimeTypes.Add(\"wmlsc\", \"application/vnd.wap.wmlscriptc\");\n        mimeTypes.Add(\"wmls\", \"text/vnd.wap.wmlscript\");\n        mimeTypes.Add(\"wml\", \"text/vnd.wap.wml\");\n        mimeTypes.Add(\"wmp\", \"video/x-ms-wmp\");\n        mimeTypes.Add(\"wmv\", \"video/x-ms-wmv\");\n        mimeTypes.Add(\"wmx\", \"video/x-ms-wmx\");\n        mimeTypes.Add(\"woff\", \"application/x-woff\");\n        mimeTypes.Add(\"word\", \"application/msword\");\n        mimeTypes.Add(\"wp5\", \"application/wordperfect\");\n        mimeTypes.Add(\"wp6\", \"application/wordperfect\");\n        mimeTypes.Add(\"wp\", \"application/wordperfect\");\n        mimeTypes.Add(\"wpd\", \"application/wordperfect\");\n        mimeTypes.Add(\"wps\", \"application/vnd.ms-works\");\n        mimeTypes.Add(\"wq1\", \"application/x-lotus\");\n        mimeTypes.Add(\"wri\", \"application/mswrite\");\n        mimeTypes.Add(\"wrl\", \"application/x-world\");\n        mimeTypes.Add(\"wrz\", \"model/vrml\");\n        mimeTypes.Add(\"wsc\", \"text/scriplet\");\n        mimeTypes.Add(\"wsdl\", \"text/xml\");\n        mimeTypes.Add(\"wsrc\", \"application/x-wais-source\");\n        mimeTypes.Add(\"wtk\", \"application/x-wintalk\");\n        mimeTypes.Add(\"wvx\", \"video/x-ms-wvx\");\n        mimeTypes.Add(\"x3d\", \"model/x3d+xml\");\n        mimeTypes.Add(\"x3db\", \"model/x3d+fastinfoset\");\n        mimeTypes.Add(\"x3dv\", \"model/x3d-vrml\");\n        mimeTypes.Add(\"xaf\", \"x-world/x-vrml\");\n        mimeTypes.Add(\"xaml\", \"application/xaml+xml\");\n        mimeTypes.Add(\"xap\", \"application/x-silverlight-app\");\n        mimeTypes.Add(\"xbap\", \"application/x-ms-xbap\");\n        mimeTypes.Add(\"xbm\", \"image/x-xbitmap\");\n        mimeTypes.Add(\"xdr\", \"video/x-amt-demorun\");\n        mimeTypes.Add(\"xgz\", \"xgl/drawing\");\n        mimeTypes.Add(\"xht\", \"application/xhtml+xml\");\n        mimeTypes.Add(\"xhtml\", \"application/xhtml+xml\");\n        mimeTypes.Add(\"xif\", \"image/vnd.xiff\");\n        mimeTypes.Add(\"xla\", \"application/vnd.ms-excel\");\n        mimeTypes.Add(\"xlam\", \"application/vnd.ms-excel.addin.macroEnabled.12\");\n        mimeTypes.Add(\"xl\", \"application/excel\");\n        mimeTypes.Add(\"xlb\", \"application/excel\");\n        mimeTypes.Add(\"xlc\", \"application/excel\");\n        mimeTypes.Add(\"xld\", \"application/excel\");\n        mimeTypes.Add(\"xlk\", \"application/excel\");\n        mimeTypes.Add(\"xll\", \"application/excel\");\n        mimeTypes.Add(\"xlm\", \"application/excel\");\n        mimeTypes.Add(\"xls\", \"application/vnd.ms-excel\");\n        mimeTypes.Add(\"xlsb\", \"application/vnd.ms-excel.sheet.binary.macroEnabled.12\");\n        mimeTypes.Add(\"xlsm\", \"application/vnd.ms-excel.sheet.macroEnabled.12\");\n        mimeTypes.Add(\"xlsx\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\");\n        mimeTypes.Add(\"xlt\", \"application/vnd.ms-excel\");\n        mimeTypes.Add(\"xltm\", \"application/vnd.ms-excel.template.macroEnabled.12\");\n        mimeTypes.Add(\"xltx\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\");\n        mimeTypes.Add(\"xlv\", \"application/excel\");\n        mimeTypes.Add(\"xlw\", \"application/excel\");\n        mimeTypes.Add(\"xm\", \"audio/xm\");\n        mimeTypes.Add(\"xml\", \"text/xml\");\n        mimeTypes.Add(\"xmz\", \"xgl/movie\");\n        mimeTypes.Add(\"xof\", \"x-world/x-vrml\");\n        mimeTypes.Add(\"xpi\", \"application/x-xpinstall\");\n        mimeTypes.Add(\"xpix\", \"application/x-vnd.ls-xpix\");\n        mimeTypes.Add(\"xpm\", \"image/xpm\");\n        mimeTypes.Add(\"xps\", \"application/vnd.ms-xpsdocument\");\n        mimeTypes.Add(\"x-png\", \"image/png\");\n        mimeTypes.Add(\"xsd\", \"text/xml\");\n        mimeTypes.Add(\"xsl\", \"text/xml\");\n        mimeTypes.Add(\"xslt\", \"text/xml\");\n        mimeTypes.Add(\"xsr\", \"video/x-amt-showrun\");\n        mimeTypes.Add(\"xwd\", \"image/x-xwd\");\n        mimeTypes.Add(\"xyz\", \"chemical/x-pdb\");\n        mimeTypes.Add(\"z\", \"application/x-compressed\");\n        mimeTypes.Add(\"zip\", \"application/zip\");\n        mimeTypes.Add(\"zsh\", \"text/x-script.zsh\");\n    }\n    #endregion\n\n    #region GetMimeType\n    /// <summary>\n    /// Gets the MIME-type of the file.\n    /// </summary>\n    /// <remarks>\n    /// Gets the MIME-type of the file based on the file extension.\n    /// </remarks>\n    /// <returns>The MIME-type.</returns>\n    /// <param name=\"fileName\">The file name.</param>\n    /// <exception>\n    ///     <cref>System.ArgumentNullException</cref>\n    ///     <paramref name=\"fileName\"/> is <c>null</c>.\n    /// </exception>\n    public static string GetMimeType(string fileName)\n    {\n        if (fileName == null)\n            throw new ArgumentNullException(nameof(fileName));\n\n        var dot = fileName.LastIndexOf('.');\n        string mimeType = null;\n\n        if (dot != -1 && fileName.Length > dot + 1)\n            mimeTypes.TryGetValue(fileName.Substring(dot + 1), out mimeType);\n\n        return mimeType ?? \"application/octet-stream\";\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/Stream.cs",
    "content": "﻿//\n// Stream.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing System.Text;\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains stream related helper methods\n/// </summary>\ninternal static class StreamUtility\n{\n    #region ToByteArray\n    /// <summary>\n    ///     Returns the stream as an byte array\n    /// </summary>\n    /// <param name=\"input\"></param>\n    /// <returns></returns>\n    internal static byte[] ToByteArray(this Stream input)\n    {\n        using (var memoryStream = new MemoryStream())\n        {\n            input.CopyTo(memoryStream);\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n\n    #region Eos\n    /// <summary>\n    ///     Returns true when the end of the <see cref=\"BinaryReader.BaseStream\" /> has been reached\n    /// </summary>\n    /// <param name=\"binaryReader\"></param>\n    /// <returns></returns>\n    internal static bool Eos(this BinaryReader binaryReader)\n    {\n        try\n        {\n            return binaryReader.BaseStream.Position >= binaryReader.BaseStream.Length;\n        }\n        catch (IOException)\n        {\n            return true;\n        }\n    }\n    #endregion\n\n    #region ReadLineAsBytes\n    /// <summary>\n    /// Read a line from the stream.\n    /// A line is interpreted as all the bytes read until a CRLF or LF is encountered.<br/>\n    /// CRLF pair or LF is not included in the string.\n    /// </summary>\n    /// <param name=\"stream\">The stream from which the line is to be read</param>\n    /// <returns>A line read from the stream returned as a byte array or <see langword=\"null\"/> if no bytes were readable from the stream</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"stream\"/> is <see langword=\"null\"/></exception>\n    public static byte[] ReadLineAsBytes(Stream stream)\n    {\n        if (stream == null)\n            throw new ArgumentNullException(nameof(stream));\n\n        using (var memoryStream = new MemoryStream())\n        {\n            while (true)\n            {\n                var justRead = stream.ReadByte();\n                if (justRead == -1 && memoryStream.Length > 0)\n                    break;\n\n                // Check if we started at the end of the stream we read from\n                // and we have not read anything from it yet\n                if (justRead == -1 && memoryStream.Length == 0)\n                    return null;\n\n                var readChar = (char)justRead;\n\n                // Do not write \\r or \\n\n                if (readChar != '\\r' && readChar != '\\n')\n                    memoryStream.WriteByte((byte)justRead);\n\n                // Last point in CRLF pair\n                if (readChar == '\\n')\n                    break;\n            }\n\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n\n    #region ReadLineAsAscii\n    /// <summary>\n    /// Read a line from the stream. <see cref=\"ReadLineAsBytes\"/> for more documentation.\n    /// </summary>\n    /// <param name=\"stream\">The stream to read from</param>\n    /// <returns>A line read from the stream or <see langword=\"null\"/> if nothing could be read from the stream</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"stream\"/> is <see langword=\"null\"/></exception>\n    public static string ReadLineAsAscii(Stream stream)\n    {\n        var readFromStream = ReadLineAsBytes(stream);\n        return readFromStream != null ? Encoding.ASCII.GetString(readFromStream) : null;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Helpers/Strings.cs",
    "content": "﻿//\n// Strings.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.IO;\nusing System.Text;\n\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit.Helpers;\n\n/// <summary>\n///     This class contains string related helper methods\n/// </summary>\ninternal static class Strings\n{\n    #region ReadNullTerminatedString\n    /// <summary>\n    ///     Reads from the <paramref name=\"binaryReader\"/> until a null terminated char is read\n    /// </summary>\n    /// <param name=\"binaryReader\"></param>\n    /// <param name=\"unicode\"></param>\n    /// <returns></returns>\n    public static string ReadNullTerminatedString(BinaryReader binaryReader, bool unicode = true)\n    {\n        return unicode\n            ? ReadNullTerminatedUnicodeString(binaryReader)\n            : ReadNullTerminatedAsciiString(binaryReader);\n    }\n    #endregion\n\n    #region ReadNullTerminatedString\n    /// <summary>\n    ///     Reads from the <paramref name=\"binaryReader\"/> until a null terminated char is read\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\" /></param>\n    /// <returns></returns>\n    public static string ReadNullTerminatedAsciiString(BinaryReader binaryReader)\n    {\n        var result = new MemoryStream();\n\n        var b = binaryReader.ReadByte();\n        while (b != 0)\n        {\n            result.WriteByte(b);\n            b = binaryReader.ReadByte();\n        }\n\n        return Encoding.ASCII.GetString(result.ToArray());\n    }\n    #endregion\n\n    #region ReadNullTerminatedUnicodeString\n    /// <summary>\n    ///     Reads from the <paramref name=\"binaryReader\"/> until a null terminated char is read\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\" /></param>\n    /// <returns></returns>\n    public static string ReadNullTerminatedUnicodeString(BinaryReader binaryReader)\n    {\n        var result = new MemoryStream();\n\n        var b = binaryReader.ReadBytes(2);\n        while (b[0] != 0 && b[1] != 0)\n        {\n            result.WriteByte(b[0]);\n            result.WriteByte(b[2]);\n            b = binaryReader.ReadBytes(2);\n        }\n\n        return Encoding.Unicode.GetString(result.ToArray());\n    }\n    #endregion\n\n    #region WriteNullTerminatedString\n    /// <summary>\n    ///     Writes the given <paramref name=\"str\"/> to the <paramref name=\"binaryWriter\"/>\n    /// </summary>\n    /// <param name=\"binaryWriter\"></param>\n    /// <param name=\"str\">The string to write</param>\n    /// <param name=\"unicode\"></param>\n    public static void WriteNullTerminatedString(BinaryWriter binaryWriter,\n        string str,\n        bool unicode = true)\n    {\n        if (unicode)\n            WriteNullTerminatedUnicodeString(binaryWriter, str);\n        else\n            WriteNullTerminatedAsciiString(binaryWriter, str);\n    }\n    #endregion\n\n    #region WriteNullTerminatedString\n/// <summary>\n///     Writes the given <paramref name=\"str\"/> to the <paramref name=\"binaryWriter\"/>\n/// </summary>\n/// <param name=\"binaryWriter\"></param>\n/// <param name=\"str\">The string to write</param>\npublic static void WriteNullTerminatedAsciiString(BinaryWriter binaryWriter, string str)\n{\nvar unicode = Encoding.Unicode.GetBytes(str);\nvar ascii = Encoding.ASCII.GetString(unicode);\nbinaryWriter.Write(ascii);\nbinaryWriter.Write(0x00);\n}\n#endregion\n\n    #region WriteNullTerminatedUnicodeString\n    /// <summary>\n    ///     Writes the given <paramref name=\"str\"/> to the <paramref name=\"binaryWriter\"/>\n    /// </summary>\n    /// <param name=\"binaryWriter\"></param>\n    /// <param name=\"str\">The string to write</param>\n    public static void WriteNullTerminatedUnicodeString(BinaryWriter binaryWriter, string str)\n    {\n        var bytes = Encoding.Unicode.GetBytes(str);\n        binaryWriter.Write(bytes);\n        binaryWriter.Write(new byte[2]);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Message.cs",
    "content": "﻿//\n// Message.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing MsgKit.Enums;\nusing MsgKit.Exceptions;\nusing MsgKit.Helpers;\nusing MsgKit.Streams;\nusing OpenMcdf;\nusing Version = OpenMcdf.Version;\n\n// ReSharper disable UnusedMember.Global\n\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit;\n\n/// <summary>\n///     The base class for all the different types of Outlook MSG files\n/// </summary>\npublic class Message : IDisposable\n{\n    #region Fields\n    /// <summary>\n    ///     A flag to keep track if the message already has been saved\n    /// </summary>\n    private bool _saved;\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     The <see cref=\"CompoundFile\" />\n    /// </summary>\n    internal RootStorage CompoundFile { get; }\n\n    /// <summary>\n    ///     The <see cref=\"MessageClass\"/>\n    /// </summary>\n    internal MessageClass Class = MessageClass.Unknown;\n\n    /// <summary>\n    ///     Returns <see cref=\"Class\"/> as a string that is written into the MSG file\n    /// </summary>\n    private string ClassAsString\n    {\n        get\n        {\n            switch (Class)\n            {\n                case MessageClass.Unknown:\n                    throw new ArgumentException(\"Class field is not set\");\n                case MessageClass.IPM_Note:\n                    return \"IPM.Note\";\n                case MessageClass.IPM_Note_SMIME:\n                    return \"IPM.Note.SMIME\";\n                case MessageClass.IPM_Note_SMIME_MultipartSigned:\n                    return \"IPM.Note.SMIME.MultipartSigned\";\n                case MessageClass.IPM_Note_Receipt_SMIME:\n                    return \"IPM.Note.Receipt.SMIME\";\n                case MessageClass.IPM_Post:\n                    return \"IPM.Post\";\n                case MessageClass.IPM_Octel_Voice:\n                    return \"IPM.Octel.Voice\";\n                case MessageClass.IPM_Voicenotes:\n                    return \"IPM.Voicenotes\";\n                case MessageClass.IPM_Sharing:\n                    return \"IPM.Sharing\";\n                case MessageClass.REPORT_IPM_NOTE_NDR:\n                    return \"REPORT.IPM.NOTE.NDR\";\n                case MessageClass.REPORT_IPM_NOTE_DR:\n                    return \"REPORT.IPM.NOTE.DR\";\n                case MessageClass.REPORT_IPM_NOTE_DELAYED:\n                    return \"REPORT.IPM.NOTE.DELAYED\";\n                case MessageClass.REPORT_IPM_NOTE_IPNRN:\n                    return \"*REPORT.IPM.NOTE.IPNRN\";\n                case MessageClass.REPORT_IPM_NOTE_IPNNRN:\n                    return \"*REPORT.IPM.NOTE.IPNNRN\";\n                case MessageClass.REPORT_IPM_SCHEDULE_MEETING_REQUEST_NDR:\n                    return \"REPORT.IPM.SCHEDULE. MEETING.REQUEST.NDR\";\n                case MessageClass.REPORT_IPM_SCHEDULE_MEETING_RESP_POS_NDR:\n                    return \"REPORT.IPM.SCHEDULE.MEETING.RESP.POS.NDR\";\n                case MessageClass.REPORT_IPM_SCHEDULE_MEETING_RESP_TENT_NDR:\n                    return \"REPORT.IPM.SCHEDULE.MEETING.RESP.TENT.NDR\";\n                case MessageClass.REPORT_IPM_SCHEDULE_MEETING_CANCELED_NDR:\n                    return \"REPORT.IPM.SCHEDULE.MEETING.CANCELED.NDR\";\n                case MessageClass.REPORT_IPM_NOTE_SMIME_NDR:\n                    return \"REPORT.IPM.NOTE.SMIME.NDR\";\n                case MessageClass.REPORT_IPM_NOTE_SMIME_DR:\n                    return \"*REPORT.IPM.NOTE.SMIME.DR\";\n                case MessageClass.REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_NDR:\n                    return \"*REPORT.IPM.NOTE.SMIME.MULTIPARTSIGNED.NDR\";\n                case MessageClass.REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_DR:\n                    return \"*REPORT.IPM.NOTE.SMIME.MULTIPARTSIGNED.DR\";\n                case MessageClass.IPM_Appointment:\n                    return \"IPM.Appointment\";\n                case MessageClass.IPM_Task:\n                    return \"IPM.Task\";\n                case MessageClass.IPM_Contact:\n                    return \"IPM.Contact\";\n\n                default:\n                    throw new ArgumentOutOfRangeException();\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Contains a number that indicates which icon to use when you display a group\n    ///     of e-mail objects. Default set to <see cref=\"MessageIconIndex.NewMail\" />\n    /// </summary>\n    /// <remarks>\n    ///     This property, if it exists, is a hint to the client. The client may ignore the\n    ///     value of this property.\n    /// </remarks>\n    public MessageIconIndex IconIndex { get; set; }\n\n    /// <summary>\n    ///     The size of the message\n    /// </summary>\n    public long MessageSize { get; internal set; }\n\n    /// <summary>\n    ///     The <see cref=\"TopLevelProperties\"/>\n    /// </summary>\n    internal readonly TopLevelProperties TopLevelProperties;\n\n    /// <summary>\n    ///     The <see cref=\"NamedProperties\"/>\n    /// </summary>\n    internal readonly NamedProperties NamedProperties;\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's properties\n    /// </summary>\n    internal Message()\n    {\n        CompoundFile = RootStorage.CreateInMemory(Version.V3, StorageModeFlags.Transacted);\n\n        // In the preceding figure, the \"__nameid_version1.0\" named property mapping storage contains the \n        // three streams  used to provide a mapping from property ID to property name \n        // (\"__substg1.0_00020102\", \"__substg1.0_00030102\", and \"__substg1.0_00040102\") and various other \n        // streams that provide a mapping from property names to property IDs.\n        var nameIdStorage = CompoundFile.GetStorage(PropertyTags.NameIdStorage);\n        using var entryStream = nameIdStorage.CreateStream(PropertyTags.EntryStream);\n        entryStream.Write([], 0, 0);\n        using var stringStream = nameIdStorage.CreateStream(PropertyTags.StringStream);\n        stringStream.Write([], 0, 0);\n        using var guidStream = nameIdStorage.CreateStream(PropertyTags.GuidStream);\n        guidStream.Write([], 0, 0);\n\n        TopLevelProperties = [];\n        NamedProperties = new NamedProperties(TopLevelProperties);\n    }\n    #endregion\n\n    #region Save\n    private void Save()\n    {\n        TopLevelProperties.AddProperty(PropertyTags.PR_MESSAGE_CLASS_W, ClassAsString);\n        TopLevelProperties.WriteProperties(CompoundFile, MessageSize);\n        NamedProperties.WriteProperties(CompoundFile);\n        _saved = true;\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"fileName\" />\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    internal void Save(string fileName)\n    {\n        Save();\n        CompoundFile.Commit();\n        CompoundFile.SwitchTo(fileName);\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"stream\" />\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    internal void Save(Stream stream)\n    {\n        Save();\n        CompoundFile.Commit();\n\n        var baseStreamPosition = CompoundFile.BaseStream.Position;\n        CompoundFile.BaseStream.Position = 0;\n        CompoundFile.BaseStream.CopyTo(stream);\n        CompoundFile.BaseStream.Position = baseStreamPosition;\n    }\n    #endregion\n\n    #region AddProperty\n    /// <summary>\n    ///     Adds a custom property to the message or replaces it when it already exists\n    /// </summary>\n    /// <param name=\"property\"><see cref=\"PropertyTags.PropertyTag\"/></param>\n    /// <param name=\"value\">The value of the property</param>\n    /// <param name=\"flags\"><see cref=\"PropertyFlags\"/></param>\n    /// <exception cref=\"MKMessageSaved\">Raised when the message has already been saved with the Save method</exception>\n    public void AddProperty(PropertyTags.PropertyTag property, object value, PropertyFlags flags = PropertyFlags.PROPATTR_WRITABLE)\n    {\n        if (_saved)\n            throw new MKMessageSaved(\"The message can't be modified when it already has been saved\");\n\n        TopLevelProperties.AddOrReplaceProperty(property, value, flags);\n    }\n    #endregion\n\n    #region AddNamedProperty\n    /// <summary>\n    ///     Adds a custom named property to the message or replaces it when it already exists\n    /// </summary>\n    /// <param name=\"namedProperty\"><see cref=\"NamedPropertyTag\"/></param>\n    /// <param name=\"value\">The value of the property</param>\n    /// <exception cref=\"MKMessageSaved\">Raised when the message has already been saved with the Save method</exception>\n    public void AddProperty(NamedPropertyTag namedProperty, object value)\n    {\n        if (_saved)\n            throw new MKMessageSaved(\"The message can't be modified when it already has been saved\");\n\n        NamedProperties.AddProperty(namedProperty, value);\n    }\n    #endregion\n\n    #region Dispose\n    /// <summary>\n    ///     Disposes this object and all its resources\n    /// </summary>\n    public void Dispose()\n    {\n        CompoundFile?.Dispose();\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/Base64.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Utility class for dealing with Base64 encoded strings\n/// </summary>\ninternal static class Base64\n{\n    #region Decode\n    /// <summary>\n    ///     Decodes a base64 encoded string into the bytes it describes\n    /// </summary>\n    /// <param name=\"base64Encoded\">The string to decode</param>\n    /// <returns>A byte array that the base64 string described</returns>\n    public static byte[] Decode(string base64Encoded)\n    {\n        try\n        {\n            using (var memoryStream = new MemoryStream())\n            {\n                base64Encoded = base64Encoded.Replace(\"\\r\\n\", \"\");\n                base64Encoded = base64Encoded.Replace(\"\\t\", \"\");\n                base64Encoded = base64Encoded.Replace(\" \", \"\");\n\n                var inputBytes = Encoding.ASCII.GetBytes(base64Encoded);\n\n                using (var transform = new FromBase64Transform(FromBase64TransformMode.DoNotIgnoreWhiteSpaces))\n                {\n                    var outputBytes = new byte[transform.OutputBlockSize];\n\n                    // Transform the data in chunks the size of InputBlockSize.\n                    const int inputBlockSize = 4;\n                    var currentOffset = 0;\n                    while (inputBytes.Length - currentOffset > inputBlockSize)\n                    {\n                        transform.TransformBlock(inputBytes, currentOffset, inputBlockSize, outputBytes, 0);\n                        currentOffset += inputBlockSize;\n                        memoryStream.Write(outputBytes, 0, transform.OutputBlockSize);\n                    }\n\n                    // Transform the final block of data.\n                    outputBytes = transform.TransformFinalBlock(inputBytes, currentOffset,\n                        inputBytes.Length - currentOffset);\n                    memoryStream.Write(outputBytes, 0, outputBytes.Length);\n                }\n\n                return memoryStream.ToArray();\n            }\n        }\n        catch (Exception)\n        {\n            return new byte[0];\n        }\n    }\n\n    /// <summary>\n    ///     Decodes a Base64 encoded string using a specified <see cref=\"System.Text.Encoding\" />\n    /// </summary>\n    /// <param name=\"base64Encoded\">Source string to decode</param>\n    /// <param name=\"encoding\">The encoding to use for the decoded byte array that <paramref name=\"base64Encoded\" /> describes</param>\n    /// <returns>A decoded string</returns>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     If <paramref name=\"base64Encoded\" /> or <paramref name=\"encoding\" /> is\n    ///     <see langword=\"null\" />\n    /// </exception>\n    /// <exception cref=\"FormatException\">If <paramref name=\"base64Encoded\" /> is not a valid base64 encoded string</exception>\n    public static string Decode(string base64Encoded, Encoding encoding)\n    {\n        if (base64Encoded == null)\n            throw new ArgumentNullException(nameof(base64Encoded));\n\n        if (encoding == null)\n            throw new ArgumentNullException(nameof(encoding));\n\n        try\n        {\n            return encoding.GetString(Decode(base64Encoded));\n        }\n        catch (FormatException)\n        {\n            return string.Empty;\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/EncodedWord.cs",
    "content": "﻿using System;\nusing System.Text.RegularExpressions;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Utility class for dealing with encoded word strings<br />\n///     <br />\n///     EncodedWord encoded strings are only in ASCII, but can embed information\n///     about characters in other character sets.<br />\n///     <br />\n///     It is done by specifying the character set, an encoding that maps from ASCII to\n///     the correct bytes and the actual encoded string.<br />\n///     <br />\n///     It is specified in a format that is best summarized by a BNF:<br />\n///     <c>\"=?\" character_set \"?\" encoding \"?\" encoded-text \"?=\"</c><br />\n/// </summary>\n/// <example>\n///     <c>=?ISO-8859-1?Q?=2D?=</c>\n///     Here <c>ISO-8859-1</c> is the character set.<br />\n///     <c>Q</c> is the encoding method (quoted-printable). <c>B</c> is also supported (Base 64).<br />\n///     The encoded text is the <c>=2D</c> part which is decoded to a space.\n/// </example>\ninternal static class EncodedWord\n{\n    #region Decode\n    /// <summary>\n    ///     Decode text that is encoded with the <see cref=\"EncodedWord\" /> encoding.<br />\n    ///     <br />\n    ///     This method will decode any encoded-word found in the string.<br />\n    ///     All parts which is not encoded will not be touched.<br />\n    ///     <br />\n    ///     From <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>:<br />\n    ///     <code>\n    ///  Generally, an \"encoded-word\" is a sequence of printable ASCII\n    ///  characters that begins with \"=?\", ends with \"?=\", and has two \"?\"s in\n    ///  between.  It specifies a character set and an encoding method, and\n    ///  also includes the original text encoded as graphic ASCII characters,\n    ///  according to the rules for that encoding method.\n    ///  </code>\n    ///     Example:<br />\n    ///     <c>=?ISO-8859-1?q?this=20is=20some=20text?= other text here</c>\n    /// </summary>\n    /// <remarks>\n    ///     See <a href=\"http://tools.ietf.org/html/rfc2047#section-2\">RFC 2047 section 2</a> \"Syntax of encoded-words\"\n    ///     for more details\n    /// </remarks>\n    /// <param name=\"encodedWords\">Source text. May be content which is not encoded.</param>\n    /// <returns>Decoded text</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"encodedWords\" /> is <see langword=\"null\" /></exception>\n    public static string Decode(string encodedWords)\n    {\n        if (encodedWords == null)\n            throw new ArgumentNullException(nameof(encodedWords));\n\n        // Notice that RFC2231 redefines the BNF to\n        // encoded-word := \"=?\" charset [\"*\" language] \"?\" encoded-text \"?=\"\n        // but no usage of this BNF have been spotted yet. It is here to\n        // ease debugging if such a case is discovered.\n\n        // This is the regex that should fit the BNF\n        // RFC Says that NO WHITESPACE is allowed in this encoding, but there are examples\n        // where whitespace is there, and therefore this regex allows for such.\n        const string encodedWordRegex = @\"\\=\\?(?<Charset>\\S+?)\\?(?<Encoding>\\w)\\?(?<Content>.*?)\\?\\=\";\n        // \\w\tMatches any word character including underscore. Equivalent to \"[A-Za-z0-9_]\".\n        // \\S\tMatches any nonwhite space character. Equivalent to \"[^ \\f\\n\\r\\t\\v]\".\n        // +?   non-greedy equivalent to +\n        // (?<NAME>REGEX) is a named group with name NAME and regular expression REGEX\n\n        // Any amount of linear-space-white between 'encoded-word's,\n        // even if it includes a CRLF followed by one or more SPACEs,\n        // is ignored for the purposes of display.\n        // http://tools.ietf.org/html/rfc2047#page-12\n        // Define a regular expression that captures two encoded words with some whitespace between them\n        const string replaceRegex = @\"(?<first>\" + encodedWordRegex + @\")\\s+(?<second>\" + encodedWordRegex + \")\";\n\n        // Then, find an occurrence of such an expression, but remove the whitespace in between when found\n        // Need to be done twice for encodings such as \"=?UTF-8?Q?a?= =?UTF-8?Q?b?= =?UTF-8?Q?c?=\"\n        // to be replaced correctly\n        encodedWords = Regex.Replace(encodedWords, replaceRegex, \"${first}${second}\");\n        encodedWords = Regex.Replace(encodedWords, replaceRegex, \"${first}${second}\");\n\n        var decodedWords = encodedWords;\n\n        var matches = Regex.Matches(encodedWords, encodedWordRegex);\n        foreach (Match match in matches)\n        {\n            // If this match was not a success, we should not use it\n            if (!match.Success) continue;\n\n            var fullMatchValue = match.Value;\n\n            var encodedText = match.Groups[\"Content\"].Value;\n            var encoding = match.Groups[\"Encoding\"].Value;\n            var charset = match.Groups[\"Charset\"].Value;\n\n            // Get the encoding which corresponds to the character set\n            var charsetEncoding = EncodingFinder.FindEncoding(charset);\n\n            // Store decoded text here when done\n            string decodedText;\n\n            // Encoding may also be written in lowercase\n            switch (encoding.ToUpperInvariant())\n            {\n                // RFC:\n                // The \"B\" encoding is identical to the \"BASE64\" \n                // encoding defined by RFC 2045.\n                // http://tools.ietf.org/html/rfc2045#section-6.8\n                case \"B\":\n                    decodedText = Base64.Decode(encodedText, charsetEncoding);\n                    break;\n\n                // RFC:\n                // The \"Q\" encoding is similar to the \"Quoted-Printable\" content-\n                // transfer-encoding defined in RFC 2045.\n                // There are more details to this. Please check\n                // http://tools.ietf.org/html/rfc2047#section-4.2\n                // \n                case \"Q\":\n                    decodedText = QuotedPrintable.DecodeEncodedWord(encodedText, charsetEncoding);\n                    break;\n\n                default:\n                    throw new ArgumentException(\"The encoding \" + encoding + \" was not recognized\");\n            }\n\n            // Replace our encoded value with our decoded value\n            decodedWords = decodedWords.Replace(fullMatchValue, decodedText);\n        }\n\n        return decodedWords;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/EncodingFinder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Utility class used by OpenPop for mapping from a characterSet to an <see cref=\"Encoding\" />.<br />\n///     <br />\n///     The functionality of the class can be altered by adding mappings\n///     using <see cref=\"AddMapping\" /> and by adding a <see cref=\"FallbackDecoder\" />.<br />\n///     <br />\n///     Given a characterSet, it will try to find the Encoding as follows:\n///     <list type=\"number\">\n///         <item>\n///             <description>\n///                 If a mapping for the characterSet was added, use the specified Encoding from there. Mappings\n///                 can be added using <see cref=\"AddMapping\" />.\n///             </description>\n///         </item>\n///         <item>\n///             <description>\n///                 Try to parse the characterSet and look it up using <see cref=\"Encoding.GetEncoding(int)\" />\n///                 for codepages or <see cref=\"Encoding.GetEncoding(string)\" /> for named encodings.\n///             </description>\n///         </item>\n///         <item>\n///             <description>\n///                 If an encoding is not found yet, use the <see cref=\"FallbackDecoder\" /> if defined. The\n///                 <see cref=\"FallbackDecoder\" /> is user defined.\n///             </description>\n///         </item>\n///     </list>\n/// </summary>\npublic static class EncodingFinder\n{\n    #region Constructor\n    /// <summary>\n    ///     Initialize the EncodingFinder\n    /// </summary>\n    static EncodingFinder()\n    {\n        Reset();\n    }\n    #endregion\n\n    #region Reset\n    /// <summary>\n    ///     Used to reset this static class to facilite isolated unit testing.\n    /// </summary>\n    internal static void Reset()\n    {\n        EncodingMap = new Dictionary<string, Encoding>();\n        FallbackDecoder = null;\n\n        // Some emails incorrectly specify the encoding as utf8, but it should have been utf-8.\n        AddMapping(\"utf8\", Encoding.UTF8);\n        AddMapping(\"binary\", Encoding.ASCII);\n    }\n    #endregion\n\n    #region FindEncoding\n    /// <summary>\n    ///     Parses a character set into an encoding.\n    /// </summary>\n    /// <param name=\"characterSet\">The character set to parse</param>\n    /// <returns>An encoding which corresponds to the character set</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"characterSet\" /> is <see langword=\"null\" /></exception>\n    internal static Encoding FindEncoding(string characterSet)\n    {\n        if (characterSet == null)\n            throw new ArgumentNullException(nameof(characterSet));\n\n        var charSetUpper = characterSet.ToUpperInvariant();\n\n        // Check if the characterSet is explicitly mapped to an encoding\n        if (EncodingMap.ContainsKey(charSetUpper))\n            return EncodingMap[charSetUpper];\n\n        // Try to generally find the encoding\n        try\n        {\n            if (!charSetUpper.Contains(\"WINDOWS\") && !charSetUpper.Contains(\"CP\"))\n                return Encoding.GetEncoding(characterSet);\n            // It seems the characterSet contains an codepage value, which we should use to parse the encoding\n            charSetUpper = charSetUpper.Replace(\"CP\", \"\"); // Remove cp\n            charSetUpper = charSetUpper.Replace(\"WINDOWS\", \"\"); // Remove windows\n            charSetUpper = charSetUpper.Replace(\"-\", \"\"); // Remove - which could be used as cp-1554\n\n            // Now we hope the only thing left in the characterSet is numbers.\n            var codepageNumber = int.Parse(charSetUpper, CultureInfo.InvariantCulture);\n\n            return Encoding.GetEncoding(codepageNumber);\n\n            // It seems there is no codepage value in the characterSet. It must be a named encoding\n        }\n        catch (ArgumentException)\n        {\n            // The encoding could not be found generally. \n            // Try to use the FallbackDecoder if it is defined.\n\n            // Check if it is defined\n            if (FallbackDecoder == null)\n                throw; // It was not defined - throw catched exception\n\n            // Use the FallbackDecoder\n            var fallbackDecoderResult = FallbackDecoder(characterSet);\n\n            // Check if the FallbackDecoder had a solution\n            if (fallbackDecoderResult != null)\n                return fallbackDecoderResult;\n\n            // If no solution was found, throw catched exception\n            throw;\n        }\n    }\n    #endregion\n\n    #region AddMapping\n    /// <summary>\n    ///     Puts a mapping from <paramref name=\"characterSet\" /> to <paramref name=\"encoding\" />\n    ///     into the <see cref=\"EncodingFinder\" />'s internal mapping Dictionary.\n    /// </summary>\n    /// <param name=\"characterSet\">The string that maps to the <paramref name=\"encoding\" /></param>\n    /// <param name=\"encoding\">The <see cref=\"Encoding\" /> that should be mapped from <paramref name=\"characterSet\" /></param>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"characterSet\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"encoding\" /> is <see langword=\"null\" /></exception>\n    public static void AddMapping(string characterSet, Encoding encoding)\n    {\n        if (characterSet == null)\n            throw new ArgumentNullException(nameof(characterSet));\n\n        if (encoding == null)\n            throw new ArgumentNullException(nameof(encoding));\n\n        // Add the mapping using uppercase\n        EncodingMap.Add(characterSet.ToUpperInvariant(), encoding);\n    }\n    #endregion\n\n    #region Proprties\n    /// <summary>\n    ///     Delegate that is used when the EncodingFinder is unable to find an encoding by\n    ///     using the <see cref=\"EncodingFinder.EncodingMap\" /> or general code.<br />\n    ///     This is used as a last resort and can be used for setting a default encoding or\n    ///     for finding an encoding on runtime for some <paramref name=\"characterSet\" />.\n    /// </summary>\n    /// <param name=\"characterSet\">The character set to find an encoding for.</param>\n    /// <returns>An encoding for the <paramref name=\"characterSet\" /> or <see langword=\"null\" /> if none could be found.</returns>\n    public delegate Encoding FallbackDecoderDelegate(string characterSet);\n\n    /// <summary>\n    ///     Last resort decoder.\n    /// </summary>\n    public static FallbackDecoderDelegate FallbackDecoder { private get; set; }\n\n    /// <summary>\n    ///     Mapping from charactersets to encodings.\n    /// </summary>\n    private static Dictionary<string, Encoding> EncodingMap { get; set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/QuotedPrintable.cs",
    "content": "using System;\nusing System.IO;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Used for decoding Quoted-Printable text.<br />\n///     This is a robust implementation of a Quoted-Printable decoder defined in\n///     <a href=\"http://tools.ietf.org/html/rfc2045\">RFC 2045</a> and\n///     <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>.<br />\n///     Every measurement has been taken to conform to the RFC.\n/// </summary>\ninternal static class QuotedPrintable\n{\n    #region DecodeEncodedWord\n    /// <summary>\n    ///     Decodes a Quoted-Printable string according to <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>.<br />\n    ///     RFC 2047 is used for decoding Encoded-Word encoded strings.\n    /// </summary>\n    /// <param name=\"toDecode\">Quoted-Printable encoded string</param>\n    /// <param name=\"encoding\">Specifies which encoding the returned string will be in</param>\n    /// <returns>A decoded string in the correct encoding</returns>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     If <paramref name=\"toDecode\" /> or <paramref name=\"encoding\" /> is\n    ///     <see langword=\"null\" />\n    /// </exception>\n    public static string DecodeEncodedWord(string toDecode, Encoding encoding)\n    {\n        if (toDecode == null)\n            throw new ArgumentNullException(nameof(toDecode));\n\n        if (encoding == null)\n            throw new ArgumentNullException(nameof(encoding));\n\n        // Decode the QuotedPrintable string and return it\n        return encoding.GetString(Rfc2047QuotedPrintableDecode(toDecode, true));\n    }\n    #endregion\n\n    #region DecodeContentTransferEncoding\n    /// <summary>\n    ///     Decodes a Quoted-Printable string according to <a href=\"http://tools.ietf.org/html/rfc2045\">RFC 2045</a>.<br />\n    ///     RFC 2045 specifies the decoding of a body encoded with Content-Transfer-Encoding of quoted-printable.\n    /// </summary>\n    /// <param name=\"toDecode\">Quoted-Printable encoded string</param>\n    /// <returns>A decoded byte array that the Quoted-Printable encoded string described</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"toDecode\" /> is <see langword=\"null\" /></exception>\n    public static byte[] DecodeContentTransferEncoding(string toDecode)\n    {\n        if (toDecode == null)\n            throw new ArgumentNullException(nameof(toDecode));\n\n        // Decode the QuotedPrintable string and return it\n        return Rfc2047QuotedPrintableDecode(toDecode, false);\n    }\n    #endregion\n\n    #region Rfc2047QuotedPrintableDecode\n    /// <summary>\n    ///     This is the actual decoder.\n    /// </summary>\n    /// <param name=\"toDecode\">The string to be decoded from Quoted-Printable</param>\n    /// <param name=\"encodedWordVariant\">\n    ///     If <see langword=\"true\" />, specifies that RFC 2047 quoted printable decoding is used.<br />\n    ///     This is for quoted-printable encoded words<br />\n    ///     <br />\n    ///     If <see langword=\"false\" />, specifies that RFC 2045 quoted printable decoding is used.<br />\n    ///     This is for quoted-printable Content-Transfer-Encoding\n    /// </param>\n    /// <returns>A decoded byte array that was described by <paramref name=\"toDecode\" /></returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"toDecode\" /> is <see langword=\"null\" /></exception>\n    /// <remarks>See <a href=\"http://tools.ietf.org/html/rfc2047#section-4.2\">RFC 2047 section 4.2</a> for RFC details</remarks>\n    private static byte[] Rfc2047QuotedPrintableDecode(string toDecode, bool encodedWordVariant)\n    {\n        if (toDecode == null)\n            throw new ArgumentNullException(nameof(toDecode));\n\n        // Create a byte array builder which is roughly equivalent to a StringBuilder\n        using (var byteArrayBuilder = new MemoryStream())\n        {\n            // Remove illegal control characters\n            toDecode = RemoveIllegalControlCharacters(toDecode);\n\n            // Run through the whole string that needs to be decoded\n            for (var i = 0; i < toDecode.Length; i++)\n            {\n                var currentChar = toDecode[i];\n                if (currentChar == '=')\n                {\n                    // Check that there is at least two characters behind the equal sign\n                    if (toDecode.Length - i < 3)\n                    {\n                        // We are at the end of the toDecode string, but something is missing. Handle it the way RFC 2045 states\n                        WriteAllBytesToStream(byteArrayBuilder,\n                            DecodeEqualSignNotLongEnough(toDecode.Substring(i)));\n\n                        // Since it was the last part, we should stop parsing anymore\n                        break;\n                    }\n\n                    // Decode the Quoted-Printable part\n                    var quotedPrintablePart = toDecode.Substring(i, 3);\n                    WriteAllBytesToStream(byteArrayBuilder, DecodeEqualSign(quotedPrintablePart));\n\n                    // We now consumed two extra characters. Go forward two extra characters\n                    i += 2;\n                }\n                else\n                {\n                    // This character is not quoted printable hex encoded.\n\n                    // Could it be the _ character, which represents space\n                    // and are we using the encoded word variant of QuotedPrintable\n                    if (currentChar == '_' && encodedWordVariant)\n                        byteArrayBuilder.WriteByte(0x20);\n                    else\n                        byteArrayBuilder.WriteByte((byte)currentChar);\n                }\n            }\n\n            return byteArrayBuilder.ToArray();\n        }\n    }\n    #endregion\n\n    #region WriteAllBytesToStream\n    /// <summary>\n    ///     Writes all bytes in a byte array to a stream\n    /// </summary>\n    /// <param name=\"stream\">The stream to write to</param>\n    /// <param name=\"toWrite\">The bytes to write to the <paramref name=\"stream\" /></param>\n    private static void WriteAllBytesToStream(Stream stream, byte[] toWrite)\n    {\n        stream.Write(toWrite, 0, toWrite.Length);\n    }\n    #endregion\n\n    #region RemoveIllegalControlCharacters\n    /// <summary>\n    ///     RFC 2045 states about robustness:<br />\n    ///     <code>\n    /// Control characters other than TAB, or CR and LF as parts of CRLF pairs,\n    /// must not appear. The same is true for octets with decimal values greater\n    /// than 126.  If found in incoming quoted-printable data by a decoder, a\n    /// robust implementation might exclude them from the decoded data and warn\n    /// the user that illegal characters were discovered.\n    /// </code>\n    ///     Control characters are defined in RFC 2396 as<br />\n    ///     <c>control = US-ASCII coded characters 00-1F and 7F hexadecimal</c>\n    /// </summary>\n    /// <param name=\"input\">String to be stripped from illegal control characters</param>\n    /// <returns>A string with no illegal control characters</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"input\" /> is <see langword=\"null\" /></exception>\n    private static string RemoveIllegalControlCharacters(string input)\n    {\n        if (input == null)\n            throw new ArgumentNullException(nameof(input));\n\n        // First we remove any \\r or \\n which is not part of a \\r\\n pair\n        input = RemoveCarriageReturnAndNewLinewIfNotInPair(input);\n\n        // Here only legal \\r\\n is left over\n        // We now simply keep them, and the \\t which is also allowed\n        // \\x0A = \\n\n        // \\x0D = \\r\n        // \\x09 = \\t)\n        return Regex.Replace(input, \"[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]\", \"\");\n    }\n    #endregion\n\n    #region RemoveCarriageReturnAndNewLinewIfNotInPair\n    /// <summary>\n    ///     This method will remove any \\r and \\n which is not paired as \\r\\n\n    /// </summary>\n    /// <param name=\"input\">String to remove lonely \\r and \\n's from</param>\n    /// <returns>A string without lonely \\r and \\n's</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"input\" /> is <see langword=\"null\" /></exception>\n    private static string RemoveCarriageReturnAndNewLinewIfNotInPair(string input)\n    {\n        if (input == null)\n            throw new ArgumentNullException(nameof(input));\n\n        // Use this for building up the new string. This is used for performance instead\n        // of altering the input string each time a illegal token is found\n        var newString = new StringBuilder(input.Length);\n\n        for (var i = 0; i < input.Length; i++)\n            // There is a character after it\n            // Check for lonely \\r\n            // There is a lonely \\r if it is the last character in the input or if there\n            // is no \\n following it\n            if (input[i] == '\\r' && (i + 1 >= input.Length || input[i + 1] != '\\n'))\n            {\n                // Illegal token \\r found. Do not add it to the new string\n\n                // Check for lonely \\n\n                // There is a lonely \\n if \\n is the first character or if there\n                // is no \\r in front of it\n            }\n            else if (input[i] == '\\n' && (i - 1 < 0 || input[i - 1] != '\\r'))\n            {\n                // Illegal token \\n found. Do not add it to the new string\n            }\n            else\n            {\n                // No illegal tokens found. Simply insert the character we are at\n                // in our new string\n                newString.Append(input[i]);\n            }\n\n        return newString.ToString();\n    }\n    #endregion\n\n    #region DecodeEqualSignNotLongEnough\n    /// <summary>\n    ///     RFC 2045 says that a robust implementation should handle:<br />\n    ///     <code>\n    /// An \"=\" cannot be the ultimate or penultimate character in an encoded\n    /// object. This could be handled as in case (2) above.\n    /// </code>\n    ///     Case (2) is:<br />\n    ///     <code>\n    /// An \"=\" followed by a character that is neither a\n    /// hexadecimal digit (including \"abcdef\") nor the CR character of a CRLF pair\n    /// is illegal.  This case can be the result of US-ASCII text having been\n    /// included in a quoted-printable part of a message without itself having\n    /// been subjected to quoted-printable encoding.  A reasonable approach by a\n    /// robust implementation might be to include the \"=\" character and the\n    /// following character in the decoded data without any transformation and, if\n    /// possible, indicate to the user that proper decoding was not possible at\n    /// this point in the data.\n    /// </code>\n    /// </summary>\n    /// <param name=\"decode\">\n    ///     The string to decode which cannot have length above or equal to 3\n    ///     and must start with an equal sign.\n    /// </param>\n    /// <returns>A decoded byte array</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"decode\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentException\">\n    ///     Thrown if a the <paramref name=\"decode\" /> parameter has length above 2 or does not\n    ///     start with an equal sign.\n    /// </exception>\n    private static byte[] DecodeEqualSignNotLongEnough(string decode)\n    {\n        if (decode == null)\n            throw new ArgumentNullException(nameof(decode));\n\n        // We can only decode wrong length equal signs\n        if (decode.Length >= 3)\n            throw new ArgumentException(@\"decode must have length lower than 3\", nameof(decode));\n\n        if (decode.Length <= 0)\n            throw new ArgumentException(@\"decode must have length lower at least 1\", nameof(decode));\n\n        // First char must be =\n        if (decode[0] != '=')\n            throw new ArgumentException(@\"First part of decode must be an equal sign\", nameof(decode));\n\n        // We will now believe that the string sent to us, was actually not encoded\n        // Therefore it must be in US-ASCII and we will return the bytes it corrosponds to\n        return Encoding.ASCII.GetBytes(decode);\n    }\n    #endregion\n\n    #region DecodeEqualSign\n    /// <summary>\n    ///     This helper method will decode a string of the form \"=XX\" where X is any character.<br />\n    ///     This method will never fail, unless an argument of length not equal to three is passed.\n    /// </summary>\n    /// <param name=\"decode\">The length 3 character that needs to be decoded</param>\n    /// <returns>A decoded byte array</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"decode\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentException\">\n    ///     Thrown if a the <paramref name=\"decode\" /> parameter does not have length 3 or does\n    ///     not start with an equal sign.\n    /// </exception>\n    private static byte[] DecodeEqualSign(string decode)\n    {\n        if (decode == null)\n            throw new ArgumentNullException(nameof(decode));\n\n        // We can only decode the string if it has length 3 - other calls to this function is invalid\n        if (decode.Length != 3)\n            throw new ArgumentException(@\"decode must have length 3\", nameof(decode));\n\n        // First char must be =\n        if (decode[0] != '=')\n            throw new ArgumentException(@\"decode must start with an equal sign\", nameof(decode));\n\n        // There are two cases where an equal sign might appear\n        // It might be a\n        //   - hex-string like =3D, denoting the character with hex value 3D\n        //   - it might be the last character on the line before a CRLF\n        //     pair, denoting a soft linebreak, which simply\n        //     splits the text up, because of the 76 chars per line restriction\n        if (decode.Contains(\"\\r\\n\")) return new byte[0];\n\n        // Hex string detected. Convertion needed.\n        // It might be that the string located after the equal sign is not hex characters\n        // An example: =JU\n        // In that case we would like to catch the FormatException and do something else\n        try\n        {\n            // The number part of the string is the last two digits. Here we simply remove the equal sign\n            var numberString = decode.Substring(1);\n\n            // Now we create a byte array with the converted number encoded in the string as a hex value (base 16)\n            // This will also handle illegal encodings like =3d where the hex digits are not uppercase,\n            // which is a robustness requirement from RFC 2045.\n            var oneByte = new[] { Convert.ToByte(numberString, 16) };\n\n            // Simply return our one byte byte array\n            return oneByte;\n        }\n        catch (FormatException)\n        {\n            // RFC 2045 says about robust implementation:\n            // An \"=\" followed by a character that is neither a\n            // hexadecimal digit (including \"abcdef\") nor the CR\n            // character of a CRLF pair is illegal.  This case can be\n            // the result of US-ASCII text having been included in a\n            // quoted-printable part of a message without itself\n            // having been subjected to quoted-printable encoding.  A\n            // reasonable approach by a robust implementation might be\n            // to include the \"=\" character and the following\n            // character in the decoded data without any\n            // transformation and, if possible, indicate to the user\n            // that proper decoding was not possible at this point in\n            // the data.\n\n            // So we choose to believe this is actually an un-encoded string\n            // Therefore it must be in US-ASCII and we will return the bytes it corrosponds to\n            return Encoding.ASCII.GetBytes(decode);\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/Rfc2231Decoder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     This class is responsible for decoding parameters that has been encoded with:<br />\n///     <list type=\"bullet\">\n///         <item>\n///             <b>Continuation</b><br />\n///             This is where a single parameter has such a long value that it could\n///             be wrapped while in transit. Instead multiple parameters is used on each line.<br />\n///             <br />\n///             <b>Example</b><br />\n///             From: <c>Content-Type: text/html; boundary=\"someVeryLongStringHereWhichCouldBeWrappedInTransit\"</c><br />\n///             To:\n///             <c>Content-Type: text/html; boundary*0=\"someVeryLongStringHere\" boundary*1=\"WhichCouldBeWrappedInTransit\"</c>\n///             <br />\n///         </item>\n///         <item>\n///             <b>Encoding</b><br />\n///             Sometimes other characters then ASCII characters are needed in parameters.<br />\n///             The parameter is then given a different name to specify that it is encoded.<br />\n///             <br />\n///             <b>Example</b><br />\n///             From: <c>Content-Disposition attachment; filename=\"specialCharsÆØÅ\"</c><br />\n///             To: <c>Content-Disposition attachment; filename*=\"ISO-8859-1'en-us'specialCharsC6D8C0\"</c><br />\n///             This encoding is almost the same as <see cref=\"EncodedWord\" /> encoding, and is used to decode the value.\n///             <br />\n///         </item>\n///         <item>\n///             <b>Continuation and Encoding</b><br />\n///             Both Continuation and Encoding can be used on the same time.<br />\n///             <br />\n///             <b>Example</b><br />\n///             From: <c>Content-Disposition attachment; filename=\"specialCharsÆØÅWhichIsSoLong\"</c><br />\n///             To:\n///             <c>\n///                 Content-Disposition attachment; filename*0*=\"ISO-8859-1'en-us'specialCharsC6D8C0\";\n///                 filename*1*=\"WhichIsSoLong\"\n///             </c>\n///             <br />\n///             This could also be encoded as:<br />\n///             To:\n///             <c>\n///                 Content-Disposition attachment; filename*0*=\"ISO-8859-1'en-us'specialCharsC6D8C0\";\n///                 filename*1=\"WhichIsSoLong\"\n///             </c>\n///             <br />\n///             Notice that <c>filename*1</c> does not have an <c>*</c> after it - denoting it IS NOT encoded.<br />\n///             There are some rules about this:<br />\n///             <list type=\"number\">\n///                 <item>The encoding must be mentioned in the first part (filename*0*), which has to be encoded.</item>\n///                 <item>\n///                     No other part must specify an encoding, but if encoded it uses the encoding mentioned in the\n///                     first part.\n///                 </item>\n///                 <item>Parts may be encoded or not in any order.</item>\n///             </list>\n///             <br />\n///         </item>\n///     </list>\n///     More information and the specification is available in\n///     <see href=\"http://tools.ietf.org/html/rfc2231\">RFC 2231</see>.\n/// </summary>\ninternal static class Rfc2231Decoder\n{\n    #region Decode\n    /// <summary>\n    ///     Decodes a string of the form:<br />\n    ///     <c>value0; key1=value1; key2=value2; key3=value3</c><br />\n    ///     The returned List of key value pairs will have the key as key and the decoded value as value.<br />\n    ///     The first value0 will have a key of <see cref=\"string.Empty\" />.<br />\n    ///     <br />\n    ///     If continuation is used, then multiple keys will be merged into one key with the different values\n    ///     decoded into on big value for that key.<br />\n    ///     Example:<br />\n    ///     <code>\n    /// title*0=part1\n    /// title*1=part2\n    /// </code>\n    ///     will have key and value of:<br></br>\n    ///     <c>title=decode(part1)decode(part2)</c>\n    /// </summary>\n    /// <param name=\"toDecode\">The string to decode.</param>\n    /// <returns>A list of decoded key value pairs.</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"toDecode\" /> is <see langword=\"null\" /></exception>\n    public static List<KeyValuePair<string, string>> Decode(string toDecode)\n    {\n        if (toDecode == null)\n            throw new ArgumentNullException(nameof(toDecode));\n\n        // Normalize the input to take account for missing semicolons after parameters.\n        // Example\n        // text/plain; charset=\\\"iso-8859-1\\\" name=\\\"somefile.txt\\\" or\n        // text/plain;\\tcharset=\\\"iso-8859-1\\\"\\tname=\\\"somefile.txt\\\"\n        // is normalized to\n        // text/plain; charset=\\\"iso-8859-1\\\"; name=\\\"somefile.txt\\\"\n        // Only works for parameters inside quotes\n        // \\s = matches whitespace\n        toDecode = Regex.Replace(toDecode, \"=\\\\s*\\\"(?<value>[^\\\"]*)\\\"\\\\s\", \"=\\\"${value}\\\"; \");\n\n        // Normalize \n        // Since the above only works for parameters inside quotes, we need to normalize\n        // the special case with the first parameter.\n        // Example:\n        // attachment filename=\"foo\"\n        // is normalized to\n        // attachment; filename=\"foo\"\n        // ^ = matches start of line (when not inside square bracets [])\n        toDecode = Regex.Replace(toDecode, @\"^(?<first>[^;\\s]+)\\s(?<second>[^;\\s]+)\", \"${first}; ${second}\");\n\n        // Split by semicolon, but only if not inside quotes\n        var splitted = Utility.SplitStringWithCharNotInsideQuotes(toDecode.Trim(), ';');\n\n        var collection = new List<KeyValuePair<string, string>>(splitted.Count);\n\n        foreach (var part in splitted)\n        {\n            // Empty strings should not be processed\n            if (part.Trim().Length == 0)\n                continue;\n\n            var keyValue = part.Trim().Split(new[] { '=' }, 2);\n            switch (keyValue.Length)\n            {\n                case 1:\n                    collection.Add(new KeyValuePair<string, string>(\"\", keyValue[0]));\n                    break;\n                case 2:\n                    collection.Add(new KeyValuePair<string, string>(keyValue[0], keyValue[1]));\n                    break;\n                default:\n                    throw new ArgumentException(\"When splitting the part \\\"\" + part + \"\\\" by = there was \" +\n                                                keyValue.Length +\n                                                \" parts. Only 1 and 2 are supported\");\n            }\n        }\n\n        return DecodePairs(collection);\n    }\n    #endregion\n\n    #region DecodePairs\n    /// <summary>\n    ///     Decodes the list of key value pairs into a decoded list of key value pairs.<br />\n    ///     There may be less keys in the decoded list, but then the values for the lost keys will have been appended\n    ///     to the new key.\n    /// </summary>\n    /// <param name=\"pairs\">The pairs to decode</param>\n    /// <returns>A decoded list of pairs</returns>\n    private static List<KeyValuePair<string, string>> DecodePairs(IList<KeyValuePair<string, string>> pairs)\n    {\n        if (pairs == null)\n            throw new ArgumentNullException(nameof(pairs));\n\n        var resultPairs = new List<KeyValuePair<string, string>>(pairs.Count);\n\n        var pairsCount = pairs.Count;\n        for (var i = 0; i < pairsCount; i++)\n        {\n            var currentPair = pairs[i];\n            var key = currentPair.Key;\n            var value = Utility.RemoveQuotesIfAny(currentPair.Value);\n\n            // Is it a continuation parameter? (encoded or not)\n            if (key.EndsWith(\"*0\", StringComparison.OrdinalIgnoreCase) ||\n                key.EndsWith(\"*0*\", StringComparison.OrdinalIgnoreCase))\n            {\n                // This encoding will not be used if we get into the if which tells us\n                // that the whole continuation is not encoded\n\n                var encoding = \"notEncoded - Value here is never used\";\n\n                // Now lets find out if it is encoded too.\n                if (key.EndsWith(\"*0*\", StringComparison.OrdinalIgnoreCase))\n                {\n                    // It is encoded.\n\n                    // Fetch out the encoding for later use and decode the value\n                    // If the value was not encoded as the email specified\n                    // encoding will be set to null. This will be used later.\n                    value = DecodeSingleValue(value, out encoding);\n\n                    // Find the right key to use to store the full value\n                    // Remove the start *0 which tells is it is a continuation, and the first one\n                    // And remove the * afterwards which tells us it is encoded\n                    key = key.Replace(\"*0*\", \"\");\n                }\n                else\n                {\n                    // It is not encoded, and no parts of the continuation is encoded either\n\n                    // Find the right key to use to store the full value\n                    // Remove the start *0 which tells is it is a continuation, and the first one\n                    key = key.Replace(\"*0\", \"\");\n                }\n\n                // The StringBuilder will hold the full decoded value from all continuation parts\n                var builder = new StringBuilder();\n\n                // Append the decoded value\n                builder.Append(value);\n\n                // Now go trough the next keys to see if they are part of the continuation\n                for (int j = i + 1, continuationCount = 1; j < pairsCount; j++, continuationCount++)\n                {\n                    var jKey = pairs[j].Key;\n                    var valueJKey = Utility.RemoveQuotesIfAny(pairs[j].Value);\n\n                    if (jKey.Equals(key + \"*\" + continuationCount))\n                    {\n                        // This value part of the continuation is not encoded\n                        // Therefore remove qoutes if any and add to our stringbuilder\n                        builder.Append(valueJKey);\n\n                        // Remember to increment i, as we have now treated one more KeyValuePair\n                        i++;\n                    }\n                    else if (jKey.Equals(key + \"*\" + continuationCount + \"*\"))\n                    {\n                        // We will not get into this part if the first part was not encoded\n                        // Therefore the encoding will only be used if and only if the\n                        // first part was encoded, in which case we have remembered the encoding used\n\n                        // Sometimes an email creator says that a string was encoded, but it really\n                        // `was not. This is to catch that problem.\n                        if (encoding != null) valueJKey = DecodeSingleValue(valueJKey, encoding);\n                        builder.Append(valueJKey);\n\n                        // Remember to increment i, as we have now treated one more KeyValuePair\n                        i++;\n                    }\n                    else\n                    {\n                        // No more keys for this continuation\n                        break;\n                    }\n                }\n\n                // Add the key and the full value as a pair\n                value = builder.ToString();\n                resultPairs.Add(new KeyValuePair<string, string>(key, value));\n            }\n            else if (key.EndsWith(\"*\", StringComparison.OrdinalIgnoreCase))\n            {\n                // This parameter is only encoded - it is not part of a continuation\n                // We need to change the key from \"<key>*\" to \"<key>\" and decode the value\n\n                // To get the key we want, we remove the last * that denotes\n                // that the value hold by the key was encoded\n                key = key.Replace(\"*\", \"\");\n\n                // Decode the value\n                string throwAway;\n                value = DecodeSingleValue(value, out throwAway);\n\n                // Now input the new value with the new key\n                resultPairs.Add(new KeyValuePair<string, string>(key, value));\n            }\n            else\n            {\n                // Fully normal key - the value is not encoded\n                // Therefore nothing to do, and we can simply pass the pair\n                // as being decoded now\n                resultPairs.Add(currentPair);\n            }\n        }\n\n        return resultPairs;\n    }\n    #endregion\n\n    #region DecodeSingleValue\n    /// <summary>\n    ///     This will decode a single value of the form: <c>ISO-8859-1'en-us'%3D%3DIamHere</c><br />\n    ///     Which is basically a <see cref=\"EncodedWord\" /> form just using % instead of =<br />\n    ///     Notice that 'en-us' part is not used for anything.<br />\n    ///     <br />\n    ///     If the single value given is not on the correct form, it will be returned without\n    ///     being decoded and <paramref name=\"encodingUsed\" /> will be set to <see langword=\"null\" />.\n    /// </summary>\n    /// <param name=\"encodingUsed\">\n    ///     The encoding used to decode with - it is given back for later use.<br />\n    ///     <see langword=\"null\" /> if input was not in the correct form.\n    /// </param>\n    /// <param name=\"toDecode\">The value to decode</param>\n    /// <returns>\n    ///     The decoded value that corresponds to <paramref name=\"toDecode\" /> or if\n    ///     <paramref name=\"toDecode\" /> is not on the correct form, it will be non-decoded.\n    /// </returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"toDecode\" /> is <see langword=\"null\" /></exception>\n    private static string DecodeSingleValue(string toDecode, out string encodingUsed)\n    {\n        if (toDecode == null)\n            throw new ArgumentNullException(nameof(toDecode));\n\n        // Check if input has a part describing the encoding\n        if (toDecode.IndexOf('\\'') == -1)\n        {\n            // The input was not encoded (at least not valid) and it is returned as is\n            encodingUsed = null;\n            return toDecode;\n        }\n\n        encodingUsed = toDecode.Substring(0, toDecode.IndexOf('\\''));\n        toDecode = toDecode.Substring(toDecode.LastIndexOf('\\'') + 1);\n        return DecodeSingleValue(toDecode, encodingUsed);\n    }\n    #endregion\n\n    #region DecodeSingleValue\n    /// <summary>\n    ///     This will decode a single value of the form: %3D%3DIamHere\n    ///     Which is basically a <see cref=\"EncodedWord\" /> form just using % instead of =\n    /// </summary>\n    /// <param name=\"valueToDecode\">The value to decode</param>\n    /// <param name=\"encoding\">The encoding used to decode with</param>\n    /// <returns>The decoded value that corresponds to <paramref name=\"valueToDecode\" /></returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"valueToDecode\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"encoding\" /> is <see langword=\"null\" /></exception>\n    private static string DecodeSingleValue(string valueToDecode, string encoding)\n    {\n        if (valueToDecode == null)\n            throw new ArgumentNullException(nameof(valueToDecode));\n\n        if (encoding == null)\n            throw new ArgumentNullException(nameof(encoding));\n\n        // The encoding used is the same as QuotedPrintable, we only\n        // need to change % to =\n        // And otherwise make it look like the correct EncodedWord encoding\n        valueToDecode = \"=?\" + encoding + \"?Q?\" + valueToDecode.Replace(\"%\", \"=\") + \"?=\";\n        return EncodedWord.Decode(valueToDecode);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/Rfc2822DateTime.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Class used to decode RFC 2822 Date header fields.\n/// </summary>\ninternal static class Rfc2822DateTime\n{\n    #region Fields\n    /// <summary>\n    ///     Custom DateTime formats - will be tried if cannot parse the dateInput string using the default method\n    ///     Specified using formats at http://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx\n    ///     One format per string in the array\n    /// </summary>\n    public static string[] CustomDateTimeFormats { private get; set; }\n    #endregion\n\n    #region StringToDate\n    /// <summary>\n    ///     Converts a string in RFC 2822 format into a <see cref=\"DateTime\" /> object\n    /// </summary>\n    /// <param name=\"inputDate\">The date to convert</param>\n    /// <returns>\n    ///     A valid <see cref=\"DateTime\" /> object, which represents the same time as the string that was converted.\n    ///     If <paramref name=\"inputDate\" /> is not a valid date representation, then <see cref=\"DateTime.MinValue\" /> is\n    ///     returned.\n    /// </returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"inputDate\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentException\">\n    ///     If the <paramref name=\"inputDate\" /> could not be parsed into a\n    ///     <see cref=\"DateTime\" /> object\n    /// </exception>\n    public static DateTime StringToDate(string inputDate)\n    {\n        if (inputDate == null)\n            throw new ArgumentNullException(nameof(inputDate));\n\n        // Handle very wrong date time format: Tue Feb 18 10:23:30 2014 (MSK)\n        inputDate = FixSpecialCases(inputDate);\n\n        // Old date specification allows comments and a lot of whitespace\n        inputDate = StripCommentsAndExcessWhitespace(inputDate);\n\n        try\n        {\n            // Extract the DateTime\n            var dateTime = ExtractDateTime(inputDate);\n\n            // Bail if we could not parse the date\n            if (dateTime == DateTime.MinValue)\n                return dateTime;\n\n            // Convert the date into UTC\n            dateTime = new DateTime(dateTime.Ticks, DateTimeKind.Utc);\n\n            // Adjust according to the time zone\n            dateTime = AdjustTimezone(dateTime, inputDate);\n\n            // Return the parsed date\n            return dateTime;\n        }\n        catch (FormatException e) // Convert.ToDateTime() Failure\n        {\n            throw new ArgumentException(\n                \"Could not parse date: \" + e.Message + \". Input was: \\\"\" + inputDate + \"\\\"\", e);\n        }\n        catch (ArgumentException e)\n        {\n            throw new ArgumentException(\n                \"Could not parse date: \" + e.Message + \". Input was: \\\"\" + inputDate + \"\\\"\", e);\n        }\n    }\n    #endregion\n\n    #region AdjustTimezone\n    /// <summary>\n    ///     Adjust the <paramref name=\"dateTime\" /> object given according to the timezone specified in the\n    ///     <paramref name=\"dateInput\" />.\n    /// </summary>\n    /// <param name=\"dateTime\">The date to alter</param>\n    /// <param name=\"dateInput\">The input date, in which the timezone can be found</param>\n    /// <returns>An date altered according to the timezone</returns>\n    private static DateTime AdjustTimezone(DateTime dateTime, string dateInput)\n    {\n        // We know that the timezones are always in the last part of the date input\n        var parts = dateInput.Split(' ');\n        var lastPart = parts[parts.Length - 1];\n\n        // Convert timezones in older formats to [+-]dddd format.\n        lastPart = Regex.Replace(lastPart, RegexOldTimezoneFormats, MatchEvaluator);\n\n        // Find the timezone specification\n        // Example: Fri, 21 Nov 1997 09:55:06 -0600\n        // finds -0600\n        var match = Regex.Match(lastPart, RegexNewTimezoneFormats);\n        if (!match.Success) return dateTime;\n\n        // We have found that the timezone is in +dddd or -dddd format\n        // Add the number of hours and minutes to our found date\n        var hours = int.Parse(match.Groups[\"hours\"].Value);\n        var minutes = int.Parse(match.Groups[\"minutes\"].Value);\n\n        var factor = match.Value[0] == '+' ? -1 : 1;\n\n        dateTime = dateTime.AddHours(factor * hours);\n        dateTime = dateTime.AddMinutes(factor * minutes);\n\n        return dateTime;\n        // A timezone of -0000 is the same as doing nothing\n    }\n    #endregion\n\n    #region MatchEvaluator\n    /// <summary>\n    ///     Convert timezones in older formats to [+-]dddd format.\n    /// </summary>\n    /// <param name=\"match\">The match that was found</param>\n    /// <returns>The string to replace the matched string with</returns>\n    /// <remarks>\n    ///     RFC 2822: http://www.rfc-base.org/rfc-2822.html\n    ///     4.3. Obsolete Date and Time\n    ///     The syntax for the obsolete date format allows a 2 digit year in the\n    ///     date field and allows for a list of alphabetic time zone\n    ///     specifications that were used in earlier versions of this standard.\n    ///     It also permits comments and folding white space between many of the\n    ///     tokens.\n    ///     obs-day-of-week =       [CFWS] day-name [CFWS]\n    ///     obs-year        =       [CFWS] 2*DIGIT [CFWS]\n    ///     obs-month       =       CFWS month-name CFWS\n    ///     obs-day         =       [CFWS] 1*2DIGIT [CFWS]\n    ///     obs-hour        =       [CFWS] 2DIGIT [CFWS]\n    ///     obs-minute      =       [CFWS] 2DIGIT [CFWS]\n    ///     obs-second      =       [CFWS] 2DIGIT [CFWS]\n    ///     obs-zone        =       \"UT\" / \"GMT\" /          ; Universal Time\n    ///     Resnick                     Standards Track                    [Page 31]\n    ///     RFC 2822                Internet Message Format               April 2001\n    ///     ; North American UT\n    ///     ; offsets\n    ///     \"EST\" / \"EDT\" /         ; Eastern:  - 5/ - 4\n    ///     \"CST\" / \"CDT\" /         ; Central:  - 6/ - 5\n    ///     \"MST\" / \"MDT\" /         ; Mountain: - 7/ - 6\n    ///     \"PST\" / \"PDT\" /         ; Pacific:  - 8/ - 7\n    ///     %d65-73 /               ; Military zones - \"A\"\n    ///     %d75-90 /               ; through \"I\" and \"K\"\n    ///     %d97-105 /              ; through \"Z\", both\n    ///     %d107-122               ; upper and lower case -- imported lower and upper\n    /// </remarks>\n    private static string MatchEvaluator(Match match)\n    {\n        if (!match.Success) throw new ArgumentException(\"Match success are always true\");\n\n        switch (match.Value)\n        {\n            // \"A\" through \"I\" and \"a\" through \"i\"\n            // are equivalent to \"+0100\" through \"+0900\" respectively\n            case \"A\":\n            case \"a\":\n                return \"+0100\";\n            case \"B\":\n            case \"b\":\n                return \"+0200\";\n            case \"C\":\n            case \"c\":\n                return \"+0300\";\n            case \"D\":\n            case \"d\":\n                return \"+0400\";\n            case \"E\":\n            case \"e\":\n                return \"+0500\";\n            case \"F\":\n            case \"f\":\n                return \"+0600\";\n            case \"G\":\n            case \"g\":\n                return \"+0700\";\n            case \"H\":\n            case \"h\":\n                return \"+0800\";\n            case \"I\":\n            case \"i\":\n                return \"+0900\";\n\n            // \"K\", \"L\", and \"M\" and \"k\", \"l\" and \"m\"\n            // are equivalent to \"+1000\", \"+1100\", and \"+1200\" respectively\n            case \"K\":\n            case \"k\":\n                return \"+1000\";\n            case \"L\":\n            case \"l\":\n                return \"+1100\";\n            case \"M\":\n            case \"m\":\n                return \"+1200\";\n\n            // \"N\" through \"Y\" and \"n\" through \"y\"\n            // are equivalent to \"-0100\" through \"-1200\" respectively\n            case \"N\":\n            case \"n\":\n                return \"-0100\";\n            case \"O\":\n            case \"o\":\n                return \"-0200\";\n            case \"P\":\n            case \"p\":\n                return \"-0300\";\n            case \"Q\":\n            case \"q\":\n                return \"-0400\";\n            case \"R\":\n            case \"r\":\n                return \"-0500\";\n            case \"S\":\n            case \"s\":\n                return \"-0600\";\n            case \"T\":\n            case \"t\":\n                return \"-0700\";\n            case \"U\":\n            case \"u\":\n                return \"-0800\";\n            case \"V\":\n            case \"v\":\n                return \"-0900\";\n            case \"W\":\n            case \"w\":\n                return \"-1000\";\n            case \"X\":\n            case \"x\":\n                return \"-1100\";\n            case \"Y\":\n            case \"y\":\n                return \"-1200\";\n\n            // \"Z\", \"z\", \"UT\" and \"GMT\"\n            // is equivalent to \"+0000\"\n            case \"Z\":\n            case \"z\":\n            case \"UT\":\n            case \"GMT\":\n                return \"+0000\";\n\n            // US time zones\n            case \"EDT\":\n                return \"-0400\"; // EDT is semantically equivalent to -0400\n            case \"EST\":\n                return \"-0500\"; // EST is semantically equivalent to -0500\n            case \"CDT\":\n                return \"-0500\"; // CDT is semantically equivalent to -0500\n            case \"CST\":\n                return \"-0600\"; // CST is semantically equivalent to -0600\n            case \"MDT\":\n                return \"-0600\"; // MDT is semantically equivalent to -0600\n            case \"MST\":\n                return \"-0700\"; // MST is semantically equivalent to -0700\n            case \"PDT\":\n                return \"-0700\"; // PDT is semantically equivalent to -0700\n            case \"PST\":\n                return \"-0800\"; // PST is semantically equivalent to -0800\n\n            // EU time zones\n            case \"MSK\":\n                return \"+0400\"; // MSK is semantically equivalent to +0400\n\n            default:\n                throw new ArgumentException(\"Unexpected input\");\n        }\n    }\n    #endregion\n\n    #region ExtractDateTime\n    /// <summary>\n    ///     Extracts the date and time parts from the <paramref name=\"dateInput\" />\n    /// </summary>\n    /// <param name=\"dateInput\">The date input string, from which to extract the date and time parts</param>\n    /// <returns>\n    ///     The extracted date part or <see langword=\"DateTime.MinValue\" /> if <paramref name=\"dateInput\" /> is not\n    ///     recognized as a valid date.\n    /// </returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"dateInput\" /> is <see langword=\"null\" /></exception>\n    private static DateTime ExtractDateTime(string dateInput)\n    {\n        if (dateInput == null)\n            throw new ArgumentNullException(nameof(dateInput));\n\n        // Matches the date and time part of a string\n        // Given string example: Fri, 21 Nov 1997 09:55:06 -0600\n        // Needs to find: 21 Nov 1997 09:55:06\n\n        // Seconds does not need to be specified\n        // Even though it is illigal, sometimes hours, minutes or seconds are only specified with one digit\n\n        // Year with 2 or 4 digits (1922 or 22)\n        const string year = @\"(\\d\\d\\d\\d|\\d\\d)\";\n\n        // Time with one or two digits for hour and minute and optinal seconds (06:04:06 or 6:4:6 or 06:04 or 6:4)\n        const string time = @\"\\d?\\d:\\d?\\d(:\\d?\\d)?\";\n\n        // Correct format is 21 Nov 1997 09:55:06\n        const string correctFormat = @\"\\d\\d? .+ \" + year + \" \" + time;\n\n        // Some uses incorrect format: 2012-1-1 12:30\n        const string incorrectFormat = year + @\"-\\d?\\d-\\d?\\d \" + time;\n\n        // Some uses incorrect format: 08-May-2012 16:52:30 +0100\n        const string correctFormatButWithDashes = @\"\\d\\d?-[A-Za-z]{3}-\" + year + \" \" + time;\n\n        // We allow both correct and incorrect format\n        const string joinedFormat = @\"(\" + correctFormat + \")|(\" + incorrectFormat + \")|(\" +\n                                    correctFormatButWithDashes + \")\";\n\n        var match = Regex.Match(dateInput, joinedFormat);\n        if (match.Success)\n            try\n            {\n                return Convert.ToDateTime(match.Value, CultureInfo.InvariantCulture);\n            }\n            catch (FormatException)\n            {\n            }\n\n        //If there are some custom formats\n        if (CustomDateTimeFormats == null) return DateTime.MinValue;\n        //If there is a timezone at the end, remove it\n\n        var strDate = dateInput.Trim();\n        if (strDate.Contains(\" \")\n           ) //Check contains a space before getting the last part to prevent accessing index -1\n        {\n            var parts = strDate.Split(' ');\n            var lastPart = parts[parts.Length - 1];\n\n            // Convert timezones in older formats to [+-]dddd format.\n            lastPart = Regex.Replace(lastPart, RegexOldTimezoneFormats, MatchEvaluator);\n\n            // Find the timezone specification\n            // Example: Fri, 21 Nov 1997 09:55:06 -0600\n            // finds -0600\n            var timezoneMatch = Regex.Match(lastPart, RegexNewTimezoneFormats);\n            if (timezoneMatch.Success)\n                strDate = strDate.Substring(0, strDate.Length - parts[parts.Length - 1].Length)\n                    .Trim(); //Use the length of the old last part\n        }\n\n        //Try and parse it as one of the custom formats\n        try\n        {\n            return DateTime.ParseExact(strDate, CustomDateTimeFormats, null, DateTimeStyles.None);\n        }\n        catch (FormatException)\n        {\n        }\n\n        return DateTime.MinValue;\n    }\n    #endregion\n\n    #region StripCommentsAndExcessWhitespace\n    /// <summary>\n    ///     Strips and removes all comments and excessive whitespace from the string\n    /// </summary>\n    /// <param name=\"input\">The input to strip from</param>\n    /// <returns>The stripped string</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"input\" /> is <see langword=\"null\" /></exception>\n    private static string StripCommentsAndExcessWhitespace(string input)\n    {\n        if (input == null)\n            throw new ArgumentNullException(nameof(input));\n\n        // Strip out comments\n        // Also strips out nested comments\n        input = Regex.Replace(input, @\"(\\((?>\\((?<C>)|\\)(?<-C>)|.?)*(?(C)(?!))\\))\", \"\");\n\n        // Reduce any whitespace character to one space only\n        input = Regex.Replace(input, @\"\\s+\", \" \");\n\n        // Remove all initial whitespace\n        input = Regex.Replace(input, @\"^\\s+\", \"\");\n\n        // Remove all ending whitespace\n        input = Regex.Replace(input, @\"\\s+$\", \"\");\n\n        // Remove spaces at colons\n        // Example: 22: 33 : 44 => 22:33:44\n        input = Regex.Replace(input, @\" ?: ?\", \":\");\n\n        return input;\n    }\n    #endregion\n\n    #region FixSpecialCases\n    /// <summary>\n    ///     Converts date time string in very wrong date time format:\n    ///     Tue Feb 18 10:23:30 2014 (MSK)\n    ///     to\n    ///     Feb 18 2014 10:23:30 MSK\n    /// </summary>\n    /// <param name=\"inputDate\">The date to convert</param>\n    /// <returns>The corrected string</returns>\n    private static string FixSpecialCases(string inputDate)\n    {\n        const string weekDayPattern = \"(?<weekDay>Mon|Tue|Wed|Thu|Fri|Sat|Sun)\";\n        const string monthPattern = @\"(?<month>[A-Za-z]+)\";\n        const string dayPattern = @\"(?<day>\\d?\\d)\";\n        const string yearPattern = @\"(?<year>\\d\\d\\d\\d)\";\n        const string timePattern = @\"(?<time>\\d?\\d:\\d?\\d(:\\d?\\d)?)\";\n        const string timeZonePattern = @\"(?<timeZone>[A-Z]{3})\";\n\n        var incorrectFormat =\n            $@\"{weekDayPattern} +{monthPattern} +{dayPattern} +{timePattern} +{yearPattern} +\\({timeZonePattern}\\)\";\n\n        var match = Regex.Match(inputDate, incorrectFormat);\n        if (!match.Success) return inputDate;\n        var month = match.Groups[\"month\"];\n        var day = match.Groups[\"day\"];\n        var year = match.Groups[\"year\"];\n        var time = match.Groups[\"time\"];\n        var timeZone = match.Groups[\"timeZone\"];\n        return $\"{day} {month} {year} {time} {timeZone}\";\n    }\n    #endregion\n\n    #region Consts\n    //Constants\n    /// <summary>\n    ///     Timezone formats that aren't +-hhmm, e.g. UTC, or K. See MatchEvaluator method for conversions\n    /// </summary>\n    private const string RegexOldTimezoneFormats =\n        @\"\\b((UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|MSK|PDT)|([A-IK-Za-ik-z]))\\b\";\n\n    /// <summary>\n    ///     Matches any +=hhmm timezone offset, e.g. +0100\n    /// </summary>\n    private const string RegexNewTimezoneFormats = @\"[\\+-](?<hours>\\d\\d)(?<minutes>\\d\\d)\";\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/SizeParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Thanks to http://stackoverflow.com/a/7333402/477854 for inspiration\n///     This class can convert from strings like \"104 kB\" (104 kilobytes) to bytes.\n///     It does not know about differences such as kilobits vs kilobytes.\n/// </summary>\ninternal static class SizeParser\n{\n    #region Fields\n    private static readonly Dictionary<string, long> UnitsToMultiplicator = InitializeSizes();\n    #endregion\n\n    #region InitializeSizes\n    private static Dictionary<string, long> InitializeSizes()\n    {\n        return new Dictionary<string, long>\n        {\n            { \"\", 1L }, // No unit is the same as a byte\n            { \"B\", 1L }, // Byte\n            { \"KB\", 1024L }, // Kilobyte\n            { \"MB\", 1024L * 1024L }, // Megabyte\n            { \"GB\", 1024L * 1024L * 1024L }, // Gigabyte\n            { \"TB\", 1024L * 1024L * 1024L * 1024L } // Terabyte\n        };\n    }\n    #endregion\n\n    #region Parse\n    public static long Parse(string value)\n    {\n        value = value.Trim();\n\n        var unit = ExtractUnit(value);\n        var valueWithoutUnit = value.Substring(0, value.Length - unit.Length).Trim();\n\n        var multiplicatorForUnit = MultiplicatorForUnit(unit);\n\n        var size = double.Parse(valueWithoutUnit, NumberStyles.Number, CultureInfo.InvariantCulture);\n\n        return (long)(multiplicatorForUnit * size);\n    }\n    #endregion\n\n    #region ExtractUnit\n    private static string ExtractUnit(string sizeWithUnit)\n    {\n        // start right, end at the first digit\n        var lastChar = sizeWithUnit.Length - 1;\n        var unitLength = 0;\n\n        while (unitLength <= lastChar\n               && sizeWithUnit[lastChar - unitLength] != ' ' // stop when a space\n               && !IsDigit(sizeWithUnit[lastChar - unitLength])) // or digit is found\n            unitLength++;\n\n        return sizeWithUnit.Substring(sizeWithUnit.Length - unitLength).ToUpperInvariant();\n    }\n    #endregion\n\n    #region IsDigit\n    private static bool IsDigit(char value)\n    {\n        // we don't want to use char.IsDigit since it would accept esoterical unicode digits\n        return value >= '0' && value <= '9';\n    }\n    #endregion\n\n    #region MultiplicatorForUnit\n    private static long MultiplicatorForUnit(string unit)\n    {\n        unit = unit.ToUpperInvariant();\n\n        if (!UnitsToMultiplicator.ContainsKey(unit))\n            throw new ArgumentException(@\"illegal or unknown unit: \"\"\" + unit + @\"\"\"\", nameof(unit));\n\n        return UnitsToMultiplicator[unit];\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Decode/Utility.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace MsgKit.Mime.Decode;\n\n/// <summary>\n///     Contains common operations needed while decoding.\n/// </summary>\ninternal static class Utility\n{\n    #region RemoveQuotesIfAny\n    /// <summary>\n    ///     Remove quotes, if found, around the string.\n    /// </summary>\n    /// <param name=\"text\">Text with quotes or without quotes</param>\n    /// <returns>Text without quotes</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"text\" /> is <see langword=\"null\" /></exception>\n    public static string RemoveQuotesIfAny(string text)\n    {\n        if (text == null)\n            throw new ArgumentNullException(nameof(text));\n\n        // Check if there are quotes at both ends and have at least two characters\n        if (text.Length > 1 && text[0] == '\"' && text[text.Length - 1] == '\"')\n            return text.Substring(1, text.Length - 2);\n\n        // If no quotes were found, the text is just returned\n        return text;\n    }\n    #endregion\n\n    #region SplitStringWithCharNotInsideQuotes\n    /// <summary>\n    ///     Split a string into a list of strings using a specified character.<br />\n    ///     Everything inside quotes are ignored.\n    /// </summary>\n    /// <param name=\"input\">A string to split</param>\n    /// <param name=\"toSplitAt\">The character to use to split with</param>\n    /// <returns>A List of strings that was delimited by the <paramref name=\"toSplitAt\" /> character</returns>\n    public static List<string> SplitStringWithCharNotInsideQuotes(string input, char toSplitAt)\n    {\n        var elements = new List<string>();\n\n        var lastSplitLocation = 0;\n        var insideQuote = false;\n\n        var characters = input.ToCharArray();\n\n        for (var i = 0; i < characters.Length; i++)\n        {\n            var character = characters[i];\n            if (character == '\\\"')\n                insideQuote = !insideQuote;\n\n            // Only split if we are not inside quotes\n            if (character != toSplitAt || insideQuote) continue;\n            // We need to split\n            var length = i - lastSplitLocation;\n            elements.Add(input.Substring(lastSplitLocation, length));\n\n            // Update last split location\n            // + 1 so that we do not include the character used to split with next time\n            lastSplitLocation = i + 1;\n        }\n\n        // Add the last part\n        elements.Add(input.Substring(lastSplitLocation, input.Length - lastSplitLocation));\n\n        return elements;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Header/ContentTransferEncoding.cs",
    "content": "﻿using System;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     <see cref=\"Enum\" /> that describes the ContentTransferEncoding header field\n/// </summary>\n/// <remarks>See <a href=\"http://tools.ietf.org/html/rfc2045#section-6\">RFC 2045 section 6</a> for more details</remarks>\npublic enum ContentTransferEncoding\n{\n    /// <summary>\n    ///     7 bit Encoding\n    /// </summary>\n    SevenBit,\n\n    /// <summary>\n    ///     8 bit Encoding\n    /// </summary>\n    EightBit,\n\n    /// <summary>\n    ///     Quoted Printable Encoding\n    /// </summary>\n    QuotedPrintable,\n\n    /// <summary>\n    ///     Base64 Encoding\n    /// </summary>\n    Base64,\n\n    /// <summary>\n    ///     Binary Encoding\n    /// </summary>\n    Binary\n}"
  },
  {
    "path": "MsgKit/Mime/Header/HeaderExtractor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     Utility class that divides a message into a body and a header.<br />\n///     The header is then parsed to a strongly typed <see cref=\"MessageHeader\" /> object.\n/// </summary>\npublic static class HeaderExtractor\n{\n    #region GetHeaders\n    /// <summary>\n    ///     Extract the headers from the given headers string and gives it back\n    ///     as a MessageHeader object\n    /// </summary>\n    /// <param name=\"headersString\">The string with the header information</param>\n    public static MessageHeader GetHeaders(string headersString)\n    {\n        var headersUnparsedCollection = ExtractHeaders(headersString);\n        return new MessageHeader(headersUnparsedCollection);\n    }\n    #endregion\n\n    #region ExtractHeaders\n    /// <summary>\n    /// Method that takes a full message and extract the headers from it.\n    /// </summary>\n    /// <param name=\"messageContent\">The message to extract headers from. Does not need the body part. Needs the empty headers end line.</param>\n    /// <returns>A collection of Name and Value pairs of headers</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"messageContent\"/> is <see langword=\"null\"/></exception>\n    private static Dictionary<string, List<string>> ExtractHeaders(string messageContent)\n    {\n        if (messageContent == null)\n            throw new ArgumentNullException(nameof(messageContent));\n\n        var headers = new Dictionary<string, List<string>>();\n\n        using (var messageReader = new StringReader(messageContent))\n        {\n            // Read until all headers have ended.\n            // The headers ends when an empty line is encountered\n            // An empty message might actually not have an empty line, in which\n            // case the headers end with null value.\n            string line;\n            while (!string.IsNullOrEmpty(line = messageReader.ReadLine()))\n            {\n                // Split into name and value\n                var header = SeparateHeaderNameAndValue(line);\n                var headerName = header.Key;\n\n                // Second index is the header value.\n                // Use a StringBuilder since the header value may be continued on the next line\n                var headerValue = new StringBuilder(header.Value);\n\n                // Keep reading until we would hit next header\n                // This is for handling multi line headers\n                while (IsMoreLinesInHeaderValue(messageReader))\n                {\n                    // Unfolding is accomplished by simply removing any CRLF\n                    // that is immediately followed by WSP\n                    // This was done using ReadLine (it discards CRLF)\n                    // See http://tools.ietf.org/html/rfc822#section-3.1.1 for more information\n                    var moreHeaderValue = messageReader.ReadLine();\n\n                    // Simply append the line just read to the header value\n                    headerValue.Append(moreHeaderValue);\n                }\n\n                // Now we have the name and full value. Add it\n                if (!headers.ContainsKey(headerName))\n                    headers.Add(headerName, new List<string> { headerValue.ToString() });\n                else\n                    headers[headerName].Add(headerValue.ToString());\n            }\n        }\n\n        return headers;\n    }\n    #endregion\n\n    #region IsMoreLinesInHeaderValue\n    /// <summary>\n    /// Check if the next line is part of the current header value we are parsing by\n    /// peeking on the next character of the <see cref=\"TextReader\"/>.<br/>\n    /// This should only be called while parsing headers.\n    /// </summary>\n    /// <param name=\"reader\">The reader from which the header is read from</param>\n    /// <returns><see langword=\"true\"/> if multi-line header. <see langword=\"false\"/> otherwise</returns>\n    private static bool IsMoreLinesInHeaderValue(TextReader reader)\n    {\n        var peek = reader.Peek();\n        if (peek == -1)\n            return false;\n\n        var peekChar = (char)peek;\n\n        // A multi line header must have a whitespace character\n        // on the next line if it is to be continued\n        return peekChar == ' ' || peekChar == '\\t';\n    }\n    #endregion\n\n    #region SeparateHeaderNameAndValue\n    /// <summary>\n    /// Separate a full header line into a header name and a header value.\n    /// </summary>\n    /// <param name=\"rawHeader\">The raw header line to be separated</param>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"rawHeader\"/> is <see langword=\"null\"/></exception>\n    private static KeyValuePair<string, string> SeparateHeaderNameAndValue(string rawHeader)\n    {\n        if (rawHeader == null)\n            throw new ArgumentNullException(nameof(rawHeader));\n\n        var key = string.Empty;\n        var value = string.Empty;\n\n        var indexOfColon = rawHeader.IndexOf(':');\n\n        // Check if it is allowed to make substring calls\n        if (indexOfColon < 0 || rawHeader.Length < indexOfColon + 1)\n            return new KeyValuePair<string, string>(key, value);\n        key = rawHeader.Substring(0, indexOfColon).Trim();\n        value = rawHeader.Substring(indexOfColon + 1).Trim();\n\n        return new KeyValuePair<string, string>(key, value);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Header/HeaderFieldParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Mail;\nusing System.Net.Mime;\nusing MsgKit.Mime.Decode;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     Class that can parse different fields in the header sections of a MIME message.\n/// </summary>\ninternal static class HeaderFieldParser\n{\n    #region ParseContentTransferEncoding\n    /// <summary>\n    ///     Parses the Content-Transfer-Encoding header.\n    /// </summary>\n    /// <param name=\"headerValue\">The value for the header to be parsed</param>\n    /// <returns>A <see cref=\"ContentTransferEncoding\" /></returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"headerValue\" /> is <see langword=\"null\" /></exception>\n    /// <exception cref=\"ArgumentException\">\n    ///     If the <paramref name=\"headerValue\" /> could not be parsed to a\n    ///     <see cref=\"ContentTransferEncoding\" />\n    /// </exception>\n    public static ContentTransferEncoding ParseContentTransferEncoding(string headerValue)\n    {\n        if (headerValue == null)\n            throw new ArgumentNullException(nameof(headerValue));\n\n        switch (headerValue.Trim().ToUpperInvariant())\n        {\n            case \"7BIT\":\n                return ContentTransferEncoding.SevenBit;\n\n            case \"8BIT\":\n                return ContentTransferEncoding.EightBit;\n\n            case \"QUOTED-PRINTABLE\":\n                return ContentTransferEncoding.QuotedPrintable;\n\n            case \"BASE64\":\n                return ContentTransferEncoding.Base64;\n\n            case \"BINARY\":\n                return ContentTransferEncoding.Binary;\n\n            // If a wrong argument is passed to this parser method, then we assume\n            // default encoding, which is SevenBit.\n            // This is to ensure that we do not throw exceptions, even if the email not MIME valid.\n            default:\n                return ContentTransferEncoding.SevenBit;\n        }\n    }\n    #endregion\n\n    #region ParseImportance\n    /// <summary>\n    ///     Parses an ImportanceType from a given Importance header value.\n    /// </summary>\n    /// <param name=\"headerValue\">The value to be parsed</param>\n    /// <returns>A <see cref=\"MailPriority\" />. If the <paramref name=\"headerValue\" /> is not recognized, Normal is returned.</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"headerValue\" /> is <see langword=\"null\" /></exception>\n    public static MailPriority ParseImportance(string headerValue)\n    {\n        if (headerValue == null)\n            throw new ArgumentNullException(nameof(headerValue));\n\n        switch (headerValue.ToUpperInvariant())\n        {\n            case \"5\":\n            case \"HIGH\":\n                return MailPriority.High;\n\n            case \"3\":\n            case \"NORMAL\":\n                return MailPriority.Normal;\n\n            case \"1\":\n            case \"LOW\":\n                return MailPriority.Low;\n\n            default:\n                return MailPriority.Normal;\n        }\n    }\n    #endregion\n\n    #region ParseContentType\n    /// <summary>\n    ///     Parses a the value for the header Content-Type to\n    ///     a <see cref=\"ContentType\" /> object.\n    /// </summary>\n    /// <param name=\"headerValue\">The value to be parsed</param>\n    /// <returns>A <see cref=\"ContentType\" /> object</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"headerValue\" /> is <see langword=\"null\" /></exception>\n    public static ContentType ParseContentType(string headerValue)\n    {\n        if (headerValue == null)\n            throw new ArgumentNullException(nameof(headerValue));\n\n        // We create an empty Content-Type which we will fill in when we see the values\n        var contentType = new ContentType();\n\n        // Now decode the parameters\n        var parameters = Rfc2231Decoder.Decode(headerValue);\n\n        foreach (var keyValuePair in parameters)\n        {\n            var key = keyValuePair.Key.ToUpperInvariant().Trim();\n            var value = Utility.RemoveQuotesIfAny(keyValuePair.Value.Trim());\n            switch (key)\n            {\n                case \"\":\n                    // This is the MediaType - it has no key since it is the first one mentioned in the\n                    // headerValue and has no = in it.\n\n                    // Check for illegal content-type \n                    var v = value.ToUpperInvariant().Trim('\\0');\n                    if (v.Equals(\"TEXT\") || v.Equals(\"TEXT/\"))\n                        value = \"text/plain\";\n\n                    contentType.MediaType = value;\n                    break;\n\n                case \"BOUNDARY\":\n                    contentType.Boundary = value;\n                    break;\n\n                case \"CHARSET\":\n                    contentType.CharSet = value;\n                    break;\n\n                case \"NAME\":\n                    contentType.Name = EncodedWord.Decode(value);\n                    break;\n\n                default:\n                    // This is to shut up the code help that is saying that contentType.Parameters\n                    // can be null - which it cant!\n                    if (contentType.Parameters == null)\n                        throw new Exception(\n                            \"The ContentType parameters property is null. This will never be thrown.\");\n\n                    // We add the unknown value to our parameters list\n                    // \"Known\" unknown values are:\n                    // - title\n                    // - report-type\n                    contentType.Parameters.Add(key, value);\n                    break;\n            }\n        }\n\n        return contentType;\n    }\n    #endregion\n\n    #region ParseContentDisposition\n    /// <summary>\n    ///     Parses a the value for the header Content-Disposition to a <see cref=\"ContentDisposition\" /> object.\n    /// </summary>\n    /// <param name=\"headerValue\">The value to be parsed</param>\n    /// <returns>A <see cref=\"ContentDisposition\" /> object</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"headerValue\" /> is <see langword=\"null\" /></exception>\n    public static ContentDisposition ParseContentDisposition(string headerValue)\n    {\n        if (headerValue == null)\n            throw new ArgumentNullException(nameof(headerValue));\n\n        // See http://www.ietf.org/rfc/rfc2183.txt for RFC definition\n\n        // Create empty ContentDisposition - we will fill in details as we read them\n        var contentDisposition = new ContentDisposition();\n\n        // Now decode the parameters\n        var parameters = Rfc2231Decoder.Decode(headerValue);\n\n        foreach (var keyValuePair in parameters)\n        {\n            var key = keyValuePair.Key.ToUpperInvariant().Trim();\n            var value = Utility.RemoveQuotesIfAny(keyValuePair.Value.Trim());\n            switch (key)\n            {\n                case \"\":\n                    // This is the DispisitionType - it has no key since it is the first one\n                    // and has no = in it.\n                    contentDisposition.DispositionType = value;\n                    break;\n\n                // The correct name of the parameter is filename, but some emails also contains the parameter\n                // name, which also holds the name of the file. Therefore we use both names for the same field.\n                case \"NAME\":\n                case \"FILENAME\":\n                    // The filename might be in qoutes, and it might be encoded-word encoded\n                    contentDisposition.FileName = EncodedWord.Decode(value);\n                    break;\n\n                case \"CREATION-DATE\":\n                    // Notice that we need to create a new DateTime because of a failure in .NET 2.0.\n                    // The failure is: you cannot give contentDisposition a DateTime with a Kind of UTC\n                    // It will set the CreationDate correctly, but when trying to read it out it will throw an exception.\n                    // It is the same with ModificationDate and ReadDate.\n                    // This is fixed in 4.0 - maybe in 3.0 too.\n                    // Therefore we create a new DateTime which have a DateTimeKind set to unspecified\n                    var creationDate = new DateTime(Rfc2822DateTime.StringToDate(value).Ticks);\n                    contentDisposition.CreationDate = creationDate;\n                    break;\n\n                case \"MODIFICATION-DATE\":\n                    var midificationDate = new DateTime(Rfc2822DateTime.StringToDate(value).Ticks);\n                    contentDisposition.ModificationDate = midificationDate;\n                    break;\n\n                case \"READ-DATE\":\n                    var readDate = new DateTime(Rfc2822DateTime.StringToDate(value).Ticks);\n                    contentDisposition.ReadDate = readDate;\n                    break;\n\n                case \"SIZE\":\n                    contentDisposition.Size = SizeParser.Parse(value);\n                    break;\n\n                case \"CHARSET\": // ignoring invalid parameter in Content-Disposition\n                case \"VOICE\":\n                    break;\n\n                default:\n                    if (!key.StartsWith(\"X-\"))\n                        throw new ArgumentException(\n                            \"Unknown parameter in Content-Disposition. Ask developer to fix! Parameter: \" + key);\n                    contentDisposition.Parameters.Add(key, value);\n                    break;\n            }\n        }\n\n        return contentDisposition;\n    }\n    #endregion\n\n    #region ParseId\n    /// <summary>\n    ///     Parses an ID like Message-Id and Content-Id.<br />\n    ///     Example:<br />\n    ///     <c>&lt;test@test.com&gt;</c><br />\n    ///     into<br />\n    ///     <c>test@test.com</c>\n    /// </summary>\n    /// <param name=\"headerValue\">The id to parse</param>\n    /// <returns>A parsed ID</returns>\n    public static string ParseId(string headerValue)\n    {\n        // Remove whitespace in front and behind since\n        // whitespace is allowed there\n        // Remove the last > and the first <\n        return headerValue.Trim().TrimEnd('>').TrimStart('<');\n    }\n    #endregion\n\n    #region ParseMultipleIDs\n    /// <summary>\n    ///     Parses multiple IDs from a single string like In-Reply-To.\n    /// </summary>\n    /// <param name=\"headerValue\">The value to parse</param>\n    /// <returns>A list of IDs</returns>\n    public static List<string> ParseMultipleIDs(string headerValue)\n    {\n        // Split the string by >\n        // We cannot use ' ' (space) here since this is a possible value:\n        // <test@test.com><test2@test.com>\n        var ids = headerValue.Trim().Split(new[] { '>' }, StringSplitOptions.RemoveEmptyEntries);\n        return ids.Select(ParseId).ToList();\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Header/MessageHeader.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.Net.Mail;\nusing System.Net.Mime;\nusing System.Text;\nusing MsgKit.Mime.Decode;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     Class that holds all headers for a message<br />\n///     Headers which are unknown the the parser will be held in the <see cref=\"CustomHeaders\" /> collection.<br />\n///     <br />\n///     This class cannot be instantiated from outside the library.\n/// </summary>\n/// <remarks>\n///     See <a href=\"http://tools.ietf.org/html/rfc4021\">RFC 4021</a> for a large list of headers.<br />\n/// </remarks>\npublic sealed class MessageHeader\n{\n    #region Properties\n    /// <summary>\n    ///     Contains all the headers as a Dictionary&lt;string, List&lt;string&gt;&gt;\n    /// </summary>\n    public Dictionary<string, List<string>> RawHeaders { get; private set; }\n\n    /// <summary>\n    ///     All headers which were not recognized and explicitly dealt with.<br />\n    ///     This should mostly be custom headers, which are marked as X-[name].<br />\n    ///     <br />\n    ///     This list will be empty if all headers were recognized and parsed.\n    /// </summary>\n    public Dictionary<string, List<string>> CustomHeaders { get; private set; }\n\n    /// <summary>\n    ///     A human readable description of the body<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Content-Description header was present in the message.\n    /// </summary>\n    public string ContentDescription { get; private set; }\n\n    /// <summary>\n    ///     ID of the content part (like an attached image). Used with MultiPart messages.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Content-ID header field was present in the message.\n    /// </summary>\n    /// <see cref=\"MessageId\">For an ID of the message</see>\n    public string ContentId { get; private set; }\n\n    /// <summary>\n    ///     Message keywords<br />\n    ///     <br />\n    ///     The list will be empty if no Keywords header was present in the message\n    /// </summary>\n    public List<string> Keywords { get; private set; }\n\n    /// <summary>\n    ///     A List of emails to people who wishes to be notified when some event happens.<br />\n    ///     These events could be email:\n    ///     <list type=\"bullet\">\n    ///         <item>deletion</item>\n    ///         <item>printing</item>\n    ///         <item>received</item>\n    ///         <item>...</item>\n    ///     </list>\n    ///     The list will be empty if no Disposition-Notification-To header was present in the message\n    /// </summary>\n    /// <remarks>See <a href=\"http://tools.ietf.org/html/rfc3798\">RFC 3798</a> for details</remarks>\n    public List<RfcMailAddress> DispositionNotificationTo { get; private set; }\n\n    /// <summary>\n    ///     This is the Received headers. This tells the path that the email went.<br />\n    ///     <br />\n    ///     The list will be empty if no Received header was present in the message\n    /// </summary>\n    public List<Received> Received { get; private set; }\n\n    /// <summary>\n    ///     Importance of this email.<br />\n    ///     <br />\n    ///     The importance level is set to normal, if no Importance header field was mentioned or it contained\n    ///     unknown information. This is the expected behavior according to the RFC.\n    /// </summary>\n    public MailPriority Importance { get; private set; }\n\n    /// <summary>\n    ///     This header describes the Content encoding during transfer.<br />\n    ///     <br />\n    ///     If no Content-Transfer-Encoding header was present in the message, it is set\n    ///     to the default of <see cref=\"Header.ContentTransferEncoding.SevenBit\">SevenBit</see> in accordance to the RFC.\n    /// </summary>\n    /// <remarks>See <a href=\"http://tools.ietf.org/html/rfc2045#section-6\">RFC 2045 section 6</a> for details</remarks>\n    public ContentTransferEncoding ContentTransferEncoding { get; private set; }\n\n    /// <summary>\n    ///     Specifies who this mail was for<br />\n    ///     <br />\n    ///     The list will be empty if no To header was present in the message\n    /// </summary>\n    public List<RfcMailAddress> To { get; private set; }\n\n    /// <summary>\n    ///     Carbon Copy. This specifies who got a copy of the message.<br />\n    ///     <br />\n    ///     The list will be empty if no Cc header was present in the message\n    /// </summary>\n    public List<RfcMailAddress> Cc { get; private set; }\n\n    /// <summary>\n    ///     Blind Carbon Copy. This specifies who got a copy of the message, but others\n    ///     cannot see who these persons are.<br />\n    ///     <br />\n    ///     The list will be empty if no Received Bcc was present in the message\n    /// </summary>\n    public List<RfcMailAddress> Bcc { get; private set; }\n\n    /// <summary>\n    ///     Specifies who sent the email<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no From header field was present in the message\n    /// </summary>\n    public RfcMailAddress From { get; private set; }\n\n    /// <summary>\n    ///     Specifies who a reply to the message should be sent to<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Reply-To header field was present in the message\n    /// </summary>\n    public RfcMailAddress ReplyTo { get; private set; }\n\n    /// <summary>\n    ///     The message identifier(s) of the original message(s) to which the\n    ///     current message is a reply.<br />\n    ///     <br />\n    ///     The list will be empty if no In-Reply-To header was present in the message\n    /// </summary>\n    public List<string> InReplyTo { get; private set; }\n\n    /// <summary>\n    ///     The message identifier(s) of other message(s) to which the current\n    ///     message is related to.<br />\n    ///     <br />\n    ///     The list will be empty if no References header was present in the message\n    /// </summary>\n    public List<string> References { get; private set; }\n\n    /// <summary>\n    ///     This is the sender of the email address.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Sender header field was present in the message\n    /// </summary>\n    /// <remarks>\n    ///     The RFC states that this field can be used if a secretary\n    ///     is sending an email for someone she is working for.\n    ///     The email here will then be the secretary's email, and\n    ///     the Reply-To field would hold the address of the person she works for.<br />\n    ///     RFC states that if the Sender is the same as the From field,\n    ///     sender should not be included in the message.\n    /// </remarks>\n    public RfcMailAddress Sender { get; private set; }\n\n    /// <summary>\n    ///     The Content-Type header field.<br />\n    ///     <br />\n    ///     If not set, the ContentType is created by the default \"text/plain; charset=us-ascii\" which is\n    ///     defined in <a href=\"http://tools.ietf.org/html/rfc2045#section-5.2\">RFC 2045 section 5.2</a>.<br />\n    ///     If set, the default is overridden.\n    /// </summary>\n    public ContentType ContentType { get; private set; }\n\n    /// <summary>\n    ///     Used to describe if a message part is to be displayed or to be though of as an attachment.<br />\n    ///     Also contains information about filename if such was sent.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Content-Disposition header field was present in the message\n    /// </summary>\n    public ContentDisposition ContentDisposition { get; private set; }\n\n    /// <summary>\n    ///     The Date when the email was sent.<br />\n    ///     This is the raw value. <see cref=\"DateSent\" /> for a parsed up <see cref=\"DateTime\" /> value of this field.<br />\n    ///     <br />\n    ///     <see langword=\"DateTime.MinValue\" /> if no Date header field was present in the message or if the date could not be\n    ///     parsed.\n    /// </summary>\n    /// <remarks>See <a href=\"http://tools.ietf.org/html/rfc5322#section-3.6.1\">RFC 5322 section 3.6.1</a> for more details</remarks>\n    public string Date { get; private set; }\n\n    /// <summary>\n    ///     The Date when the email was sent.<br />\n    ///     This is the parsed equivalent of <see cref=\"Date\" />.<br />\n    ///     Notice that the <see cref=\"TimeZone\" /> of the <see cref=\"DateTime\" /> object is in UTC and has NOT been converted\n    ///     to local <see cref=\"TimeZone\" />.\n    /// </summary>\n    /// <remarks>See <a href=\"http://tools.ietf.org/html/rfc5322#section-3.6.1\">RFC 5322 section 3.6.1</a> for more details</remarks>\n    public DateTime DateSent { get; private set; }\n\n    /// <summary>\n    ///     An ID of the message that is SUPPOSED to be in every message according to the RFC.<br />\n    ///     The ID is unique.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Message-ID header field was present in the message\n    /// </summary>\n    public string MessageId { get; private set; }\n\n    /// <summary>\n    ///     The Mime Version.<br />\n    ///     This field will almost always show 1.0<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Mime-Version header field was present in the message\n    /// </summary>\n    public string MimeVersion { get; private set; }\n\n    /// <summary>\n    ///     A single <see cref=\"RfcMailAddress\" /> with no username inside.<br />\n    ///     This is a trace header field, that should be in all messages.<br />\n    ///     Replies should be sent to this address.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Return-Path header field was present in the message\n    /// </summary>\n    public RfcMailAddress ReturnPath { get; private set; }\n\n    /// <summary>\n    ///     The subject line of the message in decoded, one line state.<br />\n    ///     This should be in all messages.<br />\n    ///     <br />\n    ///     <see langword=\"null\" /> if no Subject header field was present in the message\n    /// </summary>\n    public string Subject { get; private set; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates an empty header object, use the <see cref=\"SetHeaderValue\" /> method\n    ///     to set values\n    /// </summary>\n    public MessageHeader()\n    {\n        Clear();\n    }\n\n    /// <summary>\n    ///     Parses a Dictionary&lt;string, string&gt; to a MessageHeader\n    /// </summary>\n    /// <param name=\"rawHeaders\">The collection that should be traversed and parsed</param>\n    /// <returns>A valid MessageHeader object</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"rawHeaders\" /> is <see langword=\"null\" /></exception>\n    internal MessageHeader(Dictionary<string, List<string>> rawHeaders)\n    {\n        if (rawHeaders == null)\n            throw new ArgumentNullException(nameof(rawHeaders));\n\n        Clear();\n\n        RawHeaders = rawHeaders;\n\n        // Now parse the actual headers\n        ParseHeaders(rawHeaders);\n    }\n    #endregion\n\n    #region Clear\n    /// <summary>\n    ///     Clears the object and sets all the properties to their default values\n    /// </summary>\n    private void Clear()\n    {\n        // Create empty lists as defaults. We do not like null values\n        // List with an initial capacity set to zero will be replaced\n        // when a corrosponding header is found\n        RawHeaders = new Dictionary<string, List<string>>();\n        CustomHeaders = new Dictionary<string, List<string>>();\n        Keywords = new List<string>();\n        DispositionNotificationTo = new List<RfcMailAddress>();\n        Received = new List<Received>();\n        // Default importancetype is Normal (assumed if not set)\n        Importance = MailPriority.Normal;\n        // 7BIT is the default ContentTransferEncoding (assumed if not set)\n        ContentTransferEncoding = ContentTransferEncoding.SevenBit;\n        To = new List<RfcMailAddress>(0);\n        Cc = new List<RfcMailAddress>(0);\n        Bcc = new List<RfcMailAddress>(0);\n        InReplyTo = new List<string>(0);\n        References = new List<string>(0);\n\n        // text/plain; charset=us-ascii is the default ContentType\n        ContentType = new ContentType(\"text/plain; charset=us-ascii\");\n    }\n    #endregion\n\n    #region ParseHeaders\n    /// <summary>\n    ///     Parses a <see cref=\"NameValueCollection\" /> to a <see cref=\"MessageHeader\" />\n    /// </summary>\n    /// <param name=\"headers\">The collection that should be traversed and parsed</param>\n    /// <returns>A valid <see cref=\"MessageHeader\" /> object</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"headers\" /> is <see langword=\"null\" /></exception>\n    private void ParseHeaders(Dictionary<string, List<string>> headers)\n    {\n        if (headers == null)\n            throw new ArgumentNullException(nameof(headers));\n\n        // Now begin to parse the header values\n        foreach (var header in headers)\n        {\n            var headerName = header.Key;\n            foreach (var headerValue in header.Value)\n                if (headerValue != null)\n                    ParseHeader(headerName, headerValue);\n        }\n    }\n    #endregion\n\n    #region ParseHeader\n    /// <summary>\n    ///     Parses a single header and sets member variables according to it.\n    /// </summary>\n    /// <param name=\"headerName\">The name of the header</param>\n    /// <param name=\"headerValue\">The value of the header in unfolded state (only one line)</param>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     If <paramref name=\"headerName\" /> or <paramref name=\"headerValue\" /> is\n    ///     <see langword=\"null\" />\n    /// </exception>\n    private void ParseHeader(string headerName, string headerValue)\n    {\n        if (headerName == null)\n            throw new ArgumentNullException(nameof(headerName));\n\n        if (headerValue == null)\n            throw new ArgumentNullException(nameof(headerValue));\n\n        switch (headerName.ToUpperInvariant())\n        {\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.3\n            case \"TO\":\n                To = RfcMailAddress.ParseMailAddresses(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.3\n            case \"CC\":\n                Cc = RfcMailAddress.ParseMailAddresses(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.3\n            case \"BCC\":\n                Bcc = RfcMailAddress.ParseMailAddresses(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.2\n            case \"FROM\":\n                // There is only one MailAddress in the from field\n                From = RfcMailAddress.ParseMailAddress(headerValue);\n                break;\n\n            // http://tools.ietf.org/html/rfc5322#section-3.6.2\n            // The implementation here might be wrong\n            case \"REPLY-TO\":\n                // This field may actually be a list of addresses, but no\n                // such case has been encountered\n                ReplyTo = RfcMailAddress.ParseMailAddress(headerValue);\n                break;\n\n            // http://tools.ietf.org/html/rfc5322#section-3.6.2\n            case \"SENDER\":\n                Sender = RfcMailAddress.ParseMailAddress(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.5\n            // RFC 5322:\n            // The \"Keywords:\" field contains a comma-separated list of one or more\n            // words or quoted-strings.\n            // The field are intended to have only human-readable content\n            // with information about the message\n            case \"KEYWORDS\":\n                var keywordsTemp = headerValue.Split(',');\n                foreach (var keyword in keywordsTemp)\n                    Keywords.Add(Utility.RemoveQuotesIfAny(keyword.Trim()));\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.7\n            case \"RECEIVED\":\n                // Simply add the value to the list\n                Received.Add(new Received(headerValue.Trim()));\n                break;\n\n            case \"IMPORTANCE\":\n                Importance = HeaderFieldParser.ParseImportance(headerValue.Trim());\n                break;\n\n            // See http://tools.ietf.org/html/rfc3798#section-2.1\n            case \"DISPOSITION-NOTIFICATION-TO\":\n                DispositionNotificationTo = RfcMailAddress.ParseMailAddresses(headerValue);\n                break;\n\n            case \"MIME-VERSION\":\n                MimeVersion = headerValue.Trim();\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.5\n            case \"SUBJECT\":\n                Subject = EncodedWord.Decode(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.7\n            case \"RETURN-PATH\":\n                // Return-paths does not include a username, but we \n                // may still use the address parser \n                ReturnPath = RfcMailAddress.ParseMailAddress(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.4\n            // Example Message-ID\n            // <33cdd74d6b89ab2250ecd75b40a41405@nfs.eksperten.dk>\n            case \"MESSAGE-ID\":\n                MessageId = HeaderFieldParser.ParseId(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.4\n            case \"IN-REPLY-TO\":\n                InReplyTo = HeaderFieldParser.ParseMultipleIDs(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.4\n            case \"REFERENCES\":\n                References = HeaderFieldParser.ParseMultipleIDs(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc5322#section-3.6.1))\n            case \"DATE\":\n                Date = headerValue.Trim();\n                DateSent = Rfc2822DateTime.StringToDate(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc2045#section-6\n            // See ContentTransferEncoding class for more details\n            case \"CONTENT-TRANSFER-ENCODING\":\n                ContentTransferEncoding = HeaderFieldParser.ParseContentTransferEncoding(headerValue.Trim());\n                break;\n\n            // See http://tools.ietf.org/html/rfc2045#section-8\n            case \"CONTENT-DESCRIPTION\":\n                // Human description of for example a file. Can be encoded\n                ContentDescription = EncodedWord.Decode(headerValue.Trim());\n                break;\n\n            // See http://tools.ietf.org/html/rfc2045#section-5.1\n            // Example: Content-type: text/plain; charset=\"us-ascii\"\n            case \"CONTENT-TYPE\":\n                ContentType = HeaderFieldParser.ParseContentType(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc2183\n            case \"CONTENT-DISPOSITION\":\n                ContentDisposition = HeaderFieldParser.ParseContentDisposition(headerValue);\n                break;\n\n            // See http://tools.ietf.org/html/rfc2045#section-7\n            // Example: <foo4*foo1@bar.net>\n            case \"CONTENT-ID\":\n                ContentId = HeaderFieldParser.ParseId(headerValue);\n                break;\n\n            default:\n                // This is an unknown header\n\n                // Custom headers are allowed. That means headers\n                // that are not mentionen in the RFC.\n                // Such headers start with the letter \"X\"\n                // We do not have any special parsing of such\n\n                // Add it to custom headers\n                if (CustomHeaders.ContainsKey(headerName))\n                    CustomHeaders[headerName].Add(headerValue);\n                else\n                    CustomHeaders.Add(headerName, new List<string> { headerValue });\n\n                break;\n        }\n    }\n    #endregion\n\n    #region HeaderValue\n    /// <summary>\n    ///     Returns the value(s) of the header, <c>null</c> will be returned when the\n    ///     header does not exist\n    /// </summary>\n    /// <param name=\"headerName\">The name of the header</param>\n    public string HeaderValue(string headerName)\n    {\n        return RawHeaders.ContainsKey(headerName) ? string.Join(Environment.NewLine, RawHeaders[headerName]) : null;\n    }\n    #endregion\n\n    #region SetHeaderValue\n    /// <summary>\n    ///     Adds a single header or updates it if it already exists\n    /// </summary>\n    /// <param name=\"headerName\">The name of the header</param>\n    /// <param name=\"headerValue\">The value for the header</param>\n    public void SetHeaderValue(string headerName, string headerValue)\n    {\n        if (!RawHeaders.ContainsKey(headerName))\n            RawHeaders.Add(headerName, new List<string> { headerValue });\n        else\n            RawHeaders[headerName] = new List<string> { headerValue };\n\n        ParseHeader(headerName, headerValue);\n    }\n    #endregion\n\n    #region ToString\n    /// <summary>\n    ///     Returns the headers as a string\n    /// </summary>\n    /// <returns></returns>\n    public override string ToString()\n    {\n        if (RawHeaders == null)\n            return string.Empty;\n\n        var result = new StringBuilder();\n\n        foreach (var header in RawHeaders)\n            result.AppendLine($\"{header.Key}: {string.Join(Environment.NewLine, header.Value)}\");\n\n        return result.ToString();\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Header/Received.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing MsgKit.Mime.Decode;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     Class that hold information about one \"Received:\" header line.<br />\n///     <br />\n///     Visit these RFCs for more information:<br />\n///     <see href=\"http://tools.ietf.org/html/rfc5321#section-4.4\">RFC 5321 section 4.4</see><br />\n///     <see href=\"http://tools.ietf.org/html/rfc4021#section-3.6.7\">RFC 4021 section 3.6.7</see><br />\n///     <see href=\"http://tools.ietf.org/html/rfc2822#section-3.6.7\">RFC 2822 section 3.6.7</see><br />\n///     <see href=\"http://tools.ietf.org/html/rfc2821#section-4.4\">RFC 2821 section 4.4</see><br />\n/// </summary>\npublic class Received\n{\n    #region Received\n    /// <summary>\n    ///     Parses a Received header value.\n    /// </summary>\n    /// <param name=\"headerValue\">The value for the header to be parsed</param>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     <exception cref=\"ArgumentNullException\">If <paramref name=\"headerValue\" /> is <see langword=\"null\" /></exception>\n    /// </exception>\n    public Received(string headerValue)\n    {\n        // Remember the raw input if someone whishes to use it\n        Raw = headerValue ?? throw new ArgumentNullException(nameof(headerValue));\n\n        // Default Date value\n        Date = DateTime.MinValue;\n\n        // The date part is the last part of the string, and is preceeded by a semicolon\n        // Some emails forgets to specify the date, therefore we need to check if it is there\n        if (headerValue.Contains(\";\"))\n        {\n            var datePart = headerValue.Substring(headerValue.LastIndexOf(\";\", StringComparison.Ordinal) + 1);\n            Date = Rfc2822DateTime.StringToDate(datePart);\n        }\n\n        Names = ParseDictionary(headerValue);\n    }\n    #endregion\n\n    #region ParseDictionary\n    /// <summary>\n    ///     Parses the Received header name-value-list into a dictionary.\n    /// </summary>\n    /// <param name=\"headerValue\">The full header value for the Received header</param>\n    /// <returns>A dictionary where the name-value-list has been parsed into</returns>\n    private static Dictionary<string, string> ParseDictionary(string headerValue)\n    {\n        var dictionary = new Dictionary<string, string>();\n\n        // Remove the date part from the full headerValue if it is present\n        var headerValueWithoutDate = headerValue;\n        if (headerValue.Contains(\";\"))\n            headerValueWithoutDate =\n                headerValue.Substring(0, headerValue.LastIndexOf(\";\", StringComparison.Ordinal));\n\n        // Reduce any whitespace character to one space only\n        headerValueWithoutDate = Regex.Replace(headerValueWithoutDate, @\"\\s+\", \" \");\n\n        // The regex below should capture the following:\n        // The name consists of non-whitespace characters followed by a whitespace and then the value follows.\n        // There are multiple cases for the value part:\n        //   1: Value is just some characters not including any whitespace\n        //   2: Value is some characters, a whitespace followed by an unlimited number of\n        //      parenthesized values which can contain whitespaces, each delimited by whitespace\n        //\n        // Cheat sheet for regex:\n        // \\s means every whitespace character\n        // [^\\s] means every character except whitespace characters\n        // +? is a non-greedy equivalent of +\n        const string pattern = @\"(?<name>[^\\s]+)\\s(?<value>[^\\s]+(\\s\\(.+?\\))*)\";\n\n        // Find each match in the string\n        var matches = Regex.Matches(headerValueWithoutDate, pattern);\n        foreach (Match match in matches)\n        {\n            // Add the name and value part found in the matched result to the dictionary\n            var name = match.Groups[\"name\"].Value;\n            var value = match.Groups[\"value\"].Value;\n\n            // Check if the name is really a comment.\n            // In this case, the first entry in the header value\n            // is a comment\n            if (name.StartsWith(\"(\"))\n                continue;\n\n            // Only add the first name pair\n            // All subsequent pairs are ignored, as they are invalid anyway\n            if (!dictionary.ContainsKey(name))\n                dictionary.Add(name, value);\n        }\n\n        return dictionary;\n    }\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     The date of this received line.\n    ///     Is <see cref=\"DateTime.MinValue\" /> if not present in the received header line.\n    /// </summary>\n    public DateTime Date { get; }\n\n    /// <summary>\n    ///     A dictionary that contains the names and values of the\n    ///     received header line.<br />\n    ///     If the received header is invalid and contained one name\n    ///     multiple times, the first one is used and the rest is ignored.\n    /// </summary>\n    /// <example>\n    ///     If the header lines looks like:\n    ///     <code>\n    /// from sending.com (localMachine [127.0.0.1]) by test.net (Postfix)\n    /// </code>\n    ///     then the dictionary will contain two keys: \"from\" and \"by\" with the values\n    ///     \"sending.com (localMachine [127.0.0.1])\" and \"test.net (Postfix)\".\n    /// </example>\n    public Dictionary<string, string> Names { get; }\n\n    /// <summary>\n    ///     The raw input string that was parsed into this class.\n    /// </summary>\n    public string Raw { get; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Mime/Header/RfcMailAddress.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Mail;\nusing MsgKit.Mime.Decode;\n\nnamespace MsgKit.Mime.Header;\n\n/// <summary>\n///     This class is used for RFC compliant email addresses.<br />\n///     <br />\n///     The class cannot be instantiated from outside the library.\n/// </summary>\n/// <remarks>\n///     The <seealso cref=\"MailAddress\" /> does not cover all the possible formats\n///     for <a href=\"http://tools.ietf.org/html/rfc5322#section-3.4\">RFC 5322 section 3.4</a> compliant email addresses.\n///     This class is used as an address wrapper to account for that deficiency.\n/// </remarks>\npublic class RfcMailAddress\n{\n    #region ToString\n    /// <summary>\n    ///     A string representation of the <see cref=\"RfcMailAddress\" /> object\n    /// </summary>\n    /// <returns>Returns the string representation for the object</returns>\n    public override string ToString()\n    {\n        return HasValidMailAddress ? MailAddress.ToString() : Raw;\n    }\n    #endregion\n\n    #region Properties\n    /// <summary>\n    ///     The email address of this <see cref=\"RfcMailAddress\" /><br />\n    ///     It is possibly string.Empty since RFC mail addresses does not require an email address specified.\n    /// </summary>\n    /// <example>\n    ///     Example header with email address:<br />\n    ///     To: <c>Test test@mail.com</c><br />\n    ///     Address will be <c>test@mail.com</c><br />\n    /// </example>\n    /// <example>\n    ///     Example header without email address:<br />\n    ///     To: <c>Test</c><br />\n    ///     Address will be <see cref=\"string.Empty\" />.\n    /// </example>\n    public string Address { get; }\n\n    /// <summary>\n    ///     The display name of this <see cref=\"RfcMailAddress\" /><br />\n    ///     It is possibly <see cref=\"string.Empty\" /> since RFC mail addresses does not require a display name to be\n    ///     specified.\n    /// </summary>\n    /// <example>\n    ///     Example header with display name:<br />\n    ///     To: <c>Test test@mail.com</c><br />\n    ///     DisplayName will be <c>Test</c>\n    /// </example>\n    /// <example>\n    ///     Example header without display name:<br />\n    ///     To: <c>test@test.com</c><br />\n    ///     DisplayName will be <see cref=\"string.Empty\" />\n    /// </example>\n    public string DisplayName { get; }\n\n    /// <summary>\n    ///     This is the Raw string used to describe the <see cref=\"RfcMailAddress\" />.\n    /// </summary>\n    public string Raw { get; }\n\n    /// <summary>\n    ///     The <see cref=\"MailAddress\" /> associated with the <see cref=\"RfcMailAddress\" />.\n    /// </summary>\n    /// <remarks>\n    ///     The value of this property can be <see lanword=\"null\" /> in instances where the <see cref=\"MailAddress\" /> cannot\n    ///     represent the address properly.<br />\n    ///     Use <see cref=\"HasValidMailAddress\" /> property to see if this property is valid.\n    /// </remarks>\n    public MailAddress MailAddress { get; }\n\n    /// <summary>\n    ///     Specifies if the object contains a valid <see cref=\"MailAddress\" /> reference.\n    /// </summary>\n    public bool HasValidMailAddress => MailAddress != null;\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Constructs an <see cref=\"RfcMailAddress\" /> object from a <see cref=\"MailAddress\" /> object.<br />\n    ///     This constructor is used when we were able to construct a <see cref=\"MailAddress\" /> from a string.\n    /// </summary>\n    /// <param name=\"mailAddress\">The address that <paramref name=\"raw\" /> was parsed into</param>\n    /// <param name=\"raw\">The raw unparsed input which was parsed into the <paramref name=\"mailAddress\" /></param>\n    /// <exception cref=\"ArgumentNullException\">\n    ///     If <paramref name=\"mailAddress\" /> or <paramref name=\"raw\" /> is\n    ///     <see langword=\"null\" />\n    /// </exception>\n    private RfcMailAddress(MailAddress mailAddress, string raw)\n    {\n        MailAddress = mailAddress ?? throw new ArgumentNullException(nameof(mailAddress));\n        Raw = raw ?? throw new ArgumentNullException(nameof(raw));\n        Address = mailAddress.Address;\n        DisplayName = mailAddress.DisplayName;\n    }\n\n    /// <summary>\n    ///     When we were unable to parse a string into a <see cref=\"MailAddress\" />, this constructor can be\n    ///     used. The Raw string is then used as the <see cref=\"DisplayName\" />.\n    /// </summary>\n    /// <param name=\"raw\">The raw unparsed input which could not be parsed</param>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"raw\" /> is <see langword=\"null\" /></exception>\n    private RfcMailAddress(string raw)\n    {\n        MailAddress = null;\n        Address = string.Empty;\n        DisplayName = raw ?? throw new ArgumentNullException(nameof(raw));\n        Raw = raw;\n    }\n    #endregion\n\n    #region Parsing\n    /// <summary>\n    ///     Parses an email address from a MIME header<br />\n    ///     <br />\n    ///     Examples of input:\n    ///     <c>Eksperten mailrobot &lt;noreply@mail.eksperten.dk&gt;</c><br />\n    ///     <c>\"Eksperten mailrobot\" &lt;noreply@mail.eksperten.dk&gt;</c><br />\n    ///     <c>&lt;noreply@mail.eksperten.dk&gt;</c><br />\n    ///     <c>noreply@mail.eksperten.dk</c><br />\n    ///     <br />\n    ///     It might also contain encoded text, which will then be decoded.\n    /// </summary>\n    /// <param name=\"input\">The value to parse out and email and/or a username</param>\n    /// <returns>A <see cref=\"RfcMailAddress\" /></returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"input\" /> is <see langword=\"null\" /></exception>\n    /// <remarks>\n    ///     <see href=\"http://tools.ietf.org/html/rfc5322#section-3.4\">RFC 5322 section 3.4</see> for more details on email\n    ///     syntax.<br />\n    ///     <see cref=\"EncodedWord.Decode\">For more information about encoded text</see>.\n    /// </remarks>\n    internal static RfcMailAddress ParseMailAddress(string input)\n    {\n        if (input == null)\n            throw new ArgumentNullException(nameof(input));\n\n        // Decode the value, if it was encoded\n        input = EncodedWord.Decode(input.Trim());\n\n        //Remove any redundant sets of angle brackets around the email address\n        var lastOpenAngleBracketIdx = input.LastIndexOf('<');\n        var lastCloseAngleBracketIdx = input.LastIndexOf('>');\n\n        //Find the index of the first angle bracket in this series of angle brackets, e.g \"a>b\" <<blah@email.com>> wouldn't find the angle bracket in the display name\n        var firstOpenAngleBracketIdx = lastOpenAngleBracketIdx;\n        var firstCloseAngleBracketIdx = lastCloseAngleBracketIdx;\n\n        while (firstOpenAngleBracketIdx > 0 && //There is a character before the last open angle bracket\n               input[firstOpenAngleBracketIdx - 1] ==\n               '<' && //The character before the last open angle bracket is another open angle bracket\n               input[firstCloseAngleBracketIdx - 1] == '>'\n              ) //The character before the last close angle bracket is another close angle bracket\n        {\n            //Update the first angle bracket indices\n            firstOpenAngleBracketIdx--;\n            firstCloseAngleBracketIdx--;\n        }\n\n        //If the email address in the input string is enclosed in multiple angle brackets\n        if (firstOpenAngleBracketIdx != lastOpenAngleBracketIdx)\n            input =\n                input.Substring(0,\n                    firstOpenAngleBracketIdx) + //Part before any angle brackets (display name if there is one)\n                input.Substring(lastOpenAngleBracketIdx,\n                    firstCloseAngleBracketIdx - lastOpenAngleBracketIdx +\n                    1); //actual email address, including one angle bracket either side\n\n        // Find the location of the email address\n        var indexStartEmail = input.LastIndexOf('<');\n        var indexEndEmail = input.LastIndexOf('>');\n\n        try\n        {\n            if (indexStartEmail >= 0 && indexEndEmail >= 0)\n            {\n                // Check if there is a username in front of the email address\n                var username = indexStartEmail > 0 ? input.Substring(0, indexStartEmail).Trim() : string.Empty;\n\n                // Parse out the email address without the \"<\"  and \">\"\n                indexStartEmail = indexStartEmail + 1;\n                var emailLength = indexEndEmail - indexStartEmail;\n                var emailAddress = input.Substring(indexStartEmail, emailLength).Trim();\n\n                // There has been cases where there was no emailaddress between the < and >\n                if (!string.IsNullOrEmpty(emailAddress))\n                    return new RfcMailAddress(new MailAddress(emailAddress, username), input);\n            }\n\n            // This might be on the form noreply@mail.eksperten.dk\n            // Check if there is an email, if notm there is no need to try\n            if (input.Contains(\"@\"))\n                return new RfcMailAddress(new MailAddress(input), input);\n        }\n        catch (FormatException)\n        {\n            // Sometimes invalid emails are sent, like sqlmap-user@sourceforge.net. (last period is illigal)\n        }\n\n        // It could be that the format used was simply a name\n        // which is indeed valid according to the RFC\n        // Example:\n        // Eksperten mailrobot\n        return new RfcMailAddress(input);\n    }\n\n    /// <summary>\n    ///     Parses input of the form<br />\n    ///     <c>Eksperten mailrobot &lt;noreply@mail.eksperten.dk&gt;, ...</c><br />\n    ///     to a list of RFCMailAddresses\n    /// </summary>\n    /// <param name=\"input\">The input that is a comma-separated list of EmailAddresses to parse</param>\n    /// <returns>A List of <seealso cref=\"RfcMailAddress\" /> objects extracted from the <paramref name=\"input\" /> parameter.</returns>\n    /// <exception cref=\"ArgumentNullException\">If <paramref name=\"input\" /> is <see langword=\"null\" /></exception>\n    internal static List<RfcMailAddress> ParseMailAddresses(string input)\n    {\n        if (input == null)\n            throw new ArgumentNullException(nameof(input));\n\n        // MailAddresses are split by commas\n        IEnumerable<string> mailAddresses = Utility.SplitStringWithCharNotInsideQuotes(input, ',');\n\n        // Parse each of these\n        return mailAddresses.Select(ParseMailAddress).ToList();\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/MsgKit.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n\t<TargetFrameworks>net462;netstandard2.0;netstandard2.1</TargetFrameworks>\n    <Version>3.0.4</Version>\n    <Description>MsgKit is a 100% managed C# .NET library (no PINVOKE or whatsoever) which may be used for the creation of messages (E-Mail, Appointments, Journals and Stickey Notes) that are Outlook compatible</Description>\n    <Authors>Kees van Spelde</Authors>\n    <Company>Kees van Spelde</Company>\n    <Copyright>(C) 2015-2026 Magic-Sessions</Copyright>\n\t<PackageProjectUrl>https://github.com/Sicos1977/MsgKit</PackageProjectUrl>\n    <PackageLicenseUrl></PackageLicenseUrl>\n    <PackageIconUrl></PackageIconUrl>\n    <RepositoryUrl>https://github.com/Sicos1977/MsgKit</RepositoryUrl>\n    <RepositoryType>Git</RepositoryType>\n    <PackageTags>Outlook MSG E-mail Appointment</PackageTags>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <PackageReleaseNotes>- Updated nuget packages\n</PackageReleaseNotes>\n    <SignAssembly>False</SignAssembly>\n    <AssemblyOriginatorKeyFile>MsgKit.snk</AssemblyOriginatorKeyFile>\n    <AssemblyVersion>3.0.4.0</AssemblyVersion>\n    <FileVersion>3.0.4.0</FileVersion>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PackageIcon>Outlook-icon.png</PackageIcon>\n    <LangVersion>latest</LangVersion>\n    <PackageReadmeFile>README.md</PackageReadmeFile>\n    <Title>Create MSG files from code</Title>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net45|AnyCPU'\">\n    <DocumentationFile>bin\\$(Configuration)\\MsgKit.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net45|AnyCPU'\">\n    <DocumentationFile>bin\\$(Configuration)\\MsgKit.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netstandard2|AnyCPU'\">\n    <DocumentationFile>bin\\$(Configuration)\\MsgKit.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|netstandard2.0|AnyCPU'\">\n    <DocumentationFile>bin\\$(Configuration)\\MsgKit.xml</DocumentationFile>\n  </PropertyGroup>\n  \n  <ItemGroup>\n    <PackageReference Include=\"MimeKit\" Version=\"4.16.0\" />\n    <PackageReference Include=\"OpenMcdf\" Version=\"3.1.3\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.6.3\" />\n  </ItemGroup>\n\n\t<ItemGroup>\n\t\t<None Include=\"..\\README.md\">\n\t\t  <Pack>True</Pack>\n\t\t  <PackagePath>\\</PackagePath>\n\t\t</None>\n\t\t<None Include=\"Outlook-icon.png\">\n\t\t\t<Pack>True</Pack>\n\t\t\t<PackagePath></PackagePath>\n\t\t</None>\n\t</ItemGroup>\n  \n</Project>\n"
  },
  {
    "path": "MsgKit/MsgKit.xml",
    "content": "<?xml version=\"1.0\"?>\n\n<doc>\n  <assembly>\n    <name>MsgKit</name>\n  </assembly>\n  <members>\n    <member name=\"T:MsgKit.Address\">\n      <summary>\n        A base class for <see cref=\"T:MsgKit.Sender\" />, <see cref=\"T:MsgKit.Recipient\" />,\n        <see cref=\"T:MsgKit.Receiving\" />\n        and <see cref=\"T:MsgKit.Representing\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Address._addressType\">\n      <summary>\n        The messaging user's e-mail address type\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Address.Email\">\n      <summary>\n        The E-mail address\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Address.DisplayName\">\n      <summary>\n        The displayname for the <see cref=\"P:MsgKit.Address.Email\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Address.AddressType\">\n      <summary>\n        Returns the messaging user's e-mail address type. Use <see cref=\"P:MsgKit.Address.AddressTypeString\" />\n        when this property returns <see cref=\"F:MsgKit.Enums.AddressType.Unknown\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Address.AddressTypeString\">\n      <summary>\n        Returns the <see cref=\"T:MsgKit.Enums.AddressType\" /> as a string\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Address.#ctor(System.String,System.String,MsgKit.Enums.AddressType)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Appointment\">\n      <summary>\n        Inherits from Email, because it has quite a few of the same fields\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Appointment.Location\">\n      <summary>\n        Holds the location for the Appointment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Appointment.AllDay\">\n      <summary>\n        This property specifies whether or not the event is an all-day event, as\n        specified by the user. A value of <c>true</c> indicates that the event is an all-day\n        event, in which case the start time and end time must be midnight so that the\n        duration is a multiple of 24 hours and is at least 24 hours. A value of <c>false</c>\n        or the absence of this property indicates the event is not an all-day event. The\n        client or server must not infer the value as TRUE when a user happens to create an\n        event that is 24 hours, even if the event starts and ends at midnight.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Appointment.MeetingStart\">\n      <summary>\n        Holds meeting information for the appointment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Appointment.MeetingEnd\">\n      <summary>\n        The end of the meeting\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Appointment.#ctor(MsgKit.Sender,MsgKit.Representing,System.String,System.Boolean)\">\n      <summary>\n        Sends an appointment with sender, representing, subject, draft.\n      </summary>\n      <param name=\"sender\"> Contains sender name and email. </param>\n      <param name=\"representing\">Contains who this appointment is representing. </param>\n      <param name=\"subject\"> Contains the subject for this appointment. </param>\n      <param name=\"draft\"> Is this a draft?</param>\n    </member>\n    <member name=\"M:MsgKit.Appointment.#ctor(MsgKit.Sender,System.String,System.Boolean)\">\n      <summary>\n        Used to send without the representing structure.\n      </summary>\n      <param name=\"sender\"></param>\n      <param name=\"subject\"></param>\n      <param name=\"draft\"></param>\n    </member>\n    <member name=\"M:MsgKit.Appointment.WriteToStorage\">\n      <summary>\n        Writes all the properties that are part of the <see cref=\"T:MsgKit.Appointment\" /> object either as\n        <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />'s\n        or <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />'s to the <see cref=\"P:OpenMcdf.OpenMcdf.RootStorage\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Appointment.Save(System.IO.Stream)\">\n      <summary>\n        Saves the message to the given <paramref name=\"stream\" />\n      </summary>\n      <param name=\"stream\"></param>\n    </member>\n    <member name=\"M:MsgKit.Appointment.Save(System.String)\">\n      <summary>\n        Saves the message to the given <paramref name=\"fileName\" />\n      </summary>\n      <param name=\"fileName\"></param>\n    </member>\n    <member name=\"T:MsgKit.Attachments\">\n      <summary>\n        Contains a list of <see cref=\"T:MsgKit.Attachment\" /> objects that are added to a\n        <see cref=\"T:MsgKit.Message\" />\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc842285.aspx\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Attachments.CheckAttachmentFileName(System.String,System.String)\">\n      <summary>\n        Checks if the <paramref name=\"fileName\" /> already exists in this object\n      </summary>\n      <param name=\"fileName\"></param>\n      <param name=\"contentId\"></param>\n    </member>\n    <member name=\"M:MsgKit.Attachments.WriteToStorage(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes the <see cref=\"T:MsgKit.Attachment\" /> objects to the given <paramref name=\"rootStorage\" />\n        and it will set all the needed properties\n      </summary>\n      <param name=\"rootStorage\">The root <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Attachment\" /> objects and it's\n        <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"M:MsgKit.Attachments.Add(System.String,System.Int64,System.Boolean,System.String)\">\n      <summary>\n        Adds an <see cref=\"T:MsgKit.Attachment\" /> by <see cref=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_VALUE\" />\n        (default)\n      </summary>\n      <param name=\"fileName\">The file to add with it's full path</param>\n      <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n      <param name=\"isInline\">Set to true to add the attachment inline</param>\n      <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n      <exception cref=\"T:System.IO.FileNotFoundException\">Raised when the <paramref name=\"fileName\" /> could not be found</exception>\n      <exception cref=\"T:MsgKit.Exceptions.MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n      <exception cref=\"T:System.ArgumentNullException\">\n        Raised when <paramref name=\"isInline\" /> is set to true and\n        <paramref name=\"contentId\" /> is null, white space or empty\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Attachments.Add(System.IO.Stream,System.String,System.Int64,System.Boolean,System.String)\">\n      <summary>\n        Adds an <see cref=\"T:MsgKit.Attachment\" /> stream by\n        <see cref=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_VALUE\" /> (default)\n      </summary>\n      <param name=\"stream\">The stream to the attachment</param>\n      <param name=\"fileName\">The name for the attachment</param>\n      <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n      <param name=\"isInline\">Set to true to add the attachment inline</param>\n      <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n      <exception cref=\"T:System.ArgumentNullException\">Raised when the stream is null</exception>\n      <exception cref=\"T:MsgKit.Exceptions.MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n      <exception cref=\"T:System.ArgumentNullException\">\n        Raised when <paramref name=\"isInline\" /> is set to true and\n        <paramref name=\"contentId\" /> is null, white space or empty\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Attachments.AddLink(System.IO.FileInfo,System.Int64,System.Boolean,System.String)\">\n      <summary>\n        Adds an <see cref=\"T:MsgKit.Attachment\" /> by <see cref=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_REF_ONLY\" />\n        as a link\n      </summary>\n      <param name=\"file\">The <see cref=\"T:System.IO.FileInfo\" /></param>\n      <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n      <param name=\"isInline\">Set to true to add the attachment inline</param>\n      <param name=\"contentId\">The id for the inline attachment when <paramref name=\"isInline\" /> is set to true</param>\n      <exception cref=\"T:System.IO.FileNotFoundException\">Raised when the <paramref name=\"file\" /> could not be found</exception>\n      <exception cref=\"T:MsgKit.Exceptions.MKAttachmentExists\">Raised when an attachment with the same name already exists</exception>\n      <exception cref=\"T:System.ArgumentNullException\">\n        Raised when <paramref name=\"isInline\" /> is set to true and\n        <paramref name=\"contentId\" /> is null, white space or empty\n      </exception>\n      <remarks>\n        Universal naming convention (UNC) names are recommended for fully-qualified paths, which should be used with\n        <see cref=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_REF_ONLY\" />.\n      </remarks>\n    </member>\n    <member name=\"T:MsgKit.Attachment\">\n      <summary>\n        This class represents an attachment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.Stream\">\n      <summary>\n        The stream to the attachment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.FileName\">\n      <summary>\n        The filename of the attachment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.Type\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.AttachmentType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.RenderingPosition\">\n      <summary>\n        Indicates how an attachment should be displayed in a rich text message. It can be set to an\n        offset in characters, with the first character of the message content as stored in the\n        <see cref=\"P:MsgKit.PropertyTags.PR_BODY_W\" />\n        (PidTagBody) property being offset 0, or to -1 (0xFFFFFFFF), indicating that the attachment should\n        not be rendered within the message text at all.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.IsInline\">\n      <summary>\n        True when the attachment is inline\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.ContentId\">\n      <summary>\n        The content id for an inline attachment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.IsContactPhoto\">\n      <summary>\n        Returns <c>true</c> when the attachment is a contact photo\n      </summary>\n      <remarks>\n        Only valid when the message is a contact card, otherwise always <c>false</c>\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Attachment.CreationTime\">\n      <summary>\n        Tthe date and time when the attachment was created\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Attachment.LastModificationTime\">\n      <summary>\n        The date and time when the attachment was last modified\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Attachment.#ctor(System.IO.Stream,System.String,System.DateTime,System.DateTime,MsgKit.Enums.AttachmentType,System.Int64,System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        Creates a new attachment object and sets all its properties\n      </summary>\n      <param name=\"stream\">The stream to the attachment</param>\n      <param name=\"fileName\">The attachment filename with it's full path</param>\n      <param name=\"creationTime\">The date and time when the attachment was created</param>\n      <param name=\"lastModificationTime\">The date and time when the attachment was last modified</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.AttachmentType\" /></param>\n      <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n      <param name=\"isInline\">True when the attachment is inline</param>\n      <param name=\"contentId\">The id for the attachment when <paramref name=\"isInline\" /> is set to true</param>\n      <param name=\"isContactPhoto\">Set to <c>true</c> when the attachment is a contact photo</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        Raised when <paramref name=\"isInline\" /> is set to true and\n        <paramref name=\"contentId\" /> is null, white space or empty\n      </exception>\n    </member>\n    <member\n      name=\"M:MsgKit.Attachment.#ctor(System.IO.FileInfo,MsgKit.Enums.AttachmentType,System.Int64,System.Boolean,System.String,System.Boolean)\">\n      <summary>\n        Creates a new attachment object and sets all its properties\n      </summary>\n      <param name=\"file\">The <see cref=\"T:System.IO.FileInfo\" /></param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.AttachmentType\" /></param>\n      <param name=\"renderingPosition\">Indicates how an attachment should be displayed in a rich text message</param>\n      <param name=\"isInline\">True when the attachment is inline</param>\n      <param name=\"contentId\">The id for the attachment when <paramref name=\"isInline\" /> is set to true</param>\n      <param name=\"isContactPhoto\">Set to <c>true</c> when the attachment is a contact photo</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        Raised when <paramref name=\"isInline\" /> is set to true and\n        <paramref name=\"contentId\" /> is null, white space or empty\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Attachment.GetShortFileName(System.String)\">\n      <summary>\n        This method will convert a long filename to a short dos 8.3 one\n      </summary>\n      <param name=\"fileName\">The long filename</param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Attachment.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.Int32)\">\n      <summary>\n        Writes all the string and binary <see cref=\"T:MsgKit.Structures.Property\">properties</see> as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> to the\n        given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <param name=\"index\">The <see cref=\"T:MsgKit.Attachment\" /> index</param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Attachment\" /> object and it's\n        <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Converter\">\n      <summary>\n        This class exposes some methods to convert MSG to EML and vice versa\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Converter.ConvertEmlToMsg(System.String,System.String)\">\n      <summary>\n        Converts an EML file to MSG format\n      </summary>\n      <param name=\"emlFileName\">The EML (MIME) file</param>\n      <param name=\"msgFileName\">The MSG file</param>\n    </member>\n    <member name=\"M:MsgKit.Converter.ConvertMsgToEml(System.String,System.String)\">\n      <summary>\n        Converts an MSG file to EML format\n      </summary>\n      <param name=\"msgFileName\">The MSG file</param>\n      <param name=\"emlFileName\">The EML (MIME) file</param>\n    </member>\n    <member name=\"T:MsgKit.Email\">\n      <summary>\n        A class used to make a new Outlook E-mail MSG file\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc979231.aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Email.SubjectPrefixRegex\">\n      <summary>\n        The <see cref=\"T:System.Text.RegularExpressions.Regex\" /> to find the prefix in a subject\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Email._recipients\">\n      <summary>\n        The E-mail <see cref=\"P:MsgKit.Email.Recipients\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Email._replyToRecipients\">\n      <summary>\n        The E-mail <see cref=\"P:MsgKit.Email.Recipients\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Email._attachments\">\n      <summary>\n        The E-mail <see cref=\"P:MsgKit.Email.Attachments\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Email._subject\">\n      <summary>\n        The subject of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Sender\">\n      <summary>\n        Returns the sender of the E-mail from the <see cref=\"P:MsgKit.Email.Recipients\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Representing\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the <see cref=\"P:MsgKit.Email.Sender\" />.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who is being represented by the\n        <see cref=\"P:MsgKit.Email.Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n        authorization or verification of the delegate. If no messaging user is being represented, these properties should\n        be set to the e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.Recipients\">\n      <summary>\n        Returns the E-mail <see cref=\"P:MsgKit.Email.Recipients\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.ReplyToRecipients\">\n      <summary>\n        Returns the E-mail <see cref=\"P:MsgKit.Email.Recipients\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Receiving\">\n      <summary>\n        Contains the e-mail address for the messaging user who receives the message.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who receives the message. They must\n        be set by the incoming transport provider.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.ReceivingRepresenting\">\n      <summary>\n        Contains the e-mail address for the messaging user who is represented by the\n        <see cref=\"P:MsgKit.Email.Receiving\" /> user.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who is being represented by the\n        <see cref=\"P:MsgKit.Email.Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n        authorization or verification of the delegate. If no messaging user is being represented, these properties should\n        be set to the e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.SubjectPrefix\">\n      <summary>\n        Returns the subject prefix of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Subject\">\n      <summary>\n        Returns or sets the subject of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.SubjectNormalized\">\n      <summary>\n        Returns the normalized subject of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Priority\">\n      <summary>\n        Returns or sets the <see cref=\"T:MsgKit.Enums.MessagePriority\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Importance\">\n      <summary>\n        Returns or sets the <see cref=\"T:MsgKit.Enums.MessageImportance\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.BodyText\">\n      <summary>\n        Returns or sets the text body of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.BodyHtml\">\n      <summary>\n        Returns or sets the html body of the E-mail\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.BodyRtf\">\n      <summary>\n        The compressed RTF body part\n      </summary>\n      <remarks>\n        When not set then the RTF is generated from <see cref=\"P:MsgKit.Email.BodyHtml\" /> (when this property is set)\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.BodyRtfCompressed\">\n      <summary>\n        Returns or set to <c>true</c> when <see cref=\"P:MsgKit.Email.BodyRtf\" /> is compressed\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.Attachments\">\n      <summary>\n        The E-mail <see cref=\"P:MsgKit.Email.Attachments\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.SentOn\">\n      <summary>\n        Returns or sets the UTC date and time the <see cref=\"P:MsgKit.Email.Sender\" /> has submitted the\n        <see cref=\"T:MsgKit.Message\" />\n      </summary>\n      <remarks>\n        This property has to be set to UTC datetime. When not set then the current date\n        and time is used\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.ReceivedOn\">\n      <summary>\n        Returns the UTC date and time when the <see cref=\"T:MsgKit.Message\" /> was received\n      </summary>\n      <remarks>\n        This property has to be set to UTC datetime\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.InternetMessageId\">\n      <summary>\n        Returns or sets the Internet Message Id\n      </summary>\n      <remarks>\n        Corresponds to the message ID field as specified in [RFC2822].<br /><br />\n        If set then this value will be used, when not set the value will be read from the\n        <see cref=\"P:MsgKit.Email.TransportMessageHeaders\" /> when this property is set\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.InternetReferences\">\n      <summary>\n        Returns or set the the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field\n      </summary>\n      <remarks>\n        If set then this value will be used, when not set the value will be read from the\n        <see cref=\"P:MsgKit.Email.TransportMessageHeaders\" /> when this property is set\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.InReplyToId\">\n      <summary>\n        Returns or sets the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value\n      </summary>\n      <remarks>\n        If set then this value will be used, when not set the value will be read from the\n        <see cref=\"P:MsgKit.Email.TransportMessageHeaders\" /> when this property is set\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Email.TransportMessageHeadersText\">\n      <summary>\n        Sets or returns the <see cref=\"P:MsgKit.Email.TransportMessageHeaders\" /> property as a string (text).\n        This property expects the headers as a string\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.TransportMessageHeaders\">\n      <summary>\n        Returns or sets the transport message headers. These are only present when\n        the message has been sent outside an Exchange environment to another mailserver\n        <c>null</c> will be returned when not present\n      </summary>\n      <remarks>\n        Use the <see cref=\"P:MsgKit.Email.TransportMessageHeaders\" /> property if you want to set\n        the headers directly from a string otherwise see the example code below.\n      </remarks>\n      <example>\n        <code>\n          var email = new Email();\n          email.TransportMessageHeaders = new MessageHeader();\n          // ... do something with it, for example\n          email.TransportMessageHeaders.SetHeaderValue(\"X-MY-CUSTOM-HEADER\", \"EXAMPLE VALUE\");\n        </code>\n      </example>\n    </member>\n    <member name=\"P:MsgKit.Email.Draft\">\n      <summary>\n        Returns <c>true</c> when the message is set as a draft message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.ReadRecipient\">\n      <summary>\n        Returns <c>true</c> when a read receipt is requested\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Email.MessageEditorFormat\">\n      <summary>\n        Specifies the format for an editor to use to display a message.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Email.#ctor(MsgKit.Sender,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        Creates this object and sets all the needed properties\n      </summary>\n      <param name=\"sender\">The <see cref=\"P:MsgKit.Email.Sender\" /> of the E-mail</param>\n      <param name=\"subject\">The subject of the E-mail</param>\n      <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n      <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    </member>\n    <member name=\"M:MsgKit.Email.#ctor(MsgKit.Sender,MsgKit.Representing,System.String,System.Boolean,System.Boolean)\">\n      <summary>\n        Creates this object and sets all the needed properties\n      </summary>\n      <param name=\"sender\">The <see cref=\"P:MsgKit.Email.Sender\" /> of the E-mail</param>\n      <param name=\"representing\">The <see cref=\"T:MsgKit.Representing\" /> sender of the E-mail</param>\n      <param name=\"subject\">The subject of the E-mail</param>\n      <param name=\"draft\">Set to <c>true</c> to save the E-mail as a draft message</param>\n      <param name=\"readReceipt\">Set to <c>true</c> to request a read receipt for the E-mail</param>\n    </member>\n    <member name=\"M:MsgKit.Email.SetSubject\">\n      <summary>\n        These properties are computed by message store or transport providers from the PR_SUBJECT (PidTagSubject)\n        and PR_SUBJECT_PREFIX (PidTagSubjectPrefix) properties in the following manner. If the PR_SUBJECT_PREFIX\n        is present and is an initial substring of PR_SUBJECT, PR_NORMALIZED_SUBJECT and associated properties are\n        set to the contents of PR_SUBJECT with the prefix removed. If PR_SUBJECT_PREFIX is present, but it is not\n        an initial substring of PR_SUBJECT, PR_SUBJECT_PREFIX is deleted and recalculated from PR_SUBJECT using\n        the following rule: If the string contained in PR_SUBJECT begins with one to three non-numeric characters\n        followed by a colon and a space, then the string together with the colon and the blank becomes the prefix.\n        Numbers, blanks, and punctuation characters are not valid prefix characters. If PR_SUBJECT_PREFIX is not\n        present, it is calculated from PR_SUBJECT using the rule outlined in the previous step.This property then\n        is set to the contents of PR_SUBJECT with the prefix removed.\n      </summary>\n      <remarks>\n        When PR_SUBJECT_PREFIX is an empty string, PR_SUBJECT and PR_NORMALIZED_SUBJECT are the same. Ultimately,\n        this property should be the part of PR_SUBJECT following the prefix. If there is no prefix, this property\n        becomes the same as PR_SUBJECT.\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Email.WriteToStorage\">\n      <summary>\n        Writes all the properties that are part of the <see cref=\"T:MsgKit.Email\" /> object either as\n        <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />'s\n        or <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />'s to the <see cref=\"P:OpenMcdf.OpenMcdf.RootStorage\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Email.Save(System.IO.Stream)\">\n      <summary>\n        Saves the message to the given <paramref name=\"stream\" />\n      </summary>\n      <param name=\"stream\"></param>\n    </member>\n    <member name=\"M:MsgKit.Email.Save(System.String)\">\n      <summary>\n        Saves the message to the given <paramref name=\"fileName\" />\n      </summary>\n      <param name=\"fileName\"></param>\n    </member>\n    <member name=\"M:MsgKit.Email.Dispose\">\n      <summary>\n        Disposes all the attachment streams\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.AddressBookEntryIdType\">\n      <summary>\n        An integer representing the type of the object. It MUST be one of the values from the following table.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.LocalMailUser\">\n      <summary>\n        A local mail user\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.DistributionList\">\n      <summary>\n        A distribution list\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.BulletinBoardOrPublicFolder\">\n      <summary>\n        A bulletinboard or public folder\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.AutomatedMailBox\">\n      <summary>\n        An automated mailbox\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.OrganizationalMailBox\">\n      <summary>\n        An organiztional mailbox\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.PrivateDistributionList\">\n      <summary>\n        A private distribtion list\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.RemoteMailUser\">\n      <summary>\n        A remote mail user\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.Container\">\n      <summary>\n        A container\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.Template\">\n      <summary>\n        A template\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.OneOffUser\">\n      <summary>\n        One off user\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressBookEntryIdType.Search\">\n      <summary>\n        Search\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.AddressType\">\n      <summary>\n        Contains the messaging user's e-mail address type, such as SMTP.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Unknown\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Ex\">\n      <summary>\n        Exchange\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Smtp\">\n      <summary>\n        Simple Mail Transfer Protocol\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Fax\">\n      <summary>\n        Fax\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Mhs\">\n      <summary>\n        MHS\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.Profs\">\n      <summary>\n        PROFS\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AddressType.X400\">\n      <summary>\n        X400\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.AppointmentState\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStateFlags\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc815362(v=office.15).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.asfMeeting\">\n      <summary>\n        This flag indicates that the object is a meeting object or a meeting-related object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.asfReceived\">\n      <summary>\n        This flag indicates that the represented object was received from someone else.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.asfCanceled\">\n      <summary>\n        This flag indicates that the meeting object represented by the object has been canceled.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.mtgInfo\">\n      <summary>\n        Full update.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.mtgOutOfDate\">\n      <summary>\n        A newer meeting request or meeting update was received after this one.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AppointmentState.mtgDelegatorCopy\">\n      <summary>\n        This is set on the delegator’s copy when a delegate handles meeting-related objects.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.AttachmentFlags\">\n      <summary>\n        Contains a bitmask of flags for an attachment.\n      </summary>\n      <remarks>\n        See https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/cc765876(v=office.12)\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentFlags.ATT_INVISIBLE_IN_HTML\">\n      <summary>\n        Indicates that this attachment is not available to HTML rendering applications and should be ignored in\n        Multipurpose Internet Mail Extensions (MIME) processing.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentFlags.ATT_INVISIBLE_IN_RTF\">\n      <summary>\n        Indicates that this attachment is not available to applications rendering in Rich Text Format (RTF) and should be\n        ignored by MAPI.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentFlags.ATT_MHTML_REF\">\n      <summary>\n        The Attachment object is referenced and rendered within the HTML body of the associated Message object.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.AttachmentType\">\n      <summary>\n        The type of the attachment\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc815439.aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.NO_ATTACHMENT\">\n      <summary>\n        There is no attachment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_VALUE\">\n      <summary>\n        The  <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_DATA_BIN\" /> property contains the attachment data\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_REFERENCE\">\n      <summary>\n        The <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_PATHNAME_W\" /> or\n        <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n        property contains a fully qualified path identifying the attachment to recipients with access to a common file server\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_REF_RESOLVE\">\n      <summary>\n        The <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_PATHNAME_W\" /> or\n        <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n        property contains a fully qualified path identifying the attachment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_BY_REF_ONLY\">\n      <summary>\n        The <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_PATHNAME_W\" /> or\n        <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_PATHNAME_W\" />\n        property contains a fully qualified path identifying the attachment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_EMBEDDED_MSG\">\n      <summary>\n        The  <see cref=\"P:MsgKit.PropertyTags.PR_ATTACH_DATA_OBJ\" /> (PidTagAttachDataObject) property contains an embedded object\n        that supports the IMessage interface\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.AttachmentType.ATTACH_OLE\">\n      <summary>\n        The attachment is an embedded OLE object\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MapiAccess\">\n      <summary>\n        Contains a bitmask of flags indicating the operations that are available to the client for the object.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc979218.aspx\n        This property is read-only for the client. It must be a bitwise OR of zero or more values from the following table.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_MODIFY\">\n      <summary>\n        Write\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_READ\">\n      <summary>\n        Read\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_DELETE\">\n      <summary>\n        Delete\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_CREATE_HIERARCHY\">\n      <summary>\n        Create subfolders in the folder hierarchy\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_CREATE_CONTENTS\">\n      <summary>\n        Create content messages\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiAccess.MAPI_ACCESS_CREATE_ASSOCIATED\">\n      <summary>\n        Create associated content messages\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MapiObjectType\">\n      <summary>\n        Contains the type of an object.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc815487.aspx\n        The object type contained in this property corresponds to the primary interface available for an object accessible\n        through the OpenEntry interface. It is usually obtained by consulting the lpulObjType parameter returned by the\n        appropriate OpenEntry method. When the interface is obtained in other ways, call IMAPIProp::GetProps to obtain the\n        value for this property.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_ABCONT\">\n      <summary>\n        Address book container object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_ADDRBOOK\">\n      <summary>\n        Address book object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_ATTACH\">\n      <summary>\n        Message attachment object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_DISTLIST\">\n      <summary>\n        Distribution list object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_FOLDER\">\n      <summary>\n        Folder object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_FORMINFO\">\n      <summary>\n        Form object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_MAILUSER\">\n      <summary>\n        Messaging user object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_MESSAGE\">\n      <summary>\n        Message object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_PROFSECT\">\n      <summary>\n        Profile section object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_SESSION\">\n      <summary>\n        Session object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_STATUS\">\n      <summary>\n        Status object\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MapiObjectType.MAPI_STORE\">\n      <summary>\n        Message store object\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MeetingType\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidMeetingType\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc815362(v=office.15).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgEmpty\">\n      <summary>\n        Unspecified.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgRequest\">\n      <summary>\n        nitial meeting request.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgFull\">\n      <summary>\n        Full update.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgInfo\">\n      <summary>\n        Full update.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgOutOfDate\">\n      <summary>\n        A newer meeting request or meeting update was received after this one.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MeetingType.mtgDelegatorCopy\">\n      <summary>\n        This is set on the delegator’s copy when a delegate handles meeting-related objects.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageClass\">\n      <summary>\n        The MessageClass element is an optional element that specifies the message class of this e-mail message.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee200767(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.Unknown\">\n      <summary>\n        The message type is unknown\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Note\">\n      <summary>\n        Normal e-mail message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Note_SMIME\">\n      <summary>\n        The message is encrypted and can also be signed.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Note_SMIME_MultipartSigned\">\n      <summary>\n        The message is clear signed.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Note_Receipt_SMIME\">\n      <summary>\n        The message is a secure read receipt.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Post\">\n      <summary>\n        Post.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Octel_Voice\">\n      <summary>\n        Octel voice message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Voicenotes\">\n      <summary>\n        Electronic voice notes.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Sharing\">\n      <summary>\n        Shared message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_NDR\">\n      <summary>\n        Non-delivery report for a standard message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_DR\">\n      <summary>\n        Delivery receipt for a standard message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_DELAYED\">\n      <summary>\n        Delivery receipt for a delayed message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_IPNRN\">\n      <summary>\n        Read receipt for a standard message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_IPNNRN\">\n      <summary>\n        Non-read receipt for a standard message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_SCHEDULE_MEETING_REQUEST_NDR\">\n      <summary>\n        Non-delivery report for a meeting request.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_SCHEDULE_MEETING_RESP_POS_NDR\">\n      <summary>\n        Non-delivery report for a positive meeting response (accept).\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_SCHEDULE_MEETING_RESP_TENT_NDR\">\n      <summary>\n        Non-delivery report for a Tentative meeting response.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_SCHEDULE_MEETING_CANCELED_NDR\">\n      <summary>\n        Non-delivery report for a cancelled meeting notification.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_SMIME_NDR\">\n      <summary>\n        Non-delivery report for a Secure MIME (S/MIME) encrypted and opaque-signed message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_SMIME_DR\">\n      <summary>\n        Delivery receipt for an S/MIME encrypted and opaque-signed message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_NDR\">\n      <summary>\n        Non-delivery report for an S/MIME clear-signed message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.REPORT_IPM_NOTE_SMIME_MULTIPARTSIGNED_DR\">\n      <summary>\n        Delivery receipt for an S/MIME clear-signed message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Appointment\">\n      <summary>\n        An appointment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageClass.IPM_Task\">\n      <summary>\n        Task\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageEditorFormat\">\n      <summary>\n        Specifies the format for an editor to use to display a message.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc765727.aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageEditorFormat.EDITOR_FORMAT_DONTKNOW\">\n      <summary>\n        The format for the editor to use is unknown.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageEditorFormat.EDITOR_FORMAT_PLAINTEXT\">\n      <summary>\n        The editor should display the message in plain text format.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageEditorFormat.EDITOR_FORMAT_HTML\">\n      <summary>\n        The editor should display the message in HTML format.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageEditorFormat.EDITOR_FORMAT_RTF\">\n      <summary>\n        The editor should display the message in Rich Text Format.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageFlags\">\n      <summary>\n        Contains a bitmask of flags that indicate the origin and current state of a message.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc839733(v=office.15).aspx\n        This property is a nontransmittable message property exposed at both the sending and receiving ends of a\n        transmission, with different values depending upon the client application or store provider involved. This property\n        is initialized by the client or message store provider when a message is created and saved for the first time and\n        then updated periodically by the message store provider, a transport provider, and the MAPI spooler as the message\n        is processed and its state changes.\n        This property exists on a message both before and after submission, and on all copies of the received\n        message. Although it is not a recipient property, it is exposed differently to each recipient according to whether\n        it has been read or modified by that recipient.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_READ\">\n      <summary>\n        The message is marked as having been read. This can occur as the result of a call at any time to\n        IMessage::SetReadFlag or IMAPIFolder::SetReadFlags. Clients can also set this flag by calling a message's\n        IMAPIProp::SetProps method before the message has been saved for the first time. This flag is ignored if the\n        ASSOCIATED flag is set.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_UNMODIFIED\">\n      <summary>\n        The outgoing message has not been modified since the first time that it was saved; the incoming message has not\n        been modified since it was delivered.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_SUBMIT\">\n      <summary>\n        The message is marked for sending as a result of a call to IMessage::SubmitMessage. Message store providers set\n        this flag; the client has read-only access.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_UNSENT\">\n      <summary>\n        The message is still being composed. It is saved, but has not been sent. The client or provider has read/write\n        access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter. If a client doesn't set\n        this flag by the time the message is sent, the message store provider sets it when IMessage::SubmitMessage is\n        called. Typically, this flag is cleared after the message is sent.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_HASATTACH\">\n      <summary>\n        The message has at least one attachment. This flag corresponds to the message's PR_HASATTACH (PidTagHasAttachments)\n        property. The client has read-only access to this flag.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_FROMME\">\n      <summary>\n        The messaging user sending was the messaging user receiving the message. The client or provider has read/write\n        access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter. This flag is meant to be\n        set by the transport provider.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_ASSOCIATED\">\n      <summary>\n        The message is an associated message of a folder. The client or provider has read-only access to this flag. The\n        READ flag is ignored for associated messages, which do not retain a read/unread state.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_RESEND\">\n      <summary>\n        The message includes a request for a resend operation with a nondelivery report. The client or provider has\n        read/write access to this flag until the first IMAPIProp::SaveChanges call and read-only thereafter.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_NOTIFYREAD\">\n      <summary>\n        A read report needs to be sent for the message. The client or provider has read-only access to this flag.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_NOTIFYUNREAD\">\n      <summary>\n        A nonread report needs to be sent for the message. The client or provider has read-only access to this flag.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_EVERREAD\">\n      <summary>\n        The message has been read at least once. This flag is set or cleared by the server whenever the MSGFLAG_READ flag\n        is set or cleared.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_ORIGIN_X400\">\n      <summary>\n        The incoming message arrived over an X.400 link. It originated either outside the organization or from a source the\n        gateway cannot consider trusted. The client should display an appropriate message to the user. Transport providers\n        set this flag; the client has read-only access.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_ORIGIN_INTERNET\">\n      <summary>\n        The incoming message arrived over the Internet. It originated either outside the organization or from a source the\n        gateway cannot consider trusted. The client should display an appropriate message to the user. Transport providers\n        set this flag; the client has read-only access.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFlags.MSGFLAG_ORIGIN_MISC_EXT\">\n      <summary>\n        The incoming message arrived over an external link other than X.400 or the Internet. It originated either outside\n        the organization or from a source the gateway cannot consider trusted. The client should display an appropriate\n        message to the user. Transport providers set this flag; the client has read-only access.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageFormat\">\n      <summary>\n        The messageformat to use\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFormat.TextOnly\">\n      <summary>\n        Send a plain text message body.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFormat.HtmlOnly\">\n      <summary>\n        Send an HTML message body.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageFormat.TextAndHtml\">\n      <summary>\n        Send a multipart / alternative body with both plain text and HTML.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageIconIndex\">\n      <summary>\n        Contains a number that indicates which icon to use when you display a group of e-mail objects.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc815472(v=office.15).aspx\n        This property, if it exists, is a hint to the client. The client may ignore the value of this property.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.NewMail\">\n      <summary>\n        New mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Post\">\n      <summary>\n        Post\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Other\">\n      <summary>\n        Other\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.ReadMail\">\n      <summary>\n        Read mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.UnreadMail\">\n      <summary>\n        Unread mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.SubmittedMail\">\n      <summary>\n        Submitted mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.UnsentMail\">\n      <summary>\n        Unsent mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.ReceiptMail\">\n      <summary>\n        Receipt mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RepliedMail\">\n      <summary>\n        Replied mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.ForwardedMail\">\n      <summary>\n        Forwarded mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RemoteMail\">\n      <summary>\n        Remote mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.DeliveryReceipt\">\n      <summary>\n        Delivery receipt\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.ReadReceipt\">\n      <summary>\n        Read receipt\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.NondeliveryReport\">\n      <summary>\n        Non delivery report\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.NonReadReceipt\">\n      <summary>\n        Non read receipt\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RecallSMail\">\n      <summary>\n        Recall S mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RecallFMail\">\n      <summary>\n        Recall F mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TrackingMail\">\n      <summary>\n        Tracking mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.OutOfOfficeMail\">\n      <summary>\n        Out of office mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RecallMail\">\n      <summary>\n        Recall mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TrackedMail\">\n      <summary>\n        Tracked mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Contact\">\n      <summary>\n        Contact\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.DistributionList\">\n      <summary>\n        Distribution list\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.StickyNoteBlue\">\n      <summary>\n        Sticky note blue\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.StickyNoteGreen\">\n      <summary>\n        Sticky note green\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.StickyNotePink\">\n      <summary>\n        Sticky note pink\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.StickyNoteYellow\">\n      <summary>\n        Sticky note yellow\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.StickyNoteWhite\">\n      <summary>\n        Sticky note white\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.SingleInstanceAppointment\">\n      <summary>\n        Single instance appointment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RecurringAppointment\">\n      <summary>\n        Recurring appointment\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.SingleInstanceMeeting\">\n      <summary>\n        Single instance meeting\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.RecurringMeeting\">\n      <summary>\n        Recurring meeting\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.MeetingRequest\">\n      <summary>\n        Meeting request\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Accept\">\n      <summary>\n        Accept\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Decline\">\n      <summary>\n        Decline\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Tentativly\">\n      <summary>\n        Tentativly\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.Cancellation\">\n      <summary>\n        Cancellation\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.InformationalUpdate\">\n      <summary>\n        Informational update\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TaskTask\">\n      <summary>\n        Task/task\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.UnassignedRecurringTask\">\n      <summary>\n        Unassigned recurring task\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.AssigneesTask\">\n      <summary>\n        Assignee's task\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.AssignersTask\">\n      <summary>\n        Assigner's task\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TaskRequest\">\n      <summary>\n        Task request\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TaskAcceptance\">\n      <summary>\n        Task acceptance\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.TaskRejection\">\n      <summary>\n        Task rejection\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalConversation\">\n      <summary>\n        Journal conversation\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalEmailMessage\">\n      <summary>\n        Journal e-mail message\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMeetingRequest\">\n      <summary>\n        Journal meeting request\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMeetingResponse\">\n      <summary>\n        Journal meeting response\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalTaskRequest\">\n      <summary>\n        Journal task request\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalTaskResponse\">\n      <summary>\n        Journal task response\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalNote\">\n      <summary>\n        Journal note\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalFax\">\n      <summary>\n        Journal fax\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalPhoneCall\">\n      <summary>\n        Journal phone call\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalLetter\">\n      <summary>\n        Journal letter\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMicrosoftOfficeWord\">\n      <summary>\n        Journal Microsoft Office Word\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMicrosoftOfficeExcel\">\n      <summary>\n        Journal Microsoft Office Excel\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMicrosoftOfficePowerPoint\">\n      <summary>\n        Journal Microsoft Office PowerPoint\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMicrosoftOfficeAccess\">\n      <summary>\n        Journal Microsoft Office Access\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalDocument\">\n      <summary>\n        Journal document\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMeeting\">\n      <summary>\n        Journal meeting\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalMeetingCancellation\">\n      <summary>\n        Journal meeting cancellation\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageIconIndex.JournalRemoteSession\">\n      <summary>\n        Journal remote session\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessageImportance\">\n      <summary>\n        Contains the relative priority of a message.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc815346(v=office.15).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageImportance.IMPORTANCE_LOW\">\n      <summary>\n        The message has low importance.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageImportance.IMPORTANCE_NORMAL\">\n      <summary>\n        The message has normal importance.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessageImportance.IMPORTANCE_HIGH\">\n      <summary>\n        The message has high importance.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.MessagePriority\">\n      <summary>\n        Contains a value that indicates the message sender's opinion of the importance of a message.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc765646(v=office.15).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessagePriority.PRIO_NONURGENT\">\n      <summary>\n        The message is not urgent.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessagePriority.PRIO_NORMAL\">\n      <summary>\n        The message has normal priority.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.MessagePriority.PRIO_URGENT\">\n      <summary>\n        The message is urgent.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.PropertyFlags\">\n      <summary>\n        Flags used to set on a <see cref=\"T:MsgKit.Structures.Property\" />\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee158556(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_MANDATORY\">\n      <summary>\n        If this flag is set for a property, that property MUST NOT be deleted from the .msg file\n        (irrespective of which storage it is contained in) and implementations MUST return an error\n        if any attempt is made to do so. This flag is set in circumstances where the implementation\n        depends on that property always being present in the .msg file once it is written there.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_READABLE\">\n      <summary>\n        If this flag is not set on a property, that property MUST NOT be read from the .msg file\n        and implementations MUST return an error if any attempt is made to read it. This flag is\n        set on all properties unless there is an implementation-specific reason to prevent a property\n        from being read from the .msg file.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_WRITABLE\">\n      <summary>\n        If this flag is not set on a property, that property MUST NOT be modified or deleted and\n        implementations MUST return an error if any attempt is made to do so. This flag is set in\n        circumstances where the implementation depends on the properties being writable.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.PropertyKind\">\n      <summary>\n        Kind (1 byte): The possible values for the Kind field are in the following table.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyKind.Lid\">\n      <summary>\n        The property is identified by the LID field (numerical named property)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyKind.Name\">\n      <summary>\n        The property is identified by the Name field (string named property)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyKind.NotAssociated\">\n      <summary>\n        The property does not have an associated PropertyName field.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.PropertyType\">\n      <summary>\n        The type of a property in the properties stream\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_UNSPECIFIED\">\n      <summary>\n        Any: this property type value matches any type; a server MUST return the actual type in its response. Servers\n        MUST NOT return this type in response to a client request other than NspiGetIDsFromNames or the\n        RopGetPropertyIdsFromNamesROP request ([MS-OXCROPS] section 2.2.8.1). (PT_UNSPECIFIED)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_NULL\">\n      <summary>\n        None: This property is a placeholder. (PT_NULL)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_SHORT\">\n      <summary>\n        2 bytes; a 16-bit integer (PT_I2, i2, ui2)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_LONG\">\n      <summary>\n        4 bytes; a 32-bit integer (PT_LONG, PT_I4, int, ui4)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\">\n      <summary>\n        4 bytes; a 32-bit floating point number (PT_FLOAT, PT_R4, float, r4)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_DOUBLE\">\n      <summary>\n        8 bytes; a 64-bit floating point number (PT_DOUBLE, PT_R8, r8)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_APPTIME\">\n      <summary>\n        8 bytes; a 64-bit floating point number in which the whole number part represents the number of days since\n        December 30, 1899, and the fractional part represents the fraction of a day since midnight (PT_APPTIME)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_ERROR\">\n      <summary>\n        4 bytes; a 32-bit integer encoding error information as specified in section 2.4.1. (PT_ERROR)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_BOOLEAN\">\n      <summary>\n        1 byte; restricted to 1 or 0 (PT_BOOLEAN. bool)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_OBJECT\">\n      <summary>\n        The property value is a Component Object Model (COM) object, as specified in section 2.11.1.5. (PT_OBJECT)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_I8\">\n      <summary>\n        8 bytes; a 64-bit integer (PT_LONGLONG, PT_I8, i8, ui8)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_LONGLONG\">\n      <summary>\n        8 bytes; a 64-bit integer (PT_LONGLONG, PT_I8, i8, ui8)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_UNICODE\">\n      <summary>\n        Variable size; a string of Unicode characters in UTF-16LE format encoding with terminating null character\n        (0x0000). (PT_UNICODE, string)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_STRING8\">\n      <summary>\n        Variable size; a string of multibyte characters in externally specified encoding with terminating null\n        character (single 0 byte). (PT_STRING8) ... ANSI format\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_SYSTIME\">\n      <summary>\n        8 bytes; a 64-bit integer representing the number of 100-nanosecond intervals since January 1, 1601\n        (PT_SYSTIME, time, datetime, datetime.tz, datetime.rfc1123, Date, time, time.tz)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_CLSID\">\n      <summary>\n        16 bytes; a GUID with Data1, Data2, and Data3 fields in little-endian format (PT_CLSID, UUID)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_SVREID\">\n      <summary>\n        Variable size; a 16-bit COUNT field followed by a structure as specified in section 2.11.1.4. (PT_SVREID)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_SRESTRICT\">\n      <summary>\n        Variable size; a byte array representing one or more Restriction structures as specified in section 2.12.\n        (PT_SRESTRICT)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_ACTIONS\">\n      <summary>\n        Variable size; a 16-bit COUNT field followed by that many rule (4) action (3) structures, as specified in\n        [MS-OXORULE] section 2.2.5. (PT_ACTIONS)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_BINARY\">\n      <summary>\n        Variable size; a COUNT field followed by that many bytes. (PT_BINARY)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_SHORT\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_SHORT values. (PT_MV_SHORT, PT_MV_I2, mv.i2)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_LONG\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_LONG values. (PT_MV_LONG, PT_MV_I4, mv.i4)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_FLOAT\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_FLOAT values. (PT_MV_FLOAT, PT_MV_R4, mv.float)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_DOUBLE\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_DOUBLE values. (PT_MV_DOUBLE, PT_MV_R8)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_CURRENCY\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_CURRENCY values. (PT_MV_CURRENCY, mv.fixed.14.4)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_APPTIME\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_APPTIME values. (PT_MV_APPTIME)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_LONGLONG\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_LONGLONGvalues. (PT_MV_I8, PT_MV_I8)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_TSTRING\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_UNICODE values. (PT_MV_UNICODE)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_UNICODE\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_UNICODE values. (PT_MV_UNICODE)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_STRING8\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_STRING8 values. (PT_MV_STRING8, mv.string)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_SYSTIME\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_SYSTIME values. (PT_MV_SYSTIME)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_CLSID\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_CLSID values. (PT_MV_CLSID, mv.uuid)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.PropertyType.PT_MV_BINARY\">\n      <summary>\n        Variable size; a COUNT field followed by that many PT_MV_BINARY values. (PT_MV_BINARY, mv.bin.hex)\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecipientFlags\">\n      <summary>\n        Specifies a bit field that describes the recipient status.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc815629.aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientFlags.RecipSendable\">\n      <summary>\n        The recipient is a Sendable Attendee. This flag is only used in the dispidApptUnsendableRecips\n        (PidLidAppointmentUnsendableRecipients) property.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientFlags.RecipOrganizer\">\n      <summary>\n        The RecipientRow on which this flag is set represents the meeting Organizer.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientFlags.RecipExceptionalResponse\">\n      <summary>\n        Indicates that the attendee gave a response for the exception on which this RecipientRow resides. This flag is only\n        used in a RecipientRow of an exception embedded message object of the organizer’s meeting object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientFlags.RecipExceptionalDeleted\">\n      <summary>\n        Indicates that although the RecipientRow exists, it should be treated as if the corresponding recipient does not.\n        This flag is only used in a RecipientRow of an exception embedded message object of the organizer’s meeting object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientFlags.RecipOriginal\">\n      <summary>\n        Indicates the recipient is an original attendee. This flag is only used in the dispidApptUnsendableRecips property.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecipientRowAddressType\">\n      <summary>\n        The <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowDisplayType\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.NoType\">\n      <summary>\n        No type is set\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.X500Dn\">\n      <summary>\n        X500DN\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.MsMail\">\n      <summary>\n        Ms mail\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.Smtp\">\n      <summary>\n        SMTP\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.Fax\">\n      <summary>\n        Fax\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.ProfessionalOfficeSystem\">\n      <summary>\n        Professional office system\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.PersonalDistributionList1\">\n      <summary>\n        Personal distribution list 1\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowAddressType.PersonalDistributionList2\">\n      <summary>\n        Personal distribution list 2\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecipientRowDisplayType\">\n      <summary>\n        An enumeration. This field MUST be present when the Type field\n        of the RecipientFlags field is set to X500DN(0x1) and MUST NOT be present otherwise.This\n        value specifies the display type of this address.Valid values for this field are specified in the\n        following table.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.MessagingUser\">\n      <summary>\n        A messaging user\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.DistributionList\">\n      <summary>\n        A distribution list\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.Forum\">\n      <summary>\n        A forum, such as a bulletin board service or a public or shared folder\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.AutomatedAgent\">\n      <summary>\n        An automated agent\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.AddressBook\">\n      <summary>\n        An Address Book object defined for a large group, such as helpdesk, accounting, coordinator, or\n        department\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.PrivateDistributionList\">\n      <summary>\n        A private, personally administered distribution list\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientRowDisplayType.RemoteAddressBook\">\n      <summary>\n        An Address Book object known to be from a foreign or remote messaging system\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecipientType\">\n      <summary>\n        The recipient type\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc839620(v=office.15).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.Originator\">\n      <summary>\n        The recipient is the message originator\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.To\">\n      <summary>\n        The recipient is a primary (To) recipient. Clients are required to handle primary recipients. All other types are optional.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.Cc\">\n      <summary>\n        The recipient is a carbon copy (CC) recipient, a recipient that receives a message in addition to the primary recipients.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.Bcc\">\n      <summary>\n        The recipient is a blind carbon copy (BCC) recipient. Primary and carbon copy recipients are unaware of the existence of BCC recipients.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.Resource\">\n      <summary>\n        The recipient is a resource (e.g. a room)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecipientType.Room\">\n      <summary>\n        The recipient is a room (uses PR_RECIPIENT_TYPE_EXE) needs Exchange 2007 or higher\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecurrencePatternCalendarType\">\n      <summary>\n        An integer that specifies the type of calendar that is used. The acceptable values for the calendar type are listed\n        in the following table.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.Default\">\n      <summary>\n        The default value for the calendar type is Gregorian.\n        If the value of the PatternType field is HjMonth, HjMonthNth, or HjMonthEnd and the value of the CalendarType field\n        is Default, this recurrence uses the Hijri calendar.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN\">\n      <summary>\n        Gregorian (localized) calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN_US\">\n      <summary>\n        Gregorian (U.S.) calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_JAPAN\">\n      <summary>\n        Japanese Emperor era calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_TAIWAN\">\n      <summary>\n        Taiwan calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_KOREA\">\n      <summary>\n        Korean Tangun era calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_HIJRI\">\n      <summary>\n        Hijri (Arabic Lunar) calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_THAI\">\n      <summary>\n        Thai calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_HEBREW\">\n      <summary>\n        Hebrew lunar calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN_ME_FRENCH\">\n      <summary>\n        Gregorian Middle East French calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN_ARABIC\">\n      <summary>\n        Gregorian Arabic calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN_XLIT_ENGLISH\">\n      <summary>\n        Gregorian transliterated English calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_GREGORIAN_XLIT_FRENCH\">\n      <summary>\n        Gregorian transliterated French calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_LUNAR_JAPANESE\">\n      <summary>\n        Japanese lunar calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_CHINESE_LUNAR\">\n      <summary>\n        Chinese lunar calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_SAKA\">\n      <summary>\n        Saka era calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_LUNAR_ETO_CHN\">\n      <summary>\n        Lunar ETO Chinese calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_LUNAR_ETO_KOR\">\n      <summary>\n        Lunar ETO Korean calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_LUNAR_ROKUYOU\">\n      <summary>\n        Lunar Rokuyou calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_LUNAR_KOREAN\">\n      <summary>\n        Korean lunar calendar\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternCalendarType.CAL_UMALQURA\">\n      <summary>\n        Um Al Qura calendar\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecurrencePatternFirstDOWDay\">\n      <summary>\n        An integer that specifies the day on which the calendar week begins. The default value is Sunday (0x00000000).\n        This field MUST be set to one of the values listed in the following table.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Sunday\">\n      <summary>\n        Sunday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Monday\">\n      <summary>\n        Monday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Tuesday\">\n      <summary>\n        Tuesday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Wednesday\">\n      <summary>\n        Wednesday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Thursday\">\n      <summary>\n        Thursday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Friday\">\n      <summary>\n        Friday\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFirstDOWDay.Saturday\">\n      <summary>\n        Saterday\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecurrencePatternFrequency\">\n      <summary>\n        The value and meaning of the FirstDateTime field for each type of recurrence frequency are specified in the\n        following table. For details about how the value is calculated, see section 2.2.1.44.1.1.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFrequency.Daily\">\n      <summary>\n        Daily\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFrequency.Weekly\">\n      <summary>\n        Weelky\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternFrequency.Monthly\">\n      <summary>\n        Monthly\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecurrencePatternPatternType\">\n      <summary>\n        PatternType (2 bytes): An integer that specifies the type of recurrence pattern. The valid recurrence pattern types\n        are listed in the following table.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.Day\">\n      <summary>\n        The event has a daily recurrence.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.Week\">\n      <summary>\n        The event has a weekly recurrence.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.Month\">\n      <summary>\n        The event has a monthly recurrence.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.MonthEnd\">\n      <summary>\n        The event has a month-end recurrence.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.MonthNth\">\n      <summary>\n        The event has an every nth month pattern.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.HjMonth\">\n      <summary>\n        The event has a monthly recurrence in the Hijri calendar. For this value in the PatternType field, the value of the\n        CalendarType field MUST be set to 0x0000.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.HjMonthNth\">\n      <summary>\n        The event has an every nth month pattern in the Hijri calendar. For this value in the PatternType field, the value\n        of the CalendarType field MUST be set to 0x0000.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternPatternType.HjMonthEnd\">\n      <summary>\n        The event has a month end recurrence in the Hijri calendar. For this value in the PatternType field, the value of\n        the CalendarType field MUST be set to 0x0000.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.RecurrencePatternRecurrenceRangeType\">\n      <summary>\n        EndType (4 bytes):  An integer that specifies the ending type for the recurrence. This field MUST be set to one of\n        the values listed in the following table.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternRecurrenceRangeType.EndAfterDate\">\n      <summary>\n        End after date\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternRecurrenceRangeType.EndAfterNoccurences\">\n      <summary>\n        End after N occurrences\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.RecurrencePatternRecurrenceRangeType.NeverEnd\">\n      <summary>\n        Never end\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.StoreSupportMask\">\n      <summary>\n        This property discloses the capabilities of a message store to client applications planning to send it a message.\n        The flags can facilitate decisions by a client or another store, such as whether to send PR_BODY (PidTagBody) or\n        only <see cref=\"P:MsgKit.PropertyTags.PR_RTF_COMPRESSED\" /> (PidTagRtfCompressed). A client should never set\n        <see cref=\"P:MsgKit.PropertyTags.PR_STORE_SUPPORT_MASK\" /> an attempt returns MAPI_E_COMPUTED.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_ANSI_OK\">\n      <summary>\n        The message store supports properties containing ANSI (8-bit) characters.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_ATTACH_OK\">\n      <summary>\n        The message store supports attachments (OLE or non-OLE) to messages.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_CATEGORIZE_OK\">\n      <summary>\n        The message store supports categorized views of tables.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_CREATE_OK\">\n      <summary>\n        The message store supports creation of new messages.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_ENTRYID_UNIQUE\">\n      <summary>\n        Entry identifiers for the objects in the message store are unique, that is, never reused during the life of the\n        store.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_HTML_OK\">\n      <summary>\n        The message store supports HTML messages, stored in the <see cref=\"P:MsgKit.PropertyTags.PR_HTML\" />\n        (PidTagBodyHtml)\n        property. Note that STORE_HTML_OK is not defined in versions of MAPIDEFS.H that are included with Microsoft Exchange\n        2000 Server and earlier. If your development environment uses a MAPIDEFS.H file that does not include STORE_HTML_OK,\n        use the value 0x00010000 instead.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_ITEMPROC\">\n      <summary>\n        In a wrapped PST store, indicates that when a new message arrives at the store, the store does rules and spam\n        filter processing on the message separately. The store calls IMAPISupport::Notify, setting fnevNewMail in the\n        NOTIFICATION structure that is passed as a parameter, and then passes the details of the new message to the\n        listening client. Subsequently, when the listening client receives the notification, it does not process rules on\n        the message.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_LOCALSTORE\">\n      <summary>\n        This flag is reserved and should not be used.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_MODIFY_OK\">\n      <summary>\n        The message store supports modification of its existing messages.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_MV_PROPS_OK\">\n      <summary>\n        The message store supports multivalued properties, guarantees the stability of value order in a multivalued\n        property throughout a save operation, and supports instantiation of multivalued properties in tables.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_NOTIFY_OK\">\n      <summary>\n        The message store supports notifications.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_OLE_OK\">\n      <summary>\n        The message store supports OLE attachments. The OLE data is accessible through an IStorage interface, such as that\n        available through the PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) property\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_PUBLIC_FOLDERS\">\n      <summary>\n        The folders in this store are public (multi-user), not private (possibly multi-instance but not multi-user).\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_PUSHER_OK\">\n      <summary>\n        The MAPI Protocol Handler will not crawl the store, and the store is responsible to push any changes through\n        notifications to the indexer to have messages indexed.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_READONLY\">\n      <summary>\n        All interfaces for the message store have a read-only access level.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_RESTRICTION_OK\">\n      <summary>\n        The message store supports restrictions.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_RTF_OK\">\n      <summary>\n        The message store supports Rich Text Format (RTF) messages, usually compressed, and the store itself keeps\n        <see cref=\"P:MsgKit.PropertyTags.PR_BODY_W\" /> and <see cref=\"P:MsgKit.PropertyTags.PR_RTF_COMPRESSED\" />\n        synchronized.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_SEARCH_OK\">\n      <summary>\n        The message store supports search-results folders.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_SORT_OK\">\n      <summary>\n        The message store supports sorting views of tables.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_SUBMIT_OK\">\n      <summary>\n        The message store supports marking a message for submission.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_UNCOMPRESSED_RTF\">\n      <summary>\n        The message store supports storage of RTF messages in uncompressed form. An uncompressed RTF stream is identified\n        by the value dwMagicUncompressedRTF in the stream header. The dwMagicUncompressedRTF value is defined in the\n        RTFLIB.H file\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.StoreSupportMask.STORE_UNICODE_OK\">\n      <summary>\n        The message store supports properties containing Unicode characters.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskAcceptanceState\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAcceptanceState\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc839689.aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskAcceptanceState.NotAssigned\">\n      <summary>\n        The task is not assigned.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskAcceptanceState.Unknow\">\n      <summary>\n        The task’s acceptance status is unknown.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskAcceptanceState.Accepted\">\n      <summary>\n        The task assignee accepted the task. This value is set when the client processes a task acceptance.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskAcceptanceState.Refused\">\n      <summary>\n        The task assignee rejected the task. This value is set when the client processes a task rejection.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskHistory\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskHistory\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee160354(v=EXCHG.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.NoChange\">\n      <summary>\n        No changes were made.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.Accepted\">\n      <summary>\n        The task assignee accepted this Task object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.Rejected\">\n      <summary>\n        The task assignee rejected this Task object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.Modified\">\n      <summary>\n        Another property was changed.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.DueDateModified\">\n      <summary>\n        The PidLidTaskDueDate property(section 2.2.2.2.5) changed.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskHistory.Assigned\">\n      <summary>\n        The Task object has been assigned to a task assignee.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskMode\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskMode\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee178286(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.NotAssigned\">\n      <summary>\n        The Task object is not assigned.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.Requests\">\n      <summary>\n        The Task object is embedded in a task request.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.Accepted\">\n      <summary>\n        The Task object has been accepted by the task assignee.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.Rejected\">\n      <summary>\n        The Task object was rejected by the task assignee.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.Update\">\n      <summary>\n        The Task object is embedded in a task update.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMode.SelfDelegation\">\n      <summary>\n        The Task object was assigned to the task assigner (self-delegation).\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskMultipleRecipients\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskMultipleRecipients\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee218493(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMultipleRecipients.Sent\">\n      <summary>\n        The Task object has multiple primary recipients.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskMultipleRecipients.Received\">\n      <summary>\n        Although the \"Sent\" flag was not set, the client detected that the Task object has multiple primary recipients.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskOwnership\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskOwnership\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee204243(v=EXCHG.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskOwnership.NotAssigned\">\n      <summary>\n        The Task object is not assigned.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskOwnership.Assigner\">\n      <summary>\n        The Task object is the task assigner's copy of the Task object.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskOwnership.Assignee\">\n      <summary>\n        The Task object is the task assignee's copy of the Task object.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskState\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskState\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/cc765590(v=office.12).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskState.NotFound\">\n      <summary>\n        This task was created to correspond to a task that was embedded in a task rejection but could not be found locally.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskState.NotAssigned\">\n      <summary>\n        The task is not assigned.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskState.AssigneeCopy\">\n      <summary>\n        The task is the task assignee’s copy of an assigned task.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskState.AssignerCopy\">\n      <summary>\n        The task is the task assigner’s copy of an assigned task.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskState.AssignerCopyRejected\">\n      <summary>\n        The task is the task assigner’s copy of a rejected task.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Enums.TaskStatus\">\n      <summary>\n        Valid values for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTaskStatus\" /> property\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee159828(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskStatus.NotStarted\">\n      <summary>\n        The user has not started work on the Task object. If the property is set to this value, the value of the\n        PidLidPercentComplete property (section 2.2.2.2.3) MUST be 0.0.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskStatus.InProgress\">\n      <summary>\n        The user's work on this Task object is in progress. If the property is set to this value, the value of the\n        PidLidPercentComplete property MUST be greater than 0.0 and less than 1.0.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskStatus.Completed\">\n      <summary>\n        The user's work on this Task object is complete. If the property is set to this value, the value of the\n        PidLidPercentComplete property MUST be 1.0, the value of the PidLidTaskDateCompleted property (section 2.2.2.2.9)\n        MUST be the current date, and the value of the PidLidTaskComplete property (section 2.2.2.2.20) MUST be 0x01.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskStatus.Waiting\">\n      <summary>\n        The user is waiting on somebody else.\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Enums.TaskStatus.Deferred\">\n      <summary>\n        The user has deferred work on the Task object.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Exceptions.MKAttachment\">\n      <summary>\n        Raised when an attachment exception occurs\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Exceptions.MKAttachmentExists\">\n      <summary>\n        Raised when an attachment with the same name already exists\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n      <summary>\n        Raised when a property is invalid\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Exceptions.MKMessageSaved\">\n      <summary>\n        Raised when somebody tries to modify a mesage when it already has been saved\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Exceptions.MKPropertyNotFound\">\n      <summary>\n        Raised when a property is not found\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Helpers.Conversion\">\n      <summary>\n        This class contains conversion related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Conversion.ObjectToByteArray(System.Object)\">\n      <summary>\n        Converts an object to an byte array\n      </summary>\n      <param name=\"obj\">The object to convert</param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Conversion.ByteArrayToObject(System.Byte[])\">\n      <summary>\n        Converts a byte array to an Object\n      </summary>\n      <param name=\"array\">The byte array</param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Helpers.Crc32Calculator\">\n      <summary>\n        This class is used to calculate CRC32. Of a byte buffer.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Helpers.EmailAddress\">\n      <summary>\n        This class contains E-mail related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.EmailAddress.IsEmailAddressValid(System.String)\">\n      <summary>\n        Return true when the E-mail address is valid\n      </summary>\n      <param name=\"emailAddress\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.EmailAddress.RemoveSingleQuotes(System.String)\">\n      <summary>\n        Removes trailing en ending single quotes from an E-mail address when they exist\n      </summary>\n      <param name=\"email\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Helpers.Exception\">\n      <summary>\n        This class contains exception related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Exception.GetInnerException(System.Exception)\">\n      <summary>\n        Get the complete inner exception tree\n      </summary>\n      <param name=\"e\">The exception object</param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Helpers.FileManager\">\n      <summary>\n        This class contains file management functions that are not available in the .NET framework\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Helpers.FileManager.MaxPath\">\n      <summary>\n        The max path length in Windows\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.CheckForBackSlash(System.String)\">\n      <summary>\n        Check if there is a backslash at the end of the string and if not add it\n      </summary>\n      <param name=\"line\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.ValidateLongFileName(System.String,System.Int32)\">\n      <summary>\n        Validates the length of <paramref name=\"fileName\" />, when this is longer then\n        <see cref=\"F:MsgKit.Helpers.FileManager.MaxPath\" /> chars it will be truncated.\n      </summary>\n      <param name=\"fileName\">The filename with path</param>\n      <param name=\"extraTruncateSize\">Optional extra truncate size, when not used the filename is truncated until it fits</param>\n      <returns></returns>\n      <exception cref=\"T:System.ArgumentException\">\n        Raised when no path or file name is given in the\n        <paramref name=\"fileName\" />\n      </exception>\n      <exception cref=\"T:System.IO.PathTooLongException\">\n        Raised when it is not possible to truncate the\n        <paramref name=\"fileName\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.GetExtension(System.String)\">\n      <summary>\n        Returns the extension of the specified <paramref name=\"path\" /> string\n      </summary>\n      <param name=\"path\">The path of the file</param>\n      <returns></returns>\n      <exception cref=\"T:System.ArgumentException\">Raised when no path is given</exception>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.GetFileNameWithoutExtension(System.String)\">\n      <summary>\n        Returns the file name of the specified <paramref name=\"path\" /> string without the extension\n      </summary>\n      <param name=\"path\">The path of the file</param>\n      <returns></returns>\n      <exception cref=\"T:System.ArgumentException\"></exception>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.GetDirectoryName(System.String)\">\n      <summary>\n        Returns the directory information for the specified <paramref name=\"path\" /> string\n      </summary>\n      <param name=\"path\">The path of a file or directory</param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.FileExistsMakeNew(System.String,System.Boolean,System.Int32)\">\n      <summary>\n        Checks if a file already exists and if so adds a number until the file is unique\n      </summary>\n      <param name=\"fileName\">The file to check</param>\n      <param name=\"validateLongFileName\">When true validation will be performed on the max path lengt</param>\n      <param name=\"extraTruncateSize\"></param>\n      <returns></returns>\n      <exception cref=\"T:System.ArgumentException\">\n        Raised when no path or file name is given in the\n        <paramref name=\"fileName\" />\n      </exception>\n      <exception cref=\"T:System.IO.PathTooLongException\">\n        Raised when it is not possible to truncate the\n        <paramref name=\"fileName\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.RemoveInvalidFileNameChars(System.String)\">\n      <summary>\n        Removes illegal filename characters\n      </summary>\n      <param name=\"fileName\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.FileManager.GetFileSizeString(System.Double)\">\n      <summary>\n        Gives the size of a file in Windows format (GB, MB, KB, Bytes)\n      </summary>\n      <param name=\"bytes\">Filesize in bytes</param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Helpers.Mapi\">\n      <summary>\n        This class contains MAPI related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Mapi.GenerateSearchKey(System.String,System.String)\">\n      <summary>\n        A search key is used to compare the data in two objects. An object's search key is stored in its\n        <see cref=\"P:MsgKit.PropertyTags.PR_SEARCH_KEY\" /> (PidTagSearchKey) property. Because a search key\n        represents an object's data and not the object itself, two different objects with the same data can have the same\n        search key. When an object is copied, for example, both the original object and its copy have the same data and the\n        same search key. Messages and messaging users have search keys. The search key of a message is a unique identifier\n        of  the message's data. Message store providers furnish a message's\n        <see cref=\"P:MsgKit.PropertyTags.PR_SEARCH_KEY\" />\n        property at message creation time.The search key of an address book entry is computed from its address type(\n        <see cref=\"P:MsgKit.PropertyTags.PR_ADDRTYPE_W\" /> (PidTagAddressType)) and address\n        (<see cref=\"P:MsgKit.PropertyTags.PR_EMAIL_ADDRESS_W\" /> (PidTagEmailAddress)). If the address book entry is writable,\n        its search key might not be available until the address type and address have been set by using the\n        IMAPIProp::SetProps method and the entry has been saved by using the IMAPIProp::SaveChanges method.When these\n        address properties change, it is possible for the corresponding search key not to be synchronized with the new\n        values until the changes have been committed with a SaveChanges call. The value of an object's record key can be\n        the same as or different than the value of its search key, depending on the service provider. Some service providers\n        use the same value for an object's search key, record key, and entry identifier.Other service providers assign unique\n        values for each of its objects identifiers.\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Mapi.GenerateRecordKey\">\n      <summary>\n        A record key is used to compare two objects. Message store and address book objects must have record keys, which\n        are stored in their <see cref=\"P:MsgKit.PropertyTags.PR_RECORD_KEY\" /> (PidTagRecordKey) property. Because a record key\n        identifies an object and not its data, every instance of an object has a unique record key. The scope of a record\n        key for folders and messages is the message store. The scope for address book containers, messaging users, and\n        distribution lists is the set of top-level containers provided by MAPI for use in the integrated address book.\n        Record keys can be duplicated in another resource. For example, different messages in two different message stores\n        can have the same record key. This is different from long-term entry identifiers; because long-term entry\n        identifiers contain a reference to the service provider, they have a wider scope.A message store's record key is\n        similar in scope to a long-term entry identifier; it should be unique across all message store providers. To ensure\n        this uniqueness, message store providers typically set their record key to a value that is the combination of their\n        <see cref=\"P:MsgKit.PropertyTags.PR_MDB_PROVIDER\" /> (PidTagStoreProvider) property and an identifier that is unique to the\n        message store.\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Mapi.GenerateInstanceKey\">\n      <summary>\n        This property is a binary value that uniquely identifies a row in a table view. It is a required column in most\n        tables. If a row is included in two views, there are two different instance keys. The instance key of a row may\n        differ each time the table is opened, but remains constant while the table is open. Rows added while a table is in\n        use do not reuse an instance key that was previously used.\n        message store.\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Mapi.GenerateEntryId\">\n      <summary>\n        The PR_ENTRYID property contains a MAPI entry identifier used to open and edit properties of a particular MAPI\n        object.\n      </summary>\n      <remarks>\n        The PR_ENTRYID property identifies an object for OpenEntry to instantiate and provides access to all of its\n        properties through the appropriate derived interface of IMAPIProp. PR_ENTRYID is one of the base address properties\n        for all messaging users. The PR_ENTRYID for CEMAPI always contains long-term identifiers. <br />\n        - Required on folder objects <br />\n        - Required on message store objects <br />\n        - Required on status objects  <br />\n        - Changed in a copy operation <br />\n        - Unique within entire world\n      </remarks>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Helpers.MimeTypes\">\n      <summary>\n        A mapping of file name extensions to the corresponding MIME-type.\n      </summary>\n      <remarks>\n        A mapping of file name extensions to the corresponding MIME-type.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Helpers.MimeTypes.mimeTypes\">\n      <summary>\n        A dictionary of mimetypes\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.MimeTypes.GetMimeType(System.String)\">\n      <summary>\n        Gets the MIME-type of the file.\n      </summary>\n      <remarks>\n        Gets the MIME-type of the file based on the file extension.\n      </remarks>\n      <returns>The MIME-type.</returns>\n      <param name=\"fileName\">The file name.</param>\n      <exception>\n        <cref>System.ArgumentNullException</cref>\n        <paramref name=\"fileName\" /> is <c>null</c>.\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Helpers.RtfCompressor\">\n      <summary>\n        Used to compress RTF using LZFu by Microsoft.  Can be viewed in the [MS-OXRTFCP].pdf document.\n        https://msdn.microsoft.com/en-us/library/cc463890(v=exchg.80).aspx\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Helpers.RtfCompressor.CompressionPositions\">\n      <summary>\n        Holder for compression positions, aren't relevant to other parts of the project thus inside of RTFCompressor class.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.RtfCompressor.FindLongestMatch(System.Byte[],System.IO.BinaryReader,System.Int32)\">\n      <summary>\n        Helper function\n      </summary>\n      <param name=\"initialDictionary\">Part of the MS-OXRTFCP spec. </param>\n      <param name=\"streamReader\">BinaryReader which is pointing at the input data. </param>\n      <param name=\"writeOffset\">Write offset</param>\n      <returns> CompressionPositions class containing DictionaryOffset, LongestMatchLength, WriteOffset</returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.RtfCompressor.Compress(System.Byte[])\">\n      <summary>\n        Takes in data, compresses it using LZFu. Returns the data as a byte array.\n      </summary>\n      <param name=\"data\">Byte array containing data to be compressed.</param>\n      <returns>Byte array containing the data that is compressed.</returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Storage.Copy(OpenMcdf.OpenMcdf.Storage,OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Copies the given <paramref name=\"source\" /> to the given <paramref name=\"destination\" />\n      </summary>\n      <param name=\"source\"></param>\n      <param name=\"destination\"></param>\n    </member>\n    <member name=\"T:MsgKit.Helpers.StreamUtility\">\n      <summary>\n        This class contains stream related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.StreamUtility.ToByteArray(System.IO.Stream)\">\n      <summary>\n        Returns the stream as an byte array\n      </summary>\n      <param name=\"input\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.StreamUtility.Eos(System.IO.BinaryReader)\">\n      <summary>\n        Returns true when the end of the <see cref=\"P:System.IO.BinaryReader.BaseStream\" /> has been reached\n      </summary>\n      <param name=\"binaryReader\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.StreamUtility.ReadLineAsBytes(System.IO.Stream)\">\n      <summary>\n        Read a line from the stream.\n        A line is interpreted as all the bytes read until a CRLF or LF is encountered.<br />\n        CRLF pair or LF is not included in the string.\n      </summary>\n      <param name=\"stream\">The stream from which the line is to be read</param>\n      <returns>\n        A line read from the stream returned as a byte array or <see langword=\"null\" /> if no bytes were readable from the stream\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"stream\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Helpers.StreamUtility.ReadLineAsAscii(System.IO.Stream)\">\n      <summary>\n        Read a line from the stream. <see cref=\"M:MsgKit.Helpers.StreamUtility.ReadLineAsBytes(System.IO.Stream)\" />\n        for more documentation.\n      </summary>\n      <param name=\"stream\">The stream to read from</param>\n      <returns>A line read from the stream or <see langword=\"null\" /> if nothing could be read from the stream</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"stream\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Helpers.Strings\">\n      <summary>\n        This class contains string related helper methods\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.ReadNullTerminatedString(System.IO.BinaryReader,System.Boolean)\">\n      <summary>\n        Reads from the <paramref name=\"binaryReader\" /> until a null terminated char is read\n      </summary>\n      <param name=\"binaryReader\"></param>\n      <param name=\"unicode\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.ReadNullTerminatedAsciiString(System.IO.BinaryReader)\">\n      <summary>\n        Reads from the <paramref name=\"binaryReader\" /> until a null terminated char is read\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.ReadNullTerminatedUnicodeString(System.IO.BinaryReader)\">\n      <summary>\n        Reads from the <paramref name=\"binaryReader\" /> until a null terminated char is read\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n      <returns></returns>\n    </member>\n    <member\n      name=\"M:MsgKit.Helpers.Strings.WriteNullTerminatedString(System.IO.BinaryWriter,System.String,System.Boolean)\">\n      <summary>\n        Writes the given <paramref name=\"str\" /> to the <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n      <param name=\"str\">The string to write</param>\n      <param name=\"unicode\"></param>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.WriteNullTerminatedAsciiString(System.IO.BinaryWriter,System.String)\">\n      <summary>\n        Writes the given <paramref name=\"str\" /> to the <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n      <param name=\"str\">The string to write</param>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.WriteNullTerminatedUnicodeString(System.IO.BinaryWriter,System.String)\">\n      <summary>\n        Writes the given <paramref name=\"str\" /> to the <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n      <param name=\"str\">The string to write</param>\n    </member>\n    <member name=\"M:MsgKit.Helpers.Strings.GetEscapedRtf(System.String)\">\n      <summary>\n        Returns the <paramref name=\"str\" /> as an escaped RTF string\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Message\">\n      <summary>\n        The base class for all the different types of Outlook MSG files\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Message._saved\">\n      <summary>\n        A flag to keep track if the message already has been saved\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Message.CompoundFile\">\n      <summary>\n        The <see cref=\"P:MsgKit.Message.CompoundFile\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Message.Class\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.MessageClass\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Message.ClassAsString\">\n      <summary>\n        Returns <see cref=\"F:MsgKit.Message.Class\" /> as a string that is written into the MSG file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Message.IconIndex\">\n      <summary>\n        Contains a number that indicates which icon to use when you display a group\n        of e-mail objects. Default set to <see cref=\"F:MsgKit.Enums.MessageIconIndex.NewMail\" />\n      </summary>\n      <remarks>\n        This property, if it exists, is a hint to the client. The client may ignore the\n        value of this property.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Message.MessageSize\">\n      <summary>\n        The size of the message\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Message.TopLevelProperties\">\n      <summary>\n        The <see cref=\"F:MsgKit.Message.TopLevelProperties\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Message.NamedProperties\">\n      <summary>\n        The <see cref=\"F:MsgKit.Message.NamedProperties\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Message.#ctor\">\n      <summary>\n        Creates this object and sets all it's properties\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Message.Save(System.String)\">\n      <summary>\n        Saves the message to the given <paramref name=\"fileName\" />\n      </summary>\n      <param name=\"fileName\"></param>\n    </member>\n    <member name=\"M:MsgKit.Message.Save(System.IO.Stream)\">\n      <summary>\n        Saves the message to the given <paramref name=\"stream\" />\n      </summary>\n      <param name=\"stream\"></param>\n    </member>\n    <member name=\"M:MsgKit.Message.AddProperty(MsgKit.PropertyTag,System.Object,MsgKit.Enums.PropertyFlags)\">\n      <summary>\n        Adds a custom property to the message or replaces it when it already exists\n      </summary>\n      <param name=\"propertyTag\">\n        <see cref=\"T:MsgKit.PropertyTag\" />\n      </param>\n      <param name=\"value\">The value of the property</param>\n      <param name=\"flags\">\n        <see cref=\"T:MsgKit.Enums.PropertyFlags\" />\n      </param>\n      <exception cref=\"T:MsgKit.Exceptions.MKMessageSaved\">Raised when the mesage has already been saved with the Save method</exception>\n    </member>\n    <member name=\"M:MsgKit.Message.Dispose\">\n      <summary>\n        Disposes this object and all its resources\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.Base64\">\n      <summary>\n        Utility class for dealing with Base64 encoded strings\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Base64.Decode(System.String)\">\n      <summary>\n        Decodes a base64 encoded string into the bytes it describes\n      </summary>\n      <param name=\"base64Encoded\">The string to decode</param>\n      <returns>A byte array that the base64 string described</returns>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Base64.Decode(System.String,System.Text.Encoding)\">\n      <summary>\n        Decodes a Base64 encoded string using a specified <see cref=\"T:System.Text.Encoding\" />\n      </summary>\n      <param name=\"base64Encoded\">Source string to decode</param>\n      <param name=\"encoding\">\n        The encoding to use for the decoded byte array that <paramref name=\"base64Encoded\" />\n        describes\n      </param>\n      <returns>A decoded string</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"base64Encoded\" /> or <paramref name=\"encoding\" /> is\n        <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.FormatException\">If <paramref name=\"base64Encoded\" /> is not a valid base64 encoded string</exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.EncodedWord\">\n      <summary>\n        Utility class for dealing with encoded word strings<br />\n        <br />\n        EncodedWord encoded strings are only in ASCII, but can embed information\n        about characters in other character sets.<br />\n        <br />\n        It is done by specifying the character set, an encoding that maps from ASCII to\n        the correct bytes and the actual encoded string.<br />\n        <br />\n        It is specified in a format that is best summarized by a BNF:<br />\n        <c>\"=?\" character_set \"?\" encoding \"?\" encoded-text \"?=\"</c><br />\n      </summary>\n      <example>\n        <c>=?ISO-8859-1?Q?=2D?=</c>\n        Here <c>ISO-8859-1</c> is the character set.<br />\n        <c>Q</c> is the encoding method (quoted-printable). <c>B</c> is also supported (Base 64).<br />\n        The encoded text is the <c>=2D</c> part which is decoded to a space.\n      </example>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.EncodedWord.Decode(System.String)\">\n      <summary>\n        Decode text that is encoded with the <see cref=\"T:MsgKit.Mime.Decode.EncodedWord\" /> encoding.<br />\n        <br />\n        This method will decode any encoded-word found in the string.<br />\n        All parts which is not encoded will not be touched.<br />\n        <br />\n        From <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>:<br />\n        <code>\n          Generally, an \"encoded-word\" is a sequence of printable ASCII\n          characters that begins with \"=?\", ends with \"?=\", and has two \"?\"s in\n          between.  It specifies a character set and an encoding method, and\n          also includes the original text encoded as graphic ASCII characters,\n          according to the rules for that encoding method.\n        </code>\n        Example:<br />\n        <c>=?ISO-8859-1?q?this=20is=20some=20text?= other text here</c>\n      </summary>\n      <remarks>\n        See <a href=\"http://tools.ietf.org/html/rfc2047#section-2\">RFC 2047 section 2</a> \"Syntax of encoded-words\"\n        for more details\n      </remarks>\n      <param name=\"encodedWords\">Source text. May be content which is not encoded.</param>\n      <returns>Decoded text</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"encodedWords\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.EncodingFinder\">\n      <summary>\n        Utility class used by OpenPop for mapping from a characterSet to an <see cref=\"T:System.Text.Encoding\" />.\n        <br />\n        <br />\n        The functionality of the class can be altered by adding mappings\n        using <see cref=\"M:MsgKit.Mime.Decode.EncodingFinder.AddMapping(System.String,System.Text.Encoding)\" /> and by adding a\n        <see cref=\"P:MsgKit.Mime.Decode.EncodingFinder.FallbackDecoder\" />.<br />\n        <br />\n        Given a characterSet, it will try to find the Encoding as follows:\n        <list type=\"number\">\n          <item>\n            <description>\n              If a mapping for the characterSet was added, use the specified Encoding from there. Mappings\n              can be added using\n              <see cref=\"M:MsgKit.Mime.Decode.EncodingFinder.AddMapping(System.String,System.Text.Encoding)\" />.\n            </description>\n          </item>\n          <item>\n            <description>\n              Try to parse the characterSet and look it up using\n              <see cref=\"M:System.Text.Encoding.GetEncoding(System.Int32)\" />\n              for codepages or <see cref=\"M:System.Text.Encoding.GetEncoding(System.String)\" /> for named encodings.\n            </description>\n          </item>\n          <item>\n            <description>\n              If an encoding is not found yet, use the\n              <see cref=\"P:MsgKit.Mime.Decode.EncodingFinder.FallbackDecoder\" /> if defined. The\n              <see cref=\"P:MsgKit.Mime.Decode.EncodingFinder.FallbackDecoder\" /> is user defined.\n            </description>\n          </item>\n        </list>\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.EncodingFinder.#cctor\">\n      <summary>\n        Initialize the EncodingFinder\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.EncodingFinder.Reset\">\n      <summary>\n        Used to reset this static class to facilite isolated unit testing.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.EncodingFinder.FindEncoding(System.String)\">\n      <summary>\n        Parses a character set into an encoding.\n      </summary>\n      <param name=\"characterSet\">The character set to parse</param>\n      <returns>An encoding which corresponds to the character set</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"characterSet\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.EncodingFinder.AddMapping(System.String,System.Text.Encoding)\">\n      <summary>\n        Puts a mapping from <paramref name=\"characterSet\" /> to <paramref name=\"encoding\" />\n        into the <see cref=\"T:MsgKit.Mime.Decode.EncodingFinder\" />'s internal mapping Dictionary.\n      </summary>\n      <param name=\"characterSet\">The string that maps to the <paramref name=\"encoding\" /></param>\n      <param name=\"encoding\">\n        The <see cref=\"T:System.Text.Encoding\" /> that should be mapped from\n        <paramref name=\"characterSet\" />\n      </param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"characterSet\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"encoding\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.EncodingFinder.FallbackDecoderDelegate\">\n      <summary>\n        Delegate that is used when the EncodingFinder is unable to find an encoding by\n        using the <see cref=\"P:MsgKit.Mime.Decode.EncodingFinder.EncodingMap\" /> or general code.<br />\n        This is used as a last resort and can be used for setting a default encoding or\n        for finding an encoding on runtime for some <paramref name=\"characterSet\" />.\n      </summary>\n      <param name=\"characterSet\">The character set to find an encoding for.</param>\n      <returns>An encoding for the <paramref name=\"characterSet\" /> or <see langword=\"null\" /> if none could be found.</returns>\n    </member>\n    <member name=\"P:MsgKit.Mime.Decode.EncodingFinder.FallbackDecoder\">\n      <summary>\n        Last resort decoder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Decode.EncodingFinder.EncodingMap\">\n      <summary>\n        Mapping from charactersets to encodings.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.QuotedPrintable\">\n      <summary>\n        Used for decoding Quoted-Printable text.<br />\n        This is a robust implementation of a Quoted-Printable decoder defined in\n        <a href=\"http://tools.ietf.org/html/rfc2045\">RFC 2045</a> and\n        <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>.<br />\n        Every measurement has been taken to conform to the RFC.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.DecodeEncodedWord(System.String,System.Text.Encoding)\">\n      <summary>\n        Decodes a Quoted-Printable string according to <a href=\"http://tools.ietf.org/html/rfc2047\">RFC 2047</a>.<br />\n        RFC 2047 is used for decoding Encoded-Word encoded strings.\n      </summary>\n      <param name=\"toDecode\">Quoted-Printable encoded string</param>\n      <param name=\"encoding\">Specifies which encoding the returned string will be in</param>\n      <returns>A decoded string in the correct encoding</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"toDecode\" /> or <paramref name=\"encoding\" /> is\n        <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.DecodeContentTransferEncoding(System.String)\">\n      <summary>\n        Decodes a Quoted-Printable string according to <a href=\"http://tools.ietf.org/html/rfc2045\">RFC 2045</a>.<br />\n        RFC 2045 specifies the decoding of a body encoded with Content-Transfer-Encoding of quoted-printable.\n      </summary>\n      <param name=\"toDecode\">Quoted-Printable encoded string</param>\n      <returns>A decoded byte array that the Quoted-Printable encoded string described</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"toDecode\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.Rfc2047QuotedPrintableDecode(System.String,System.Boolean)\">\n      <summary>\n        This is the actual decoder.\n      </summary>\n      <param name=\"toDecode\">The string to be decoded from Quoted-Printable</param>\n      <param name=\"encodedWordVariant\">\n        If <see langword=\"true\" />, specifies that RFC 2047 quoted printable decoding is used.<br />\n        This is for quoted-printable encoded words<br />\n        <br />\n        If <see langword=\"false\" />, specifies that RFC 2045 quoted printable decoding is used.<br />\n        This is for quoted-printable Content-Transfer-Encoding\n      </param>\n      <returns>A decoded byte array that was described by <paramref name=\"toDecode\" /></returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"toDecode\" /> is <see langword=\"null\" />\n      </exception>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc2047#section-4.2\">RFC 2047 section 4.2</a> for RFC details</remarks>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.WriteAllBytesToStream(System.IO.Stream,System.Byte[])\">\n      <summary>\n        Writes all bytes in a byte array to a stream\n      </summary>\n      <param name=\"stream\">The stream to write to</param>\n      <param name=\"toWrite\">The bytes to write to the <paramref name=\"stream\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.RemoveIllegalControlCharacters(System.String)\">\n      <summary>\n        RFC 2045 states about robustness:<br />\n        <code>\n          Control characters other than TAB, or CR and LF as parts of CRLF pairs,\n          must not appear. The same is true for octets with decimal values greater\n          than 126.  If found in incoming quoted-printable data by a decoder, a\n          robust implementation might exclude them from the decoded data and warn\n          the user that illegal characters were discovered.\n        </code>\n        Control characters are defined in RFC 2396 as<br />\n        <c>control = US-ASCII coded characters 00-1F and 7F hexadecimal</c>\n      </summary>\n      <param name=\"input\">String to be stripped from illegal control characters</param>\n      <returns>A string with no illegal control characters</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"input\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.RemoveCarriageReturnAndNewLinewIfNotInPair(System.String)\">\n      <summary>\n        This method will remove any \\r and \\n which is not paired as \\r\\n\n      </summary>\n      <param name=\"input\">String to remove lonely \\r and \\n's from</param>\n      <returns>A string without lonely \\r and \\n's</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"input\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.DecodeEqualSignNotLongEnough(System.String)\">\n      <summary>\n        RFC 2045 says that a robust implementation should handle:<br />\n        <code>\n          An \"=\" cannot be the ultimate or penultimate character in an encoded\n          object. This could be handled as in case (2) above.\n        </code>\n        Case (2) is:<br />\n        <code>\n          An \"=\" followed by a character that is neither a\n          hexadecimal digit (including \"abcdef\") nor the CR character of a CRLF pair\n          is illegal.  This case can be the result of US-ASCII text having been\n          included in a quoted-printable part of a message without itself having\n          been subjected to quoted-printable encoding.  A reasonable approach by a\n          robust implementation might be to include the \"=\" character and the\n          following character in the decoded data without any transformation and, if\n          possible, indicate to the user that proper decoding was not possible at\n          this point in the data.\n        </code>\n      </summary>\n      <param name=\"decode\">\n        The string to decode which cannot have length above or equal to 3\n        and must start with an equal sign.\n      </param>\n      <returns>A decoded byte array</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"decode\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentException\">\n        Thrown if a the <paramref name=\"decode\" /> parameter has length above 2 or does not\n        start with an equal sign.\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.QuotedPrintable.DecodeEqualSign(System.String)\">\n      <summary>\n        This helper method will decode a string of the form \"=XX\" where X is any character.<br />\n        This method will never fail, unless an argument of length not equal to three is passed.\n      </summary>\n      <param name=\"decode\">The length 3 character that needs to be decoded</param>\n      <returns>A decoded byte array</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"decode\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentException\">\n        Thrown if a the <paramref name=\"decode\" /> parameter does not have length 3 or does\n        not start with an equal sign.\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.Rfc2231Decoder\">\n      <summary>\n        This class is responsible for decoding parameters that has been encoded with:<br />\n        <list type=\"bullet\">\n          <item>\n            <b>Continuation</b><br />\n            This is where a single parameter has such a long value that it could\n            be wrapped while in transit. Instead multiple parameters is used on each line.<br />\n            <br />\n            <b>Example</b><br />\n            From: <c>Content-Type: text/html; boundary=\"someVeryLongStringHereWhichCouldBeWrappedInTransit\"</c><br />\n            To:\n            <c>Content-Type: text/html; boundary*0=\"someVeryLongStringHere\" boundary*1=\"WhichCouldBeWrappedInTransit\"</c>\n            <br />\n          </item>\n          <item>\n            <b>Encoding</b><br />\n            Sometimes other characters then ASCII characters are needed in parameters.<br />\n            The parameter is then given a different name to specify that it is encoded.<br />\n            <br />\n            <b>Example</b><br />\n            From: <c>Content-Disposition attachment; filename=\"specialCharsÆØÅ\"</c><br />\n            To: <c>Content-Disposition attachment; filename*=\"ISO-8859-1'en-us'specialCharsC6D8C0\"</c><br />\n            This encoding is almost the same as <see cref=\"T:MsgKit.Mime.Decode.EncodedWord\" /> encoding, and is used to decode the value.\n            <br />\n          </item>\n          <item>\n            <b>Continuation and Encoding</b><br />\n            Both Continuation and Encoding can be used on the same time.<br />\n            <br />\n            <b>Example</b><br />\n            From: <c>Content-Disposition attachment; filename=\"specialCharsÆØÅWhichIsSoLong\"</c><br />\n            To:\n            <c>\n              Content-Disposition attachment; filename*0*=\"ISO-8859-1'en-us'specialCharsC6D8C0\";\n              filename*1*=\"WhichIsSoLong\"\n            </c>\n            <br />\n            This could also be encoded as:<br />\n            To:\n            <c>\n              Content-Disposition attachment; filename*0*=\"ISO-8859-1'en-us'specialCharsC6D8C0\";\n              filename*1=\"WhichIsSoLong\"\n            </c>\n            <br />\n            Notice that <c>filename*1</c> does not have an <c>*</c> after it - denoting it IS NOT encoded.<br />\n            There are some rules about this:<br />\n            <list type=\"number\">\n              <item>The encoding must be mentioned in the first part (filename*0*), which has to be encoded.</item>\n              <item>\n                No other part must specify an encoding, but if encoded it uses the encoding mentioned in the\n                first part.\n              </item>\n              <item>Parts may be encoded or not in any order.</item>\n            </list>\n            <br />\n          </item>\n        </list>\n        More information and the specification is available in\n        <see href=\"http://tools.ietf.org/html/rfc2231\">RFC 2231</see>.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2231Decoder.Decode(System.String)\">\n      <summary>\n        Decodes a string of the form:<br />\n        <c>value0; key1=value1; key2=value2; key3=value3</c><br />\n        The returned List of key value pairs will have the key as key and the decoded value as value.<br />\n        The first value0 will have a key of <see cref=\"F:System.String.Empty\" />.<br />\n        <br />\n        If continuation is used, then multiple keys will be merged into one key with the different values\n        decoded into on big value for that key.<br />\n        Example:<br />\n        <code>\n          title*0=part1\n          title*1=part2\n        </code>\n        will have key and value of:<br></br>\n        <c>title=decode(part1)decode(part2)</c>\n      </summary>\n      <param name=\"toDecode\">The string to decode.</param>\n      <returns>A list of decoded key value pairs.</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"toDecode\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member\n      name=\"M:MsgKit.Mime.Decode.Rfc2231Decoder.DecodePairs(System.Collections.Generic.IList{System.Collections.Generic.KeyValuePair{System.String,System.String}})\">\n      <summary>\n        Decodes the list of key value pairs into a decoded list of key value pairs.<br />\n        There may be less keys in the decoded list, but then the values for the lost keys will have been appended\n        to the new key.\n      </summary>\n      <param name=\"pairs\">The pairs to decode</param>\n      <returns>A decoded list of pairs</returns>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2231Decoder.DecodeSingleValue(System.String,System.String@)\">\n      <summary>\n        This will decode a single value of the form: <c>ISO-8859-1'en-us'%3D%3DIamHere</c><br />\n        Which is basically a <see cref=\"T:MsgKit.Mime.Decode.EncodedWord\" /> form just using % instead of =<br />\n        Notice that 'en-us' part is not used for anything.<br />\n        <br />\n        If the single value given is not on the correct form, it will be returned without\n        being decoded and <paramref name=\"encodingUsed\" /> will be set to <see langword=\"null\" />.\n      </summary>\n      <param name=\"encodingUsed\">\n        The encoding used to decode with - it is given back for later use.<br />\n        <see langword=\"null\" /> if input was not in the correct form.\n      </param>\n      <param name=\"toDecode\">The value to decode</param>\n      <returns>\n        The decoded value that corresponds to <paramref name=\"toDecode\" /> or if\n        <paramref name=\"toDecode\" /> is not on the correct form, it will be non-decoded.\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"toDecode\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2231Decoder.DecodeSingleValue(System.String,System.String)\">\n      <summary>\n        This will decode a single value of the form: %3D%3DIamHere\n        Which is basically a <see cref=\"T:MsgKit.Mime.Decode.EncodedWord\" /> form just using % instead of =\n      </summary>\n      <param name=\"valueToDecode\">The value to decode</param>\n      <param name=\"encoding\">The encoding used to decode with</param>\n      <returns>The decoded value that corresponds to <paramref name=\"valueToDecode\" /></returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"valueToDecode\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"encoding\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.Rfc2822DateTime\">\n      <summary>\n        Class used to decode RFC 2822 Date header fields.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Decode.Rfc2822DateTime.CustomDateTimeFormats\">\n      <summary>\n        Custom DateTime formats - will be tried if cannot parse the dateInput string using the default method\n        Specified using formats at http://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx\n        One format per string in the array\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.StringToDate(System.String)\">\n      <summary>\n        Converts a string in RFC 2822 format into a <see cref=\"T:System.DateTime\" /> object\n      </summary>\n      <param name=\"inputDate\">The date to convert</param>\n      <returns>\n        A valid <see cref=\"T:System.DateTime\" /> object, which represents the same time as the string that was converted.\n        If <paramref name=\"inputDate\" /> is not a valid date representation, then\n        <see cref=\"F:System.DateTime.MinValue\" /> is\n        returned.\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"inputDate\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentException\">\n        If the <paramref name=\"inputDate\" /> could not be parsed into a\n        <see cref=\"T:System.DateTime\" /> object\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.AdjustTimezone(System.DateTime,System.String)\">\n      <summary>\n        Adjust the <paramref name=\"dateTime\" /> object given according to the timezone specified in the\n        <paramref name=\"dateInput\" />.\n      </summary>\n      <param name=\"dateTime\">The date to alter</param>\n      <param name=\"dateInput\">The input date, in which the timezone can be found</param>\n      <returns>An date altered according to the timezone</returns>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.MatchEvaluator(System.Text.RegularExpressions.Match)\">\n      <summary>\n        Convert timezones in older formats to [+-]dddd format.\n      </summary>\n      <param name=\"match\">The match that was found</param>\n      <returns>The string to replace the matched string with</returns>\n      <remarks>\n        RFC 2822: http://www.rfc-base.org/rfc-2822.html\n        4.3. Obsolete Date and Time\n        The syntax for the obsolete date format allows a 2 digit year in the\n        date field and allows for a list of alphabetic time zone\n        specifications that were used in earlier versions of this standard.\n        It also permits comments and folding white space between many of the\n        tokens.\n        obs-day-of-week =       [CFWS] day-name [CFWS]\n        obs-year        =       [CFWS] 2*DIGIT [CFWS]\n        obs-month       =       CFWS month-name CFWS\n        obs-day         =       [CFWS] 1*2DIGIT [CFWS]\n        obs-hour        =       [CFWS] 2DIGIT [CFWS]\n        obs-minute      =       [CFWS] 2DIGIT [CFWS]\n        obs-second      =       [CFWS] 2DIGIT [CFWS]\n        obs-zone        =       \"UT\" / \"GMT\" /          ; Universal Time\n        Resnick                     Standards Track                    [Page 31]\n        RFC 2822                Internet Message Format               April 2001\n        ; North American UT\n        ; offsets\n        \"EST\" / \"EDT\" /         ; Eastern:  - 5/ - 4\n        \"CST\" / \"CDT\" /         ; Central:  - 6/ - 5\n        \"MST\" / \"MDT\" /         ; Mountain: - 7/ - 6\n        \"PST\" / \"PDT\" /         ; Pacific:  - 8/ - 7\n        %d65-73 /               ; Military zones - \"A\"\n        %d75-90 /               ; through \"I\" and \"K\"\n        %d97-105 /              ; through \"Z\", both\n        %d107-122               ; upper and lower case -- imported lower and upper\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.ExtractDateTime(System.String)\">\n      <summary>\n        Extracts the date and time parts from the <paramref name=\"dateInput\" />\n      </summary>\n      <param name=\"dateInput\">The date input string, from which to extract the date and time parts</param>\n      <returns>\n        The extracted date part or <see langword=\"DateTime.MinValue\" /> if <paramref name=\"dateInput\" /> is not\n        recognized as a valid date.\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"dateInput\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.StripCommentsAndExcessWhitespace(System.String)\">\n      <summary>\n        Strips and removes all comments and excessive whitespace from the string\n      </summary>\n      <param name=\"input\">The input to strip from</param>\n      <returns>The stripped string</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"input\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Rfc2822DateTime.FixSpecialCases(System.String)\">\n      <summary>\n        Converts date time string in very wrong date time format:\n        Tue Feb 18 10:23:30 2014 (MSK)\n        to\n        Feb 18 2014 10:23:30 MSK\n      </summary>\n      <param name=\"inputDate\">The date to convert</param>\n      <returns>The corrected string</returns>\n    </member>\n    <member name=\"F:MsgKit.Mime.Decode.Rfc2822DateTime.RegexOldTimezoneFormats\">\n      <summary>\n        Timezone formats that aren't +-hhmm, e.g. UTC, or K. See MatchEvaluator method for conversions\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Mime.Decode.Rfc2822DateTime.RegexNewTimezoneFormats\">\n      <summary>\n        Matches any +=hhmm timezone offset, e.g. +0100\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.SizeParser\">\n      <summary>\n        Thanks to http://stackoverflow.com/a/7333402/477854 for inspiration\n        This class can convert from strings like \"104 kB\" (104 kilobytes) to bytes.\n        It does not know about differences such as kilobits vs kilobytes.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Decode.Utility\">\n      <summary>\n        Contains common operations needed while decoding.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Utility.RemoveQuotesIfAny(System.String)\">\n      <summary>\n        Remove quotes, if found, around the string.\n      </summary>\n      <param name=\"text\">Text with quotes or without quotes</param>\n      <returns>Text without quotes</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"text\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Decode.Utility.SplitStringWithCharNotInsideQuotes(System.String,System.Char)\">\n      <summary>\n        Split a string into a list of strings using a specified character.<br />\n        Everything inside quotes are ignored.\n      </summary>\n      <param name=\"input\">A string to split</param>\n      <param name=\"toSplitAt\">The character to use to split with</param>\n      <returns>A List of strings that was delimited by the <paramref name=\"toSplitAt\" /> character</returns>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.ContentTransferEncoding\">\n      <summary>\n        <see cref=\"T:System.Enum\" /> that describes the ContentTransferEncoding header field\n      </summary>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc2045#section-6\">RFC 2045 section 6</a> for more details</remarks>\n    </member>\n    <member name=\"F:MsgKit.Mime.Header.ContentTransferEncoding.SevenBit\">\n      <summary>\n        7 bit Encoding\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Mime.Header.ContentTransferEncoding.EightBit\">\n      <summary>\n        8 bit Encoding\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Mime.Header.ContentTransferEncoding.QuotedPrintable\">\n      <summary>\n        Quoted Printable Encoding\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Mime.Header.ContentTransferEncoding.Base64\">\n      <summary>\n        Base64 Encoding\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Mime.Header.ContentTransferEncoding.Binary\">\n      <summary>\n        Binary Encoding\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.HeaderExtractor\">\n      <summary>\n        Utility class that divides a message into a body and a header.<br />\n        The header is then parsed to a strongly typed <see cref=\"T:MsgKit.Mime.Header.MessageHeader\" /> object.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderExtractor.GetHeaders(System.String)\">\n      <summary>\n        Extract the headers from the given headers string and gives it back\n        as a MessageHeader object\n      </summary>\n      <param name=\"headersString\">The string with the header information</param>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderExtractor.ExtractHeaders(System.String)\">\n      <summary>\n        Method that takes a full message and extract the headers from it.\n      </summary>\n      <param name=\"messageContent\">The message to extract headers from. Does not need the body part. Needs the empty headers end line.</param>\n      <returns>A collection of Name and Value pairs of headers</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"messageContent\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderExtractor.IsMoreLinesInHeaderValue(System.IO.TextReader)\">\n      <summary>\n        Check if the next line is part of the current header value we are parsing by\n        peeking on the next character of the <see cref=\"T:System.IO.TextReader\" />.<br />\n        This should only be called while parsing headers.\n      </summary>\n      <param name=\"reader\">The reader from which the header is read from</param>\n      <returns><see langword=\"true\" /> if multi-line header. <see langword=\"false\" /> otherwise</returns>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderExtractor.SeparateHeaderNameAndValue(System.String)\">\n      <summary>\n        Separate a full header line into a header name and a header value.\n      </summary>\n      <param name=\"rawHeader\">The raw header line to be separated</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"rawHeader\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.HeaderFieldParser\">\n      <summary>\n        Class that can parse different fields in the header sections of a MIME message.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseContentTransferEncoding(System.String)\">\n      <summary>\n        Parses the Content-Transfer-Encoding header.\n      </summary>\n      <param name=\"headerValue\">The value for the header to be parsed</param>\n      <returns>A <see cref=\"T:MsgKit.Mime.Header.ContentTransferEncoding\" /></returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headerValue\" /> is <see langword=\"null\" />\n      </exception>\n      <exception cref=\"T:System.ArgumentException\">\n        If the <paramref name=\"headerValue\" /> could not be parsed to a\n        <see cref=\"T:MsgKit.Mime.Header.ContentTransferEncoding\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseImportance(System.String)\">\n      <summary>\n        Parses an ImportanceType from a given Importance header value.\n      </summary>\n      <param name=\"headerValue\">The value to be parsed</param>\n      <returns>\n        A <see cref=\"T:System.Net.Mail.MailPriority\" />. If the <paramref name=\"headerValue\" /> is not recognized, Normal is returned.\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headerValue\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseContentType(System.String)\">\n      <summary>\n        Parses a the value for the header Content-Type to\n        a <see cref=\"T:System.Net.Mime.ContentType\" /> object.\n      </summary>\n      <param name=\"headerValue\">The value to be parsed</param>\n      <returns>A <see cref=\"T:System.Net.Mime.ContentType\" /> object</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headerValue\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseContentDisposition(System.String)\">\n      <summary>\n        Parses a the value for the header Content-Disposition to a <see cref=\"T:System.Net.Mime.ContentDisposition\" />\n        object.\n      </summary>\n      <param name=\"headerValue\">The value to be parsed</param>\n      <returns>A <see cref=\"T:System.Net.Mime.ContentDisposition\" /> object</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headerValue\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseId(System.String)\">\n      <summary>\n        Parses an ID like Message-Id and Content-Id.<br />\n        Example:<br />\n        <c>&lt;test@test.com&gt;</c><br />\n        into<br />\n        <c>test@test.com</c>\n      </summary>\n      <param name=\"headerValue\">The id to parse</param>\n      <returns>A parsed ID</returns>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.HeaderFieldParser.ParseMultipleIDs(System.String)\">\n      <summary>\n        Parses multiple IDs from a single string like In-Reply-To.\n      </summary>\n      <param name=\"headerValue\">The value to parse</param>\n      <returns>A list of IDs</returns>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.MessageHeader\">\n      <summary>\n        Class that holds all headers for a message<br />\n        Headers which are unknown the the parser will be held in the\n        <see cref=\"P:MsgKit.Mime.Header.MessageHeader.CustomHeaders\" /> collection.<br />\n        <br />\n        This class cannot be instantiated from outside the library.\n      </summary>\n      <remarks>\n        See <a href=\"http://tools.ietf.org/html/rfc4021\">RFC 4021</a> for a large list of headers.<br />\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.RawHeaders\">\n      <summary>\n        Contains all the headers as a Dictionary&lt;string, List&lt;string&gt;&gt;\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.CustomHeaders\">\n      <summary>\n        All headers which were not recognized and explicitly dealt with.<br />\n        This should mostly be custom headers, which are marked as X-[name].<br />\n        <br />\n        This list will be empty if all headers were recognized and parsed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ContentDescription\">\n      <summary>\n        A human readable description of the body<br />\n        <br />\n        <see langword=\"null\" /> if no Content-Description header was present in the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ContentId\">\n      <summary>\n        ID of the content part (like an attached image). Used with MultiPart messages.<br />\n        <br />\n        <see langword=\"null\" /> if no Content-ID header field was present in the message.\n      </summary>\n      <see cref=\"P:MsgKit.Mime.Header.MessageHeader.MessageId\">For an ID of the message</see>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Keywords\">\n      <summary>\n        Message keywords<br />\n        <br />\n        The list will be empty if no Keywords header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.DispositionNotificationTo\">\n      <summary>\n        A List of emails to people who wishes to be notified when some event happens.<br />\n        These events could be email:\n        <list type=\"bullet\">\n          <item>deletion</item>\n          <item>printing</item>\n          <item>received</item>\n          <item>...</item>\n        </list>\n        The list will be empty if no Disposition-Notification-To header was present in the message\n      </summary>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc3798\">RFC 3798</a> for details</remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Received\">\n      <summary>\n        This is the Received headers. This tells the path that the email went.<br />\n        <br />\n        The list will be empty if no Received header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Importance\">\n      <summary>\n        Importance of this email.<br />\n        <br />\n        The importance level is set to normal, if no Importance header field was mentioned or it contained\n        unknown information. This is the expected behavior according to the RFC.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ContentTransferEncoding\">\n      <summary>\n        This header describes the Content encoding during transfer.<br />\n        <br />\n        If no Content-Transfer-Encoding header was present in the message, it is set\n        to the default of <see cref=\"F:MsgKit.Mime.Header.ContentTransferEncoding.SevenBit\">SevenBit</see> in accordance to the RFC.\n      </summary>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc2045#section-6\">RFC 2045 section 6</a> for details</remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.To\">\n      <summary>\n        Specifies who this mail was for<br />\n        <br />\n        The list will be empty if no To header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Cc\">\n      <summary>\n        Carbon Copy. This specifies who got a copy of the message.<br />\n        <br />\n        The list will be empty if no Cc header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Bcc\">\n      <summary>\n        Blind Carbon Copy. This specifies who got a copy of the message, but others\n        cannot see who these persons are.<br />\n        <br />\n        The list will be empty if no Received Bcc was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.From\">\n      <summary>\n        Specifies who sent the email<br />\n        <br />\n        <see langword=\"null\" /> if no From header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ReplyTo\">\n      <summary>\n        Specifies who a reply to the message should be sent to<br />\n        <br />\n        <see langword=\"null\" /> if no Reply-To header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.InReplyTo\">\n      <summary>\n        The message identifier(s) of the original message(s) to which the\n        current message is a reply.<br />\n        <br />\n        The list will be empty if no In-Reply-To header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.References\">\n      <summary>\n        The message identifier(s) of other message(s) to which the current\n        message is related to.<br />\n        <br />\n        The list will be empty if no References header was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Sender\">\n      <summary>\n        This is the sender of the email address.<br />\n        <br />\n        <see langword=\"null\" /> if no Sender header field was present in the message\n      </summary>\n      <remarks>\n        The RFC states that this field can be used if a secretary\n        is sending an email for someone she is working for.\n        The email here will then be the secretary's email, and\n        the Reply-To field would hold the address of the person she works for.<br />\n        RFC states that if the Sender is the same as the From field,\n        sender should not be included in the message.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ContentType\">\n      <summary>\n        The Content-Type header field.<br />\n        <br />\n        If not set, the ContentType is created by the default \"text/plain; charset=us-ascii\" which is\n        defined in <a href=\"http://tools.ietf.org/html/rfc2045#section-5.2\">RFC 2045 section 5.2</a>.<br />\n        If set, the default is overridden.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ContentDisposition\">\n      <summary>\n        Used to describe if a message part is to be displayed or to be though of as an attachment.<br />\n        Also contains information about filename if such was sent.<br />\n        <br />\n        <see langword=\"null\" /> if no Content-Disposition header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Date\">\n      <summary>\n        The Date when the email was sent.<br />\n        This is the raw value. <see cref=\"P:MsgKit.Mime.Header.MessageHeader.DateSent\" /> for a parsed up\n        <see cref=\"T:System.DateTime\" /> value of this field.<br />\n        <br />\n        <see langword=\"DateTime.MinValue\" /> if no Date header field was present in the message or if the date could not be\n        parsed.\n      </summary>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc5322#section-3.6.1\">RFC 5322 section 3.6.1</a> for more details</remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.DateSent\">\n      <summary>\n        The Date when the email was sent.<br />\n        This is the parsed equivalent of <see cref=\"P:MsgKit.Mime.Header.MessageHeader.Date\" />.<br />\n        Notice that the <see cref=\"T:System.TimeZone\" /> of the <see cref=\"T:System.DateTime\" /> object is in UTC and has NOT been converted\n        to local <see cref=\"T:System.TimeZone\" />.\n      </summary>\n      <remarks>See <a href=\"http://tools.ietf.org/html/rfc5322#section-3.6.1\">RFC 5322 section 3.6.1</a> for more details</remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.MessageId\">\n      <summary>\n        An ID of the message that is SUPPOSED to be in every message according to the RFC.<br />\n        The ID is unique.<br />\n        <br />\n        <see langword=\"null\" /> if no Message-ID header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.MimeVersion\">\n      <summary>\n        The Mime Version.<br />\n        This field will almost always show 1.0<br />\n        <br />\n        <see langword=\"null\" /> if no Mime-Version header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.ReturnPath\">\n      <summary>\n        A single <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /> with no username inside.<br />\n        This is a trace header field, that should be in all messages.<br />\n        Replies should be sent to this address.<br />\n        <br />\n        <see langword=\"null\" /> if no Return-Path header field was present in the message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.MessageHeader.Subject\">\n      <summary>\n        The subject line of the message in decoded, one line state.<br />\n        This should be in all messages.<br />\n        <br />\n        <see langword=\"null\" /> if no Subject header field was present in the message\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.#ctor\">\n      <summary>\n        Creates an empty header object, use the\n        <see cref=\"M:MsgKit.Mime.Header.MessageHeader.SetHeaderValue(System.String,System.String)\" /> method\n        to set values\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Mime.Header.MessageHeader.#ctor(System.Collections.Generic.Dictionary{System.String,System.Collections.Generic.List{System.String}})\">\n      <summary>\n        Parses a Dictionary&lt;string, string&gt; to a MessageHeader\n      </summary>\n      <param name=\"rawHeaders\">The collection that should be traversed and parsed</param>\n      <returns>A valid MessageHeader object</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"rawHeaders\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.Clear\">\n      <summary>\n        Clears the object and sets all the properties to their default values\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Mime.Header.MessageHeader.ParseHeaders(System.Collections.Generic.Dictionary{System.String,System.Collections.Generic.List{System.String}})\">\n      <summary>\n        Parses a <see cref=\"T:System.Collections.Specialized.NameValueCollection\" /> to a\n        <see cref=\"T:MsgKit.Mime.Header.MessageHeader\" />\n      </summary>\n      <param name=\"headers\">The collection that should be traversed and parsed</param>\n      <returns>A valid <see cref=\"T:MsgKit.Mime.Header.MessageHeader\" /> object</returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headers\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.ParseHeader(System.String,System.String)\">\n      <summary>\n        Parses a single header and sets member variables according to it.\n      </summary>\n      <param name=\"headerName\">The name of the header</param>\n      <param name=\"headerValue\">The value of the header in unfolded state (only one line)</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"headerName\" /> or <paramref name=\"headerValue\" /> is\n        <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.HeaderValue(System.String)\">\n      <summary>\n        Returns the value(s) of the header, <c>null</c> will be returned when the\n        header does not exist\n      </summary>\n      <param name=\"headerName\">The name of the header</param>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.SetHeaderValue(System.String,System.String)\">\n      <summary>\n        Adds a single header or updates it if it already exists\n      </summary>\n      <param name=\"headerName\">The name of the header</param>\n      <param name=\"headerValue\">The value for the header</param>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.MessageHeader.ToString\">\n      <summary>\n        Returns the headers as a string\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.Received\">\n      <summary>\n        Class that hold information about one \"Received:\" header line.<br />\n        <br />\n        Visit these RFCs for more information:<br />\n        <see href=\"http://tools.ietf.org/html/rfc5321#section-4.4\">RFC 5321 section 4.4</see><br />\n        <see href=\"http://tools.ietf.org/html/rfc4021#section-3.6.7\">RFC 4021 section 3.6.7</see><br />\n        <see href=\"http://tools.ietf.org/html/rfc2822#section-3.6.7\">RFC 2822 section 3.6.7</see><br />\n        <see href=\"http://tools.ietf.org/html/rfc2821#section-4.4\">RFC 2821 section 4.4</see><br />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.Received.#ctor(System.String)\">\n      <summary>\n        Parses a Received header value.\n      </summary>\n      <param name=\"headerValue\">The value for the header to be parsed</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        <exception cref=\"T:System.ArgumentNullException\">\n          If <paramref name=\"headerValue\" /> is <see langword=\"null\" />\n        </exception>\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.Received.ParseDictionary(System.String)\">\n      <summary>\n        Parses the Received header name-value-list into a dictionary.\n      </summary>\n      <param name=\"headerValue\">The full header value for the Received header</param>\n      <returns>A dictionary where the name-value-list has been parsed into</returns>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.Received.Date\">\n      <summary>\n        The date of this received line.\n        Is <see cref=\"F:System.DateTime.MinValue\" /> if not present in the received header line.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.Received.Names\">\n      <summary>\n        A dictionary that contains the names and values of the\n        received header line.<br />\n        If the received header is invalid and contained one name\n        multiple times, the first one is used and the rest is ignored.\n      </summary>\n      <example>\n        If the header lines looks like:\n        <code>\n          from sending.com (localMachine [127.0.0.1]) by test.net (Postfix)\n        </code>\n        then the dictionary will contain two keys: \"from\" and \"by\" with the values\n        \"sending.com (localMachine [127.0.0.1])\" and \"test.net (Postfix)\".\n      </example>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.Received.Raw\">\n      <summary>\n        The raw input string that was parsed into this class.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Mime.Header.RfcMailAddress\">\n      <summary>\n        This class is used for RFC compliant email addresses.<br />\n        <br />\n        The class cannot be instantiated from outside the library.\n      </summary>\n      <remarks>\n        The <seealso cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" /> does not cover all the possible formats\n        for <a href=\"http://tools.ietf.org/html/rfc5322#section-3.4\">RFC 5322 section 3.4</a> compliant email addresses.\n        This class is used as an address wrapper to account for that deficiency.\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.RfcMailAddress.ToString\">\n      <summary>\n        A string representation of the <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /> object\n      </summary>\n      <returns>Returns the string representation for the object</returns>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.RfcMailAddress.Address\">\n      <summary>\n        The email address of this <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /><br />\n        It is possibly string.Empty since RFC mail addresses does not require an email address specified.\n      </summary>\n      <example>\n        Example header with email address:<br />\n        To: <c>Test test@mail.com</c><br />\n        Address will be <c>test@mail.com</c><br />\n      </example>\n      <example>\n        Example header without email address:<br />\n        To: <c>Test</c><br />\n        Address will be <see cref=\"F:System.String.Empty\" />.\n      </example>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.RfcMailAddress.DisplayName\">\n      <summary>\n        The display name of this <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /><br />\n        It is possibly <see cref=\"F:System.String.Empty\" /> since RFC mail addresses does not require a display name to be\n        specified.\n      </summary>\n      <example>\n        Example header with display name:<br />\n        To: <c>Test test@mail.com</c><br />\n        DisplayName will be <c>Test</c>\n      </example>\n      <example>\n        Example header without display name:<br />\n        To: <c>test@test.com</c><br />\n        DisplayName will be <see cref=\"F:System.String.Empty\" />\n      </example>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.RfcMailAddress.Raw\">\n      <summary>\n        This is the Raw string used to describe the <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" />.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\">\n      <summary>\n        The <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" /> associated with the\n        <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" />.\n      </summary>\n      <remarks>\n        The value of this property can be <see lanword=\"null\" /> in instances where the\n        <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" /> cannot\n        represent the address properly.<br />\n        Use <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.HasValidMailAddress\" /> property to see if this property is valid.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Mime.Header.RfcMailAddress.HasValidMailAddress\">\n      <summary>\n        Specifies if the object contains a valid <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" />\n        reference.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.RfcMailAddress.#ctor(System.Net.Mail.MailAddress,System.String)\">\n      <summary>\n        Constructs an <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /> object from a\n        <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" /> object.<br />\n        This constructor is used when we were able to construct a\n        <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" /> from a string.\n      </summary>\n      <param name=\"mailAddress\">The address that <paramref name=\"raw\" /> was parsed into</param>\n      <param name=\"raw\">The raw unparsed input which was parsed into the <paramref name=\"mailAddress\" /></param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"mailAddress\" /> or <paramref name=\"raw\" /> is\n        <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.RfcMailAddress.#ctor(System.String)\">\n      <summary>\n        When we were unable to parse a string into a <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.MailAddress\" />, this constructor can be\n        used. The Raw string is then used as the <see cref=\"P:MsgKit.Mime.Header.RfcMailAddress.DisplayName\" />.\n      </summary>\n      <param name=\"raw\">The raw unparsed input which could not be parsed</param>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"raw\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.RfcMailAddress.ParseMailAddress(System.String)\">\n      <summary>\n        Parses an email address from a MIME header<br />\n        <br />\n        Examples of input:\n        <c>Eksperten mailrobot &lt;noreply@mail.eksperten.dk&gt;</c><br />\n        <c>\"Eksperten mailrobot\" &lt;noreply@mail.eksperten.dk&gt;</c><br />\n        <c>&lt;noreply@mail.eksperten.dk&gt;</c><br />\n        <c>noreply@mail.eksperten.dk</c><br />\n        <br />\n        It might also contain encoded text, which will then be decoded.\n      </summary>\n      <param name=\"input\">The value to parse out and email and/or a username</param>\n      <returns>A <see cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /></returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"input\" /> is <see langword=\"null\" />\n      </exception>\n      <remarks>\n        <see href=\"http://tools.ietf.org/html/rfc5322#section-3.4\">RFC 5322 section 3.4</see> for more details on email\n        syntax.<br />\n        <see cref=\"M:MsgKit.Mime.Decode.EncodedWord.Decode(System.String)\">For more information about encoded text</see>\n        .\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Mime.Header.RfcMailAddress.ParseMailAddresses(System.String)\">\n      <summary>\n        Parses input of the form<br />\n        <c>Eksperten mailrobot &lt;noreply@mail.eksperten.dk&gt;, ...</c><br />\n        to a list of RFCMailAddresses\n      </summary>\n      <param name=\"input\">The input that is a comma-separated list of EmailAddresses to parse</param>\n      <returns>\n        A List of <seealso cref=\"T:MsgKit.Mime.Header.RfcMailAddress\" /> objects extracted from the\n        <paramref name=\"input\" /> parameter.\n      </returns>\n      <exception cref=\"T:System.ArgumentNullException\">\n        If <paramref name=\"input\" /> is <see langword=\"null\" />\n      </exception>\n    </member>\n    <member name=\"T:MsgKit.NamedPropertyMapping\">\n      <summary>\n        A process that converts PropertyName structures to property IDs and vice-versa. Named properties can be referred to\n        by their PropertyName. However, before accessing the property on a specific message store, named properties need to\n        be mapped to property IDs that are valid for that message store. The reverse is also true. When properties need to\n        be copied across message stores, property IDs that are valid for the source message store need to be mapped to\n        their PropertyName structures before they can be sent to the destination message store.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.NamedPropertyTags\">\n      <summary>\n        A class that holds all the known named mapi tags\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAttendeeCriticalChange\">\n      <summary>\n        Specifies the date and time at which the meeting-related object was sent\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWhere\">\n      <summary>\n        Contains the value of the PidLidLocation property (section 2.159) from the associated\n        Meeting object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidGlobalObjectId\">\n      <summary>\n        Contains the value of the PidLidGlobalObjectId property (section 2.142) for an object\n        that represents an Exception object to a recurring series, where the Year, Month, and Day fields are\n        all zero.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidIsSilent\">\n      <summary>\n        Indicates whether the user did not include any text in the body of the Meeting Response\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidIsRecurring\">\n      <summary>\n        Specifies whether the object is associated with a recurring series.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRequiredAttendees\">\n      <summary>\n        Identifies required attendees for the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOptionalAttendees\">\n      <summary>\n        Specifies optional attendees.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidResourceAttendees\">\n      <summary>\n        Identifies resource attendees for the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDelegateMail\">\n      <summary>\n        Indicates whether a delegate responded to the meeting request.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidIsException\">\n      <summary>\n        Indicates whether the object represents an exception (including an orphan instance).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSingleInvite\">\n      <summary>\n        Deprecated\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTimeZone\">\n      <summary>\n        Contains a stream that maps to the persisted format of a TZREG structure, which describes the time zone to be used\n        for the start and end time of a recurring appointment or meeting request.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidStartRecurrenceDate\">\n      <summary>\n        Identifies the start date of the recurrence pattern.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidStartRecurrenceTime\">\n      <summary>\n        Identifies the start time of the recurrence pattern.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEndRecurrenceDate\">\n      <summary>\n        Identifies the end date of the recurrence range\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEndRecurrenceTime\">\n      <summary>\n        Identifies the end time of the recurrence range.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDayInterval\">\n      <summary>\n        Identifies the day interval for the recurrence pattern.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWeekInterval\">\n      <summary>\n        Identifies the number of weeks that occur between each meeting\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidMonthInterval\">\n      <summary>\n        Indicates the monthly interval of the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidYearInterval\">\n      <summary>\n        Indicates the monthly interval of the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidMonthOfYearMask\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOldRecurrenceType\">\n      <summary>\n        Indicates the month of the year in which the appointment or meeting occurs.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOwnerCriticalChange\">\n      <summary>\n        Specifies the date and time at which a Meeting Request object was sent by the\n        organizer.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidCalendarType\">\n      <summary>\n        Contains the value of the CalendarType field from the PidLidAppointmentRecur\n        property(section 2.22).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAllAttendeesList\">\n      <summary>\n        Deprecated\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidCleanGlobalObjectId\">\n      <summary>\n        Contains the value of the PidLidGlobalObjectId property (section 2.142) for an object\n        that represents an Exception object to a recurring series, where the Year, Month, and Day fields are\n        all zero.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentMessageClass\">\n      <summary>\n        Indicates the message class of the Meeting object to be generated from the Meeting\n        Request object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidMeetingType\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOldLocation\">\n      <summary>\n        Indicates the type of Meeting Request object or Meeting Update object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOldWhenStartWhole\">\n      <summary>\n        Indicates the original value of the PidLidAppointmentStartWhole property (section2.29) before a meeting update.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOldWhenEndWhole\">\n      <summary>\n        Indicates the original value of the PidLidAppointmentEndWhole property (section2.14) before a meeting update.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFileUnder\">\n      <summary>\n        Specifies the name under which to file a contact when displaying a list of contacts.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFileUnderId\">\n      <summary>\n        Specifies how to generate and recompute the value of the PidLidFileUnder property\n        (section 2.132) when other contact name properties change.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactItemData\">\n      <summary>\n        Specifies the visible fields in the application's user interface that are used to help display\n        the contact information.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReferredBy\">\n      <summary>\n        Deprecated\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDepartment\">\n      <summary>\n        This property is ignored by the server and is set to an empty string by the client\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidHasPicture\">\n      <summary>\n        Specifies whether the attachment has a picture.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidHomeAddress\">\n      <summary>\n        Specifies the complete address of the home address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddress\">\n      <summary>\n        Specifies the complete address of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOtherAddress\">\n      <summary>\n        Specifies the complete address of the contact’s other address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostalAddressId\">\n      <summary>\n        Specifies the complete address of the other address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactCharacterSet\">\n      <summary>\n        Specifies the character set used for this contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAutoLog\">\n      <summary>\n        Specifies the character set used for a Contact object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFileUnderList\">\n      <summary>\n        Specifies a list of possible values for the PidLidFileUnderId property (section 2.133)\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmailList\">\n      <summary>\n        The value of this property is ignored.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAddressBookProviderEmailList\">\n      <summary>\n        Specifies which electronic address properties are set on the Contact object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAddressBookProviderArrayType\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidHtml\">\n      <summary>\n        Specifies the state of the electronic addresses of the contact and represents a set of bit\n        flags.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidYomiFirstName\">\n      <summary>\n        Specifies the phonetic pronunciation of the given name of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidYomiLastName\">\n      <summary>\n        Specifies the phonetic pronunciation of the surname of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidYomiCompanyName\">\n      <summary>\n        Specifies the phonetic pronunciation of the company name of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidBusinessCardDisplayDefinition\">\n      <summary>\n        Contains user customization details for displaying a contact as a business card.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidBusinessCardCardPicture\">\n      <summary>\n        Contains the image to be used on a business card.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressStreet\">\n      <summary>\n        Specifies the street portion of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressCity\">\n      <summary>\n        Specifies the city or locality portion of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressState\">\n      <summary>\n        Specifies the state or province portion of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressPostalCode\">\n      <summary>\n        Specifies the postal code (ZIP code) portion of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressCountry\">\n      <summary>\n        Specifies the country code portion of the work address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressPostOfficeBox\">\n      <summary>\n        Specifies the post office box portion of the contact's work address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDistributionListChecksum\">\n      <summary>\n        Specifies the 32-bit cyclic redundancy check (CRC) polynomial checksum, as\n        specified in [ISO/IEC8802-3], calculated on the value of the PidLidDistributionListMembers\n        property(section 2.96).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidBirthdayEventEntryId\">\n      <summary>\n        Specifies the EntryID of an optional Appointment object that represents the birthday of\n        the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAnniversaryEventEntryId\">\n      <summary>\n        Specifies the EntryID of the Appointment object that represents an anniversary of\n        the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactUserField1\">\n      <summary>\n        Contains text used to add custom text to a business card representation of a Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactUserField2\">\n      <summary>\n        Contains text used to add custom text to a business card representation of a Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactUserField3\">\n      <summary>\n        Contains text used to add custom text to a business card representation of a Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidContactUserField4\">\n      <summary>\n        Contains text used to add custom text to a business card representation of a Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDistributionListName\">\n      <summary>\n        Specifies the name of the personal distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDistributionListOneOffMembers\">\n      <summary>\n        Specifies the list of one-off EntryIDs corresponding to the members of the personal\n        distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDistributionListMembers\">\n      <summary>\n        Specifies the 32-bit cyclic redundancy check (CRC) polynomial checksum, as\n        specified in [ISO/IEC8802-3], calculated on the value of PidLidDistributionListMembers(section 2.91)\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidInstantMessagingAddress\">\n      <summary>\n        Specifies the contact's instant messaging address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDistributionListStream\">\n      <summary>\n        Specifies the list of EntryIds and one-off EntryIds corresponding to the members of\n        the personal distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1DisplayName\">\n      <summary>\n        Specifies the user-readable display name for the email address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1AddressType\">\n      <summary>\n        Specifies the address type of an electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1EmailAddress\">\n      <summary>\n        Specifies the email address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1OriginalDisplayName\">\n      <summary>\n        Specifies the SMTP email address that corresponds to the email address for the Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1OriginalEntryId\">\n      <summary>\n        Specifies the EntryID of the object corresponding to this electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1RichTextFormat\">\n      <summary>\n        Returns true when the E-mail is stored in RTF format\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail1EmailType\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2DisplayName\">\n      <summary>\n        Specifies the user-readable display name for the e-mail address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2EntryId\">\n      <summary>\n        Specifies the EntryID of the object corresponding to this electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2AddressType\">\n      <summary>\n        Specifies the address type of an electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2EmailAddress\">\n      <summary>\n        Specifies the email address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2OriginalDisplayName\">\n      <summary>\n        Specifies the SMTP email address that corresponds to the email address for the Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2OriginalEntryId\">\n      <summary>\n        Specifies the EntryID of the object corresponding to this electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail2RichTextFormat\">\n      <summary>\n        Returns true when the E-mail is stored in RTF format\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3DisplayName\">\n      <summary>\n        Specifies the user-readable display name for the e-mail address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3EntryId\">\n      <summary>\n        Specifies the EntryID of the object corresponding to this electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3AddressType\">\n      <summary>\n        Specifies the address type of an electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3EmailAddress\">\n      <summary>\n        Specifies the email address of the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3OriginalDisplayName\">\n      <summary>\n        Specifies the SMTP email address that corresponds to the email address for the Contact\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3OriginalEntryId\">\n      <summary>\n        Specifies the EntryID of the object corresponding to this electronic address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidEmail3RichTextFormat\">\n      <summary>\n        Returns true when the E-mail is stored in RTF format\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax1AddressType\">\n      <summary>\n        Contains the string value \"FAX\".\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax1EmailAddress\">\n      <summary>\n        Contains a user-readable display name, followed by the \"@\" character, followed by a\n        fax number.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax1OriginalDisplayName\">\n      <summary>\n        Contains the same value as PidTagNormalizedSubject (section 2.907).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax1OriginalEntryId\">\n      <summary>\n        Specifies a one-off EntryId corresponding to this fax address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax2AddressType\">\n      <summary>\n        Contains the string value \"FAX\".\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax2EmailAddress\">\n      <summary>\n        Contains a user-readable display name, followed by the \"@\" character, followed by a\n        fax number.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax2OriginalDisplayName\">\n      <summary>\n        Contains the same value as PidTagNormalizedSubject (section 2.907).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax2OriginalEntryId\">\n      <summary>\n        Specifies a one-off EntryId corresponding to this fax address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax3AddressType\">\n      <summary>\n        Contains the string value \"FAX\".\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax3EmailAddress\">\n      <summary>\n        Contains a user-readable display name, followed by the \"@\" character, followed by a\n        fax number.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax3OriginalDisplayName\">\n      <summary>\n        Contains the same value as PidTagNormalizedSubject (section 2.907).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFax3OriginalEntryId\">\n      <summary>\n        Specifies a one-off EntryId corresponding to this fax address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFreeBusyLocation\">\n      <summary>\n        Specifies a URL path from which a client can retrieve free/busy status information\n        for the contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidHomeAddressCountryCode\">\n      <summary>\n        Specifies the country code portion of the contact's home address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWorkAddressCountryCode\">\n      <summary>\n        Specifies the country code portion of the contact's work address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOtherAddressCountryCode\">\n      <summary>\n        Specifies the country code portion of the contact's other address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidBirthdayLocal\">\n      <summary>\n        Specifies the birthday of a contact.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAddressCountryCode\">\n      <summary>\n        Specifies the country code portion of the contact's mailing address.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidWeddingAnniversaryLocal\">\n      <summary>\n        Specifies the wedding anniversary of the contact, at 0:00 in the client's local time\n        zone and it is saved without any time zone conversions.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskStatus\">\n      <summary>\n        Specifies the status of a task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPercentComplete\">\n      <summary>\n        Indicates whether a time-flagged Message object is completed or not.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTeamTask\">\n      <summary>\n        Specifies if the task is for a team\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskStartDate\">\n      <summary>\n        Specifies the date on which the user expects work on the task to begin.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskDueDate\">\n      <summary>\n        Specifies the date by which the user expects work on the task to be complete.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskResetReminder\">\n      <summary>\n        Indicates whether future instances of recurring tasks need reminders, even though\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidReminderSet\" />(section 2.220) is 0x00.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskAccepted\">\n      <summary>\n        Indicates whether a task assignee has replied to a task request for this Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskDeadOccurrence\">\n      <summary>\n        Indicates whether new occurrences remain to be generated.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskDateCompleted\">\n      <summary>\n        Specifies the date when the user completed work on the task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskActualEffort\">\n      <summary>\n        Indicates the number of minutes that the user actually spent working on a task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskEstimatedEffort\">\n      <summary>\n        Indicates the number of minutes that the user expects to work on a task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskVersion\">\n      <summary>\n        Indicates which copy is the latest update of a Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskState\">\n      <summary>\n        Indicates the current assignment state of the Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskLastUpdate\">\n      <summary>\n        Contains the date and time of the most recent change made to the Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskRecurrence\">\n      <summary>\n        Contains a RecurrencePattern structure that provides information about recurring\n        tasks.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskAssigners\">\n      <summary>\n        Contains a stack of entries, each representing a task assigner.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskStatusOnComplete\">\n      <summary>\n        Indicates whether the task assignee has been requested to send an e-mail message\n        update when the task assignee completes the assigned task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskHistory\">\n      <summary>\n        Indicates the type of change that was last made to the Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskUpdates\">\n      <summary>\n        Indicates whether the task assignee has been requested to send a task update when\n        the assigned Task object changes.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskComplete\">\n      <summary>\n        Indicates that the task has been completed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskFCreator\">\n      <summary>\n        Indicates that the Task object was originally created by the action of the current user\n        or user agent instead of by the processing of a task request.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskOwner\">\n      <summary>\n        Contains the name of the task owner.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskMultipleRecipients\">\n      <summary>\n        Provides optimization hints about the recipients of a Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskAssigner\">\n      <summary>\n        Specifies the name of the user that last assigned the task.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskLastUser\">\n      <summary>\n        Contains the name of the most recent user to have been the task owner.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskOrdinal\">\n      <summary>\n        Provides an aid to custom sorting of Task objects\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskNoCompute\">\n      <summary>\n        Not used. The client can set this property, but it has no impact on the Task-Related\n        Objects protocol and is ignored by the server.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskLastDelegate\">\n      <summary>\n        Contains the name of the user who most recently assigned the task, or the user to\n        whom it was most recently assigned.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskFRecurring\">\n      <summary>\n        Indicates whether the task includes a recurrence pattern.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskRole\">\n      <summary>\n        Not used. The client can set this property, but it has no impact on the Task-Related\n        Objects protocol and is ignored by the server.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskOwnership\">\n      <summary>\n        Indicates the role of the current user relative to the Task object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAcceptanceState\">\n      <summary>\n        The acceptance state of the task\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskFFixOffline\">\n      <summary>\n        Indicates the accuracy of PidLidTaskOwner (section 2.326).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskCustomFlags\">\n      <summary>\n        The client can set this property, but it has no impact on the Task-Related Objects\n        protocol and is ignored by the server.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTaskMode\">\n      <summary>\n        The client can set this property, but it has no impact on the Task-Related Objects\n        protocol and is ignored by the server.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTrustRecipientHighlights\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSendMeetingAsIcal\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentSequence\">\n      <summary>\n        Specifies the sequence number of a Meeting object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentSequenceTime\">\n      <summary>\n        Indicates the date and time at which the property PidLidAppointmentSequence\n        (section 2.25) was last modified.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentLastSequence\">\n      <summary>\n        Indicates to the organizer the last sequence number that was sent to any attendee.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidChangeHighlight\">\n      <summary>\n        Specifies a bit field that indicates how the Meeting object has changed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidBusyStatus\">\n      <summary>\n        Specifies the availability of a user for the event described by the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFExceptionalBody\">\n      <summary>\n        Indicates that the Exception Embedded Message object has a body that differs from the\n        Recurring Calendar object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentAuxiliaryFlags\">\n      <summary>\n        Specifies a bit field that describes the auxiliary state of the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLocation\">\n      <summary>\n        Indicates whether the value of the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidLocation\" /> property (section 2.159) is set to\n        the PidTagDisplayName property(section 2.667).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidMeetingWorkspaceUrl\">\n      <summary>\n        Specifies the URL of the Meeting Workspace that is associated with a Calendar object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidForwardInstance\">\n      <summary>\n        Indicates whether the Meeting Request object represents an exception to a recurring\n        series, and whether it was forwarded(even when forwarded by the organizer) rather than being an\n        invitation sent by the organizer.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLinkedTaskItems\">\n      <summary>\n        Indicates whether the user did not include any text in the body of the Meeting Response\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartWhole\">\n      <summary>\n        Specifies time zone information that indicates the time zone of the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartWhole\" /> property(section 2.29).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndWhole\">\n      <summary>\n        Specifies time zone information that indicates the time zone of the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndWhole\" /> property(section 2.14).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartTime\">\n      <summary>\n        Identifies the time that the appointment starts.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndTime\">\n      <summary>\n        Indicates the time that the appointment ends.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndDate\">\n      <summary>\n        Indicates the date that the appointment ends.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartDate\">\n      <summary>\n        Identifies the date that the appointment starts.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentDuration\">\n      <summary>\n        Specifies the length of the event, in minutes.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentColor\">\n      <summary>\n        Specifies the color to be used when displaying the Calendar object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentSubType\">\n      <summary>\n        Specifies whether the event is an all-day event.\n      </summary>\n      <remarks>\n        This property specifies whether or not the event is an all-day event, as\n        specified by the user. A value of <c>true</c> indicates that the event is an all-day\n        event, in which case the start time and end time must be midnight so that the\n        duration is a multiple of 24 hours and is at least 24 hours. A value of <c>false</c>\n        or the absence of this property indicates the event is not an all-day event. The\n        client or server must not infer the value as TRUE when a user happens to create an\n        event that is 24 hours, even if the event starts and ends at midnight.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentRecur\">\n      <summary>\n        Contains the value of the CalendarType field from the PidLidAppointmentRecur\n        property(section 2.22).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStateFlags\">\n      <summary>\n        Specifies a bit field that describes the state of the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidResponseStatus\">\n      <summary>\n        Specifies the response status of an attendee.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentReplyTime\">\n      <summary>\n        Specifies the date and time at which the attendee responded to a received meeting\n        request or Meeting Update object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRecurring\">\n      <summary>\n        Specifies whether the object represents a recurring series.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidIntendedBusyStatus\">\n      <summary>\n        Contains the value of the PidLidBusyStatus property (section 2.47) on the Meeting\n        object in the organizer's calendar at the time the Meeting Request object or Meeting\n        Update object was sent.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentUpdateTime\">\n      <summary>\n        Indicates the time at which the appointment was last updated.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidExceptionReplaceTime\">\n      <summary>\n        Specifies the date and time, in UTC, within a recurrence pattern that an exception will\n        replace.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFInvited\">\n      <summary>\n        Indicates whether invitations have been sent for the meeting that this Meeting object\n        represents.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFExceptionalAttendees\">\n      <summary>\n        Indicates that the object is a Recurring Calendar object with one or more\n        exceptions, and at least one of the Exception Embedded Message objects has at least\n        one RecipientRow.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOwnerName\">\n      <summary>\n        Indicates the name of the owner of the mailbox.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidFOthersAppointment\">\n      <summary>\n        Indicates whether the Calendar folder from which the meeting was opened is\n        another user's calendar.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentReplyName\">\n      <summary>\n        Specifies the user who last replied to the meeting request or meeting update.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRecurrenceType\">\n      <summary>\n        Specifies the recurrence type of the recurring series.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRecurrencePattern\">\n      <summary>\n        Specifies a description of the recurrence pattern of the Calendar object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTimeZoneStruct\">\n      <summary>\n        Specifies a human-readable description of the time zone that is represented by the\n        data in the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidTimeZoneStruct\" /> property(section 2.340).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidTimeZoneDescription\">\n      <summary>\n        Specifies a human-readable description of the time zone that is represented by the\n        data in the PidLidTimeZoneStruct property(section 2.340).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidClipStart\">\n      <summary>\n        Specifies the start date and time of the event in UTC.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidClipEnd\">\n      <summary>\n        Specifies the end date and time of the event in UTC.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOriginalStoreEntryId\">\n      <summary>\n        The original store id\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAllAttendeesString\">\n      <summary>\n        Specifies a list of all the attendees except for the organizer, including resources and\n        unsendable attendees.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAutoFillLocation\">\n      <summary>\n        Indicates whether the value of the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidLocation\" /> property (section 2.157)\n        is set to the <see cref=\"P:MsgKit.PropertyTags.PR_DISPLAY_NAME_W\" /> property(section 2.746)\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidToAttendeesString\">\n      <summary>\n        Contains a list of all the sendable attendees who are also required attendees.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidCcAttendeesString\">\n      <summary>\n        Contains a list of all the sendable attendees who are also optional attendees.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConferencingCheck\">\n      <summary>\n        When set to TRUE (0x00000001), the PidLidConferencingCheck property ([MS-OXPROPS] section 2.65)\n        indicates that the associated meeting is one of the following types:\n        -   \"Windows Media Services\"\n        -   \"Windows NetMeeting\"\n        -   \"Exchange Conferencing\"\n\n        If this property is set, <see cref=\"P:MsgKit.NamedPropertyTags.PidLidConferencingType\" /> (section 2.2.1.51.3) is also to\n        be set. This property is set to TRUE only on Meeting objects or meeting-related objects.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConferencingType\">\n      <summary>\n        Specifies the type of the meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDirectory\">\n      <summary>\n        Specifies the directory server to be used with NetMeeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOrganizerAlias\">\n      <summary>\n        Specifies the e-mail address of the organizer.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAutoStartCheck\">\n      <summary>\n        Specifies whether or not to automatically start the conferencing application when a\n        reminder for the meeting fires.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAutoStartWhen\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAllowExternalCheck\">\n      <summary>\n        This property is set to TRUE\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidCollaborateDoc\">\n      <summary>\n        Specifies the document to be launched when the user joins the meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNetShowUrl\">\n      <summary>\n        Specifies the URL to be launched when the user joins the meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOnlinePassword\">\n      <summary>\n        Specifies the password for a meeting on which the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidConferencingType\" /> property\n        (section 2.66) has the value 0x00000002.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentProposedStartWhole\">\n      <summary>\n        Specifies the proposed value for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartWhole\" />\n        property (section 2.29) for a counter proposal.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentProposedEndWhole\">\n      <summary>\n        Specifies the proposed value for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndWhole\" />\n        property (section 2.14)\n        for a counter proposal.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentProposedDuration\">\n      <summary>\n        Indicates the proposed value for the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentDuration\" />\n        property (section 2.11)\n        for a counter proposal.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentCounterProposal\">\n      <summary>\n        Indicates whether a Meeting Response object is a counter proposal.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentProposalNumber\">\n      <summary>\n        Specifies the number of attendees who have sent counter proposals that have not been\n        accepted or rejected by the organizer.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentNotAllowPropose\">\n      <summary>\n        Indicates whether attendees are not allowed to propose a new date and/or time for the\n        meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentUnsendableRecipients\">\n      <summary>\n        Contains a list of unsendable attendees.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentTimeZoneDefinitionStartDisplay\">\n      <summary>\n        Specifies time zone information that indicates the time zone of the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentStartWhole\" /> property(section 2.29).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentTimeZoneDefinitionEndDisplay\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentTimeZoneDefinitionRecur\">\n      <summary>\n        Specifies time zone information that indicates the time zone of the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidAppointmentEndWhole\" /> property(section 2.14).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidForwardNotificationRecipients\">\n      <summary>\n        Contains a list of <see cref=\"T:MsgKit.Structures.RecipientRow\" /> structures, as described in [MS-OXCDATA] section 2.8.3,\n        that indicate the <see cref=\"T:MsgKit.Recipients\" /> of a meeting forward.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidInboundICalStream\">\n      <summary>\n        Contains the contents of the iCalendar MIME part of the original MIME message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderDelta\">\n      <summary>\n        Specifies the interval, in minutes, between the time at which the reminder first\n        becomes overdue and the start time of the Calendar object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderFileParameter\">\n      <summary>\n        Specifies the filename of the sound that a client is to play when the reminder for that\n        object becomes overdue.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderOverride\">\n      <summary>\n        Specifies whether the client is to respect the values PidLidReminderPlaySound (section\n        2.219) and <see cref=\"P:MsgKit.NamedPropertyTags.PidLidReminderFileParameter\" /> (section 2.217), or use the default\n        values for those properties.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderPlaySound\">\n      <summary>\n        Specifies whether the client is to play a sound when the reminder becomes overdue.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderSet\">\n      <summary>\n        Specifies whether a reminder is set on the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderSignalTime\">\n      <summary>\n        Specifies the point in time when a reminder transitions from pending to overdue.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderTime\">\n      <summary>\n        Specifies the initial signal time for non-Calendar objects.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderTimeDate\">\n      <summary>\n        Indicates the time and date of the reminder for the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderTimeTime\">\n      <summary>\n        Indicates the time of the reminder for the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidReminderType\">\n      <summary>\n        This property is not set and if set, is ignored.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSingleBodyIcal\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDayOfMonth\">\n      <summary>\n        Identifies the day of the month for the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidICalendarDayOfWeekMask\">\n      <summary>\n        Specifies the contact’s business web page URL.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidOccurrences\">\n      <summary>\n        Indicates the number of occurrences in the recurring appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidMonthOfYear\">\n      <summary>\n        Indicates the number of occurrences in the recurring appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoEndDateFlag\">\n      <summary>\n        Indicates whether the recurrence pattern has an end date.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRecurrenceDuration\">\n      <summary>\n        Identifies the length, in minutes, of the appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRemoteStatus\">\n      <summary>\n        Indicates the remote status of the calendar item.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationActionMoveFolderEid\">\n      <summary>\n        Contains the entry ID for the destination folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationActionMoveStoreEid\">\n      <summary>\n        Contains the entry ID for a move to a folder in a different store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationActionMaxDeliveryTime\">\n      <summary>\n        Contains the maximum value of <see cref=\"P:MsgKit.PropertyTags.PR_MESSAGE_DELIVERY_TIME\" /> (section 2.886) of all the\n        E-mail objects modified in response to the last time the user changed a conversation action on the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationProcessed\">\n      <summary>\n        Contains the time (in UTC) that an E-mail object was last received in the\n        conversation, or the last time that the user modified the conversation action, whichever occurs\n        later.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationActionLastAppliedTime\">\n      <summary>\n        Contains the time (in UTC) that an E-mail object was last received in the\n        conversation, or the last time that the user modified the conversation action, whichever occurs\n        later.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidConversationActionVersion\">\n      <summary>\n        Contains the version of the conversation action FAI message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogType\">\n      <summary>\n        Briefly describes the activity that is being recorded.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogStart\">\n      <summary>\n        Contains the time at which the activity began.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogDuration\">\n      <summary>\n        Contains the duration in minutes of the activity.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogEnd\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogFlags\">\n      <summary>\n        Contains the time at which the activity ended.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDocumentPrinted\">\n      <summary>\n        Indicates whether the document was printed during journaling.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDocumentSaved\">\n      <summary>\n        Indicates whether the document was saved during journaling.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDocumentRouted\">\n      <summary>\n        Indicates whether the document was routed during journaling.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidDocumentPosted\">\n      <summary>\n        Indicates whether the document was posted during journaling.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidLogTypeDesc\">\n      <summary>\n        Describes the activity that is being recorded.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssChannelLink\">\n      <summary>\n        Contains the URL of the RSS or Atom feed that the XML file came from.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssItemLink\">\n      <summary>\n        Contains the URL of the link from the item.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssItemHash\">\n      <summary>\n        Contains a hash of the feed XML computed by using an implementation-dependent\n        algorithm.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssItemGuid\">\n      <summary>\n        Contains a unique identifier for the RSS object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssChannel\">\n      <summary>\n        Contains the contents of the title field from the XML of the Atom feed or RSS channel.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssItemXml\">\n      <summary>\n        Contains the item element and all its sub-elements from an RSS feed, or the entry\n        element and all its sub-elements from an Atom feed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPostRssSubscription\">\n      <summary>\n        Contains the user's preferred name for the subscription.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidPrivate\">\n      <summary>\n        Contains the user's preferred name for the subscription.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingStatus\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderGuid\">\n      <summary>\n        Contains the value \"%xAE.F0.06.00.00.00.00.00.C0.00.00.00.00.00.00.46\".\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderName\">\n      <summary>\n        Contains a user-displayable name of the sharing provider identified by the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderGuid\" /> property(section 2.266).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderUrl\">\n      <summary>\n        Contains a URL related to the sharing provider identified by the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderGuid\" /> property(section 2.266).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemotePath\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteName\">\n      <summary>\n        Contains the same value as the PidLidSharingRemoteName property (section 2.277).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteUid\">\n      <summary>\n        Contains the EntryID of the folder being shared.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingInitiatorName\">\n      <summary>\n        Contains the value of the PidTagDisplayName property(section 2.667) from the\n        Address Book object identified by the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingInitiatorEntryId\" />\n        property(section 2.248).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingInitiatorSmtp\">\n      <summary>\n        Contains the value of the PidTagSmtpAddress property (section 2.1010) from the\n        Address Book object identified by the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingInitiatorEntryId\" />\n        property(section 2.248).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingInitiatorEntryId\">\n      <summary>\n        Contains the value of the PidTagEntryId property (section 2.674) for\n        the Address Book object of the currently logged-on user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingFlags\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderExtension\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteUser\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemotePass\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalPath\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalName\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalUid\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingFilter\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalType\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingFolderEntryId\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingCapabilities\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingFlavor\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingAnonymity\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingReciprocation\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingPermissions\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingInstanceGuid\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteType\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingParticipants\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLastSyncTime\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingExtensionXml\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteLastModificationTime\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalLastModificationTime\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingConfigurationUrl\">\n      <summary>\n        Contains a zero-length string.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingStart\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingStop\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingResponseType\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingResponseTime\">\n      <summary>\n        Contains the time at which the recipient of the sharing request sent a sharing response.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingOriginalMessageEntryId\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingSyncInterval\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingDetail\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingTimeToLive\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingBindingEntryId\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingIndexEntryId\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteComment\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingWorkingHoursStart\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingWorkingHoursEnd\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingWorkingHoursDays\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingWorkingHoursTimeZone\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingDataRangeStart\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingDataRangeEnd\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRangeStart\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRangeEnd\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteStoreUid\">\n      <summary>\n        Contains a hexadecimal string representation of the value of the PidTagStoreEntryId\n        property(section 2.1018) on the folder being shared.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalStoreUid\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteByteSize\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteCrc\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLocalComment\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRoamLog\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteMessageCount\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingBrowseUrl\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingLastAutoSyncTime\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingTimeToLiveAuto\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteVersion\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingParentBindingEntryId\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidSharingSyncFlags\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoteColor\">\n      <summary>\n        Specifies the suggested background color of the Note object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoteWidth\">\n      <summary>\n        Specifies the width of the visible message window in pixels.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoteHeight\">\n      <summary>\n        Specifies the height of the visible message window in pixels.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoteX\">\n      <summary>\n        Specifies the distance, in pixels, from the left edge of the screen that a user interface\n        displays a Note object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidNoteY\">\n      <summary>\n        Specifies the distance, in pixels, from the top edge of the screen that a user interface\n        displays a Note object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidCategories\">\n      <summary>\n        Contains the array of text labels assigned to this Message object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameApplicationName\">\n      <summary>\n        Specifies the application used to open the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAuthor\">\n      <summary>\n        Specifies the author of the file attached to the Document object\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameByteCount\">\n      <summary>\n        Specifies the size, in bytes, of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarAttendeeRole\">\n      <summary>\n        Specifies the role of the attendee.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarBusyStatus\">\n      <summary>\n        Specifies whether the attendee is busy at the time of an appointment on their calendar.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarContact\">\n      <summary>\n        Identifies the name of a contact who is an attendee of a meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarContactUrl\">\n      <summary>\n        Identifies the URL where you can access contact information in HTML format\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarCreated\">\n      <summary>\n        Identifies the date and time, in UTC, when the organizer created the appointment or\n        meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarDescriptionUrl\">\n      <summary>\n        Specifies the URL of a resource that contains a description of an appointment or\n        meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarDuration\">\n      <summary>\n        Identifies the duration, in seconds, of an appointment or meeting.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarExceptionDate\">\n      <summary>\n        Identifies a list of dates that are exceptions to a recurring appointment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCalendarExceptionRule\">\n      <summary>\n        Specifies an exception rule for a recurring appointment\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCategory\">\n      <summary>\n        Specifies the category of the file attached to the Document object\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCharacterCount\">\n      <summary>\n        Specifies the character count of the file attached to the Document object\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameComments\">\n      <summary>\n        Specifies the comments of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCompany\">\n      <summary>\n        Specifies the company for which the file was created.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCreateDateTimeReadOnly\">\n      <summary>\n        Specifies the time, in UTC, that the file was first created.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameRightsManagementLicense\">\n      <summary>\n        Specifies the value used to cache the Use License for the rights-managed email\n        message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameEditTime\">\n      <summary>\n        Specifies the time that the file was last edited.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameHiddenCount\">\n      <summary>\n        Specifies the hidden value of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameKeywords\">\n      <summary>\n        Contains keywords or categories for the Message object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameLastAuthor\">\n      <summary>\n        Specifies the most recent author of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameLastPrinted\">\n      <summary>\n        Specifies the time, in UTC, that the file was last printed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameLastSaveDateTime\">\n      <summary>\n        Specifies the time, in UTC, that the file was last saved.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameLineCount\">\n      <summary>\n        Specifies the number of lines in the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameManager\">\n      <summary>\n        Specifies the manager of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameMultimediaClipCount\">\n      <summary>\n        Specifies the number of multimedia clips in the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameNoteCount\">\n      <summary>\n        Specifies the number of notes in the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOMSAccountGuid\">\n      <summary>\n        Contains the GUID of the SMS account used to deliver the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOMSMobileModel\">\n      <summary>\n        Indicates the model of the mobile device used to send the SMS or MMS message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOMSGScheduleTime\">\n      <summary>\n        Contains the time, in UTC, at which the client requested that the service provider send\n        the SMS or MMS message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOMSServiceType\">\n      <summary>\n        Contains the type of service used to send an SMS or MMS message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOMSSourceType\">\n      <summary>\n        Contains the source of an SMS or MMS message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNamePhishingStamp\">\n      <summary>\n        Indicates whether a message is likely to be phishing.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameSpoofingStamp\">\n      <summary>\n        Indicates whether a message is likely to be spoofing.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNamePageCount\">\n      <summary>\n        Specifies the page count of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameParagraphCount\">\n      <summary>\n        Specifies the number of paragraphs in the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNamePresentationFormat\">\n      <summary>\n        Specifies the presentation format of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameSecurity\">\n      <summary>\n        Specifies the security level of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameSlideCount\">\n      <summary>\n        Specifies the number of slides in the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameSubject\">\n      <summary>\n        Specifies the subject of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameTemplate\">\n      <summary>\n        Specifies the template of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameTitle\">\n      <summary>\n        Specifies the title of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameWordCount\">\n      <summary>\n        Specifies the word count of the file attached to the Document object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAcceptLanguage\">\n      <summary>\n        Contains the value of the MIME Accept-Language header.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameApproved\">\n      <summary>\n        This property specifies the address of the moderator that approved and posted a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameApprovalAllowedDescisionMakers\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameApprovalRequestor\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAuthenticatedAs\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAuthenticatedDomain\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAuthenticatedMechanism\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAuthenticatedSource\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameBcc\">\n      <summary>\n        This property specifies the blind carbon copy addressees of the message. This property\n        SHOULD be directly imported from and exported to the bcc header that is specified in\n        [RFC822].\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCc\">\n      <summary>\n        This property specifies the carbon copy addressees of the message. This property SHOULD\n        be directly imported from and exported to the cc header that is specified in [RFC822].\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentBase\">\n      <summary>\n        Specifies the value of the MIME Content-Base header, which defines the base URI for\n        resolving relative URLs contained within the message body.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentClass\">\n      <summary>\n        Contains a string that identifies the type of content of a Message object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentDisposition\">\n      <summary>\n        This property specifies the intended disposition of the body part.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentID\">\n      <summary>\n        This property specifies a unique identifier for the body part.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentLanguage\">\n      <summary>\n        This property specifies the language identifier for the text content of the body part.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentLocation\">\n      <summary>\n        This property specifies the Uniform Resource Identifier (URI) that corresponds to the content\n        of the body part.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentTransferEncoding\">\n      <summary>\n        This property specifies the encoding mechanism used to encode the content of the body part.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameContentType\">\n      <summary>\n        This property specifies the type of the body part's content.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameCrossReference\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingBrowseUrl\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingCapabilities\">\n      <summary>\n        Contains a string representation of the value of the\n        <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingCapabilities\" />\n        property(section 2.237).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingConfigUrl\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingConfigurationUrl\" /> property (section 2.238).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingExtendedCaps\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingFlavor\">\n      <summary>\n        Contains a hexadecimal string representation of the value of the PidLidSharingFlavor\n        property(section 2.245).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingInstanceGuid\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingLocalType\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingProviderGuid\">\n      <summary>\n        Contains the same value as the PidLidSharingLocalType property (section 2.259).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingProviderName\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderName\" /> property (section 2.267).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingProviderUrl\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingProviderUrl\" /> property (section 2.268).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingRemoteName\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteName\" /> property (section 2.277).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingRemotePath\">\n      <summary>\n        Contains a value that is ignored by the server no matter what value is generated by the\n        client.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingRemoteStoreUid\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteStoreUid\" /> property (section 2.282).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingRemoteType\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteType\" /> property (section 2.281).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSharingRemoteUid\">\n      <summary>\n        Contains the same value as the <see cref=\"P:MsgKit.NamedPropertyTags.PidLidSharingRemoteUid\" /> property (section 2.282).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXSieve\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXVirusScanned\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidClientIntent\">\n      <summary>\n        Indicates what actions the user has taken on this Meeting object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidServerProcessed\">\n      <summary>\n        Indicates whether the Meeting Request object or Meeting Update object has been\n        processed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidServerProcessingActions\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAttachmentMacContentType\">\n      <summary>\n        Contains the Content-Type of the Mac attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAttachmentMacInfo\">\n      <summary>\n        Contains the headers and resource fork data associated with the Mac attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAudioNotes\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameAutomaticSpeechRecognitionData\">\n      <summary>\n        Contains textual annotations to a voice message after it has been delivered to the user's\n        mailbox.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOutlookProtectionRuleTimestamp\">\n      <summary>\n        Outlook protection rule timestamp\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXUnifiedMessagingPartnerAssignedId\">\n      <summary>\n        X-Unified messaging partner assigned id\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameXUnifiedMessagingPartnerContent\">\n      <summary>\n        X-Unified messaging partner content\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidNameOriginalSpamConfidenceLevel\">\n      <summary>\n        The spam confidence level\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRemoteTransferSize\">\n      <summary>\n        Indicates the transfer size, in bytes, for a remote item.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTags.PidLidRemoteAttachment\">\n      <summary>\n        Indicates whether a remote item has an attachment associated with it.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.NamedPropertyTag\">\n      <summary>\n        Used to hold exactly one named property tag\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTag.Id\">\n      <summary>\n        The 2 byte identifier\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTag.Name\">\n      <summary>\n        The name of the property\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTag.Guid\">\n      <summary>\n        The <see cref=\"P:MsgKit.NamedPropertyTag.Guid\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.NamedPropertyTag.Type\">\n      <summary>\n        The 2 byte <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.NamedPropertyTag.#ctor(System.UInt16,System.String,System.Guid,MsgKit.Enums.PropertyType)\">\n      <summary>\n        Creates this object and sets all its properties\n      </summary>\n      <param name=\"id\">The id</param>\n      <param name=\"name\">The name of the property</param>\n      <param name=\"guid\">The property <see cref=\"P:MsgKit.NamedPropertyTag.Guid\" /></param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n    </member>\n    <member name=\"T:MsgKit.PropertyTags\">\n      <summary>\n        A class that holds all the known mapi tags\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.RecipientStoragePrefix\">\n      <summary>\n        The prefix for an <see cref=\"T:MsgKit.Recipient\" /> <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.AttachmentStoragePrefix\">\n      <summary>\n        The prefix for an <see cref=\"T:MsgKit.Attachment\" /> <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.SubStorageStreamPrefix\">\n      <summary>\n        The prefix for a <see cref=\"T:MsgKit.PropertyTag\" /> <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.PropertiesStreamName\">\n      <summary>\n        The name for the properties stream\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.NameIdStorage\">\n      <summary>\n        The name id storage (named property mapping storage)\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.EntryStream\">\n      <summary>\n        The <see cref=\"T:MsgKit.Streams.EntryStream\" /> stream\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.GuidStream\">\n      <summary>\n        The <see cref=\"T:MsgKit.Streams.GuidStream\" /> stream\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.PropertyTags.StringStream\">\n      <summary>\n        The <see cref=\"T:MsgKit.Streams.StringStream\" /> stream\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ACKNOWLEDGEMENT_MODE\">\n      <summary>\n        Contains the identifier of the mode for message acknowledgment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ALTERNATE_RECIPIENT_ALLOWED\">\n      <summary>\n        Contains TRUE if the sender permits auto forwarding of this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AUTHORIZING_USERS\">\n      <summary>\n        Contains a list of entry identifiers for users who have authorized the sending of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AUTO_FORWARD_COMMENT_W\">\n      <summary>\n        Contains a unicode comment added by the auto-forwarding agent.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AUTO_FORWARD_COMMENT_A\">\n      <summary>\n        Contains a comment added by the auto-forwarding agent.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AUTO_FORWARDED\">\n      <summary>\n        Contains TRUE if the client requests an X-MS-Exchange-Organization-AutoForwarded header field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID\">\n      <summary>\n        Contains an identifier for the algorithm used to confirm message content confidentiality.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_CORRELATOR\">\n      <summary>\n        Contains a value the message sender can use to match a report with the original message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_IDENTIFIER_W\">\n      <summary>\n        Contains a unicode key value that enables the message recipient to identify its content.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_IDENTIFIER_A\">\n      <summary>\n        Contains a ANSI key value that enables the message recipient to identify its content.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_LENGTH\">\n      <summary>\n        Contains a message length, in bytes, passed to a client application or service provider to determine if a message\n        of that length can be delivered.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_RETURN_REQUESTED\">\n      <summary>\n        Contains TRUE if a message should be returned with a nondelivery report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSATION_KEY\">\n      <summary>\n        Contains the conversation key used in Microsoft Outlook only when locating IPM.MessageManager messages, such as the\n        message that contains download history for a Post Office Protocol (POP3) account. This property has been deprecated\n        in Exchange Server.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSION_EITS\">\n      <summary>\n        Contains the encoded information types (EITs) that are applied to a message in transit to describe conversions.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSION_WITH_LOSS_PROHIBITED\">\n      <summary>\n        Contains TRUE if a message transfer agent (MTA) is prohibited from making message text conversions that lose\n        information.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERTED_EITS\">\n      <summary>\n        Contains an identifier for the types of text in a message after conversion.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEFERRED_DELIVERY_TIME\">\n      <summary>\n        Contains the date and time when a message sender wants a message delivered.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DELIVER_TIME\">\n      <summary>\n        Contains the date and time when the original message was delivered.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISCARD_REASON\">\n      <summary>\n        Contains a reason why a message transfer agent (MTA) has discarded a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISCLOSURE_OF_RECIPIENTS\">\n      <summary>\n        Contains TRUE if disclosure of recipients is allowed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DL_EXPANSION_HISTORY\">\n      <summary>\n        Contains a history showing how a distribution list has been expanded during message transmiss\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DL_EXPANSION_PROHIBITED\">\n      <summary>\n        Contains TRUE if a message transfer agent (MTA) is prohibited from expanding distribution lists.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_EXPIRY_TIME\">\n      <summary>\n        Contains the date and time when the messaging system can invalidate the content of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IMPLICIT_CONVERSION_PROHIBITED\">\n      <summary>\n        Contains the date and time when the messaging system can invalidate the content of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IMPORTANCE\">\n      <summary>\n        Contains a value that indicates the message sender's opinion of the importance of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_ID\">\n      <summary>\n        The IpmId field represents a PR_IPM_ID MAPI property.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LATEST_DELIVERY_TIME\">\n      <summary>\n        Contains the latest date and time when a message transfer agent (MTA) should deliver a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_CLASS_W\">\n      <summary>\n        Contains a text string that identifies the sender-defined message class, such as IPM.Note.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_CLASS_A\">\n      <summary>\n        Contains a text string that identifies the sender-defined message class, such as IPM.Note.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_DELIVERY_ID\">\n      <summary>\n        Contains a message transfer system (MTS) identifier for a message delivered to a client application.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_SECURITY_LABEL\">\n      <summary>\n        Contains a security label for a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OBSOLETED_IPMS\">\n      <summary>\n        Contains the identifiers of messages that this message supersedes.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIPIENT_NAME\">\n      <summary>\n        Contains the encoded name of the originally intended recipient of an autoforwarded message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_EITS\">\n      <summary>\n        Contains a copy of the original encoded information types (EITs) for message text.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_CERTIFICATE\">\n      <summary>\n        Contains an ASN.1 certificate for the message originator.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender requests a delivery report for a particular recipient from the messaging system\n        before the message is placed in the message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_RETURN_ADDRESS\">\n      <summary>\n        Contains the binary-encoded return address of the message originator.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PARENT_KEY\">\n      <summary>\n        Was originally meant to contain a value used in correlating conversation threads. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIORITY\">\n      <summary>\n        Contains the relative priority of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGIN_CHECK\">\n      <summary>\n        Contains a binary verification value enabling a delivery report recipient to verify the origin of the original\n        message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROOF_OF_SUBMISSION_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender requests proof that the message transfer system has submitted a message for\n        delivery to the originally intended recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_READ_RECEIPT_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender wants the messaging system to generate a read report when the recipient has read\n        a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIPT_TIME\">\n      <summary>\n        Contains the date and time a delivery report is generated.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_REASSIGNMENT_PROHIBITED\">\n      <summary>\n        Contains TRUE if recipient reassignment is prohibited.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REDIRECTION_HISTORY\">\n      <summary>\n        Contains information about the route covered by a delivered message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RELATED_IPMS\">\n      <summary>\n        Contains a list of identifiers for messages to which a message is related.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENSITIVITY\">\n      <summary>\n        Contains the sensitivity value assigned by the sender of the first version of a message — that is, the message\n        before being forwarded or replied to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LANGUAGES_W\">\n      <summary>\n        Contains an ASCII list of the languages incorporated in a message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LANGUAGES_A\">\n      <summary>\n        Contains an ASCII list of the languages incorporated in a message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPLY_TIME\">\n      <summary>\n        Contains the date and time by which a reply is expected for a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_TAG\">\n      <summary>\n        Contains a binary tag value that the messaging system should copy to any report generated for the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_TIME\">\n      <summary>\n        Contains the date and time when the messaging system generated a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RETURNED_IPM\">\n      <summary>\n        Contains TRUE if the original message is being returned with a nonread report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SECURITY\">\n      <summary>\n        Contains a flag that indicates the security level of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INCOMPLETE_COPY\">\n      <summary>\n        Contains TRUE if this message is an incomplete copy of another message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENSITIVITY\">\n      <summary>\n        Contains a value indicating the message sender's opinion of the sensitivity of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBJECT_W\">\n      <summary>\n        Contains the full subject, encoded in Unicode standard, of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBJECT_A\">\n      <summary>\n        Contains the full subject, encoded in ANSI standard, of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBJECT_IPM\">\n      <summary>\n        Contains a binary value that is copied from the message for which a report is being generated.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CLIENT_SUBMIT_TIME\">\n      <summary>\n        Contains the date and time the message sender submitted a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_NAME_W\">\n      <summary>\n        Contains the unicode display name for the recipient that should get reports for this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_NAME_A\">\n      <summary>\n        Contains the ANSI display name for the recipient that should get reports for this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_SEARCH_KEY\">\n      <summary>\n        Contains the search key for the messaging user represented by the sender.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_X400_CONTENT_TYPE\">\n      <summary>\n        This property contains the content type for a submitted message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBJECT_PREFIX_W\">\n      <summary>\n        Contains a unicode subject prefix that typically indicates some action on a messagE, such as \"FW: \" for forwarding.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBJECT_PREFIX_A\">\n      <summary>\n        Contains a ANSI subject prefix that typically indicates some action on a messagE, such as \"FW: \" for forwarding.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NON_RECEIPT_REASON\">\n      <summary>\n        Contains reasons why a message was not received that forms part of a non-delivery report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the messaging user that actually receives the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_NAME_W\">\n      <summary>\n        Contains the display name of the messaging user that actually receives the message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_NAME_A\">\n      <summary>\n        Contains the display name of the messaging user that actually receives the message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_ENTRYID\">\n      <summary>\n        Contains the entry identifier for the messaging user represented by the sender.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_NAME_W\">\n      <summary>\n        Contains the display name for the messaging user represented by the sender. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_NAME_A\">\n      <summary>\n        Contains the display name for the messaging user represented by the sender. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_NAME_W\">\n      <summary>\n        Contains the display name for the messaging user represented by the receiving user. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_NAME_A\">\n      <summary>\n        Contains the display name for the messaging user represented by the receiving user. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_ENTRYID\">\n      <summary>\n        Contains the entry identifier for the recipient that should get reports for this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_READ_RECEIPT_ENTRYID\">\n      <summary>\n        Contains an entry identifier for the messaging user to which the messaging system should direct a read report for\n        this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_SUBMISSION_ID\">\n      <summary>\n        Contains a message transfer system (MTS) identifier for the message transfer agent (MTA).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_SUBMIT_TIME\">\n      <summary>\n        Contains the date and time a transport provider passed a message to its underlying messaging system.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SUBJECT_W\">\n      <summary>\n        Contains the subject of an original message for use in a report about the message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SUBJECT_A\">\n      <summary>\n        Contains the subject of an original message for use in a report about the message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISC_VAL\">\n      <summary>\n        The obsolete precursor of the PR_DISCRETE_VALUES property. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIG_MESSAGE_CLASS_W\">\n      <summary>\n        Contains the class of the original message for use in a report. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIG_MESSAGE_CLASS_A\">\n      <summary>\n        Contains the class of the original message for use in a report. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the author of the first version of a messagE, that is, the message before being\n        forwarded or replied to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_NAME_W\">\n      <summary>\n        Contains the display name of the author of the first version of a messagE, that is, the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_NAME_A\">\n      <summary>\n        Contains the display name of the author of the first version of a messagE, that is, the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SUBMIT_TIME\">\n      <summary>\n        Contains the original submission date and time of the message in the report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPLY_RECIPIENT_ENTRIES\">\n      <summary>\n        Contains a sized array of entry identifiers for recipients that are to get a reply.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPLY_RECIPIENT_NAMES_W\">\n      <summary>\n        Contains a list of display names for recipients that are to get a reply. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPLY_RECIPIENT_NAMES_A\">\n      <summary>\n        Contains a list of display names for recipients that are to get a reply. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_SEARCH_KEY\">\n      <summary>\n        Contains the search key of the messaging user that actually receives the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_SEARCH_KEY\">\n      <summary>\n        Contains the search key for the messaging user represented by the receiving user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_READ_RECEIPT_SEARCH_KEY\">\n      <summary>\n        Contains a search key for the messaging user to which the messaging system should direct a read report for a\n        message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_SEARCH_KEY\">\n      <summary>\n        Contains the search key for the recipient that should get reports for this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DELIVERY_TIME\">\n      <summary>\n        Contains a copy of the original message's delivery date and time in a thread.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_SEARCH_KEY\">\n      <summary>\n        Contains the search key of the author of the first version of a messagE, that is, the message before being\n        forwarded or replied to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_TO_ME\">\n      <summary>\n        Contains TRUE if this messaging user is specifically named as a primary (To) recipient of this message and is not\n        part of a distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_CC_ME\">\n      <summary>\n        Contains TRUE if this messaging user is specifically named as a carbon copy (CC) recipient of this message and is\n        not part of a distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_RECIP_ME\">\n      <summary>\n        Contains TRUE if this messaging user is specifically named as a primary (To), carbon copy (CC), or blind carbon\n        copy (BCC) recipient of this message and is not part of a distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_NAME_W\">\n      <summary>\n        Contains the display name of the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_NAME_A\">\n      <summary>\n        Contains the display name of the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_SEARCH_KEY\">\n      <summary>\n        Contains the search key for the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_NAME_W\">\n      <summary>\n        Contains the display name of the messaging user on whose behalf the original message was sent. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_NAME_A\">\n      <summary>\n        Contains the display name of the messaging user on whose behalf the original message was sent. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the messaging user on whose behalf the original message was sent.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY\">\n      <summary>\n        Contains the search key of the messaging user on whose behalf the original message was sent.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_START_DATE\">\n      <summary>\n        Contains the starting date and time of an appointment as managed by a scheduling application.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_END_DATE\">\n      <summary>\n        Contains the ending date and time of an appointment as managed by a scheduling application.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OWNER_APPT_ID\">\n      <summary>\n        Contains an identifier for an appointment in the owner's schedule.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESPONSE_REQUESTED\">\n      <summary>\n        Contains TRUE if the message sender wants a response to a meeting request.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_ADDRTYPE_W\">\n      <summary>\n        Contains the address type for the messaging user represented by the sender. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_ADDRTYPE_A\">\n      <summary>\n        Contains the address type for the messaging user represented by the sender. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the sender. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENT_REPRESENTING_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the sender. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_ADDRTYPE_W\">\n      <summary>\n        Contains the address type of the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_ADDRTYPE_A\">\n      <summary>\n        Contains the address type of the sender of the first version of a messagE, that is, the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address of the sender of the first version of a message, that is, the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address of the sender of the first version of a message, that is, the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W\">\n      <summary>\n        Contains the address type of the messaging user on whose behalf the original message was sent. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A\">\n      <summary>\n        Contains the address type of the messaging user on whose behalf the original message was sent. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address of the messaging user on whose behalf the original message was sent. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address of the messaging user on whose behalf the original message was sent. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSATION_TOPIC_W\">\n      <summary>\n        Contains the topic of the first message in a conversation thread. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSATION_TOPIC_A\">\n      <summary>\n        Contains the topic of the first message in a conversation thread. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSATION_INDEX\">\n      <summary>\n        Contains a binary value that indicates the relative position of this message within a conversation thread.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc842470.aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_BCC_W\">\n      <summary>\n        Contains a binary value that indicates the relative position of this message within a conversation thread.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_BCC_A\">\n      <summary>\n        Contains the display names of any blind carbon copy (BCC) recipients of the original message. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_CC_W\">\n      <summary>\n        Contains the display names of any carbon copy (CC) recipients of the original message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_CC_A\">\n      <summary>\n        Contains the display names of any carbon copy (CC) recipients of the original message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_TO_W\">\n      <summary>\n        Contains the display names of the primary (To) recipients of the original message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_TO_A\">\n      <summary>\n        Contains the display names of the primary (To) recipients of the original message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_ADDRTYPE_W\">\n      <summary>\n        Contains the e-mail address typE, such as SMTP, for the messaging user that actually receives the message. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_ADDRTYPE_A\">\n      <summary>\n        Contains the e-mail address typE, such as SMTP, for the messaging user that actually receives the message.\n        Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address for the messaging user that actually receives the message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVED_BY_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address for the messaging user that actually receives the message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_ADDRTYPE_W\">\n      <summary>\n        Contains the address type for the messaging user represented by the user actually receiving the message. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_ADDRTYPE_A\">\n      <summary>\n        Contains the address type for the messaging user represented by the user actually receiving the message.\n        Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the receiving user. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the receiving user. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_ADDRTYPE_W\">\n      <summary>\n        Contains the address type of the author of the first version of a message. That is — the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_ADDRTYPE_A\">\n      <summary>\n        Contains the address type of the author of the first version of a message. That is — the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address of the author of the first version of a message. That is — the message before being\n        forwarded or replied to. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address of the author of the first version of a message. That is — the message before being\n        forwarded or replied to. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W\">\n      <summary>\n        Contains the address type of the originally intended recipient of an autoforwarded message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A\">\n      <summary>\n        Contains the address type of the originally intended recipient of an autoforwarded message. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the e-mail address of the originally intended recipient of an autoforwarded message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the e-mail address of the originally intended recipient of an autoforwarded message. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSPORT_MESSAGE_HEADERS_A\">\n      <summary>\n        Contains transport-specific message envelope information. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSPORT_MESSAGE_HEADERS_W\">\n      <summary>\n        Contains transport-specific message envelope information. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DELEGATION\">\n      <summary>\n        Contains the converted value of the attDelegate workgroup property.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TNEF_CORRELATION_KEY\">\n      <summary>\n        Contains a value used to correlate a Transport Neutral Encapsulation Format (TNEF) attachment with a message\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_W\">\n      <summary>\n        Contains the message text. UNICODE compilation.\n      </summary>\n      <remarks>\n        These properties are typically used only in an interpersonal message (IPM).\n        Message stores that support Rich Text Format (RTF) ignore any changes to white space in the message text. When\n        PR_BODY is stored for the first timE, the message store also generates and stores the PR_RTF_COMPRESSED\n        (PidTagRtfCompressed) property, the RTF version of the message text. If the IMAPIProp::SaveChanges method is\n        subsequently called and PR_BODY has been modifieD, the message store calls the RTFSync function to ensure\n        synchronization with the RTF version. If only white space has been changeD, the properties are left unchanged. This\n        preserves any nontrivial RTF formatting when the message travels through non-RTF-aware clients and messaging\n        systems.\n        The value for this property must be expressed in the code page of the operating system that MAPI is running on.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_A\">\n      <summary>\n        Contains the message text. Non-UNICODE compilation.\n      </summary>\n      <remarks>\n        These properties are typically used only in an interpersonal message (IPM).\n        Message stores that support Rich Text Format (RTF) ignore any changes to white space in the message text. When\n        PR_BODY is stored for the first timE, the message store also generates and stores the PR_RTF_COMPRESSED\n        (PidTagRtfCompressed) property, the RTF version of the message text. If the IMAPIProp::SaveChanges method is\n        subsequently called and PR_BODY has been modifieD, the message store calls the RTFSync function to ensure\n        synchronization with the RTF version. If only white space has been changeD, the properties are left unchanged. This\n        preserves any nontrivial RTF formatting when the message travels through non-RTF-aware clients and messaging\n        systems.\n        The value for this property must be expressed in the code page of the operating system that MAPI is running on.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_TEXT_W\">\n      <summary>\n        Contains optional text for a report generated by the messaging system. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORT_TEXT_A\">\n      <summary>\n        Contains optional text for a report generated by the messaging system. NON-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY\">\n      <summary>\n        Contains information about a message originator and a distribution list expansion history.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORTING_DL_NAME\">\n      <summary>\n        Contains the display name of a distribution list where the messaging system delivers a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPORTING_MTA_CERTIFICATE\">\n      <summary>\n        Contains an identifier for the message transfer agent that generated a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_BODY_CRC\">\n      <summary>\n        Contains the cyclical redundancy check (CRC) computed for the message text.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_BODY_COUNT\">\n      <summary>\n        Contains a count of the significant characters of the message text.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_BODY_TAG_W\">\n      <summary>\n        Contains significant characters that appear at the beginning of the message text. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_BODY_TAG_A\">\n      <summary>\n        Contains significant characters that appear at the beginning of the message text. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_COMPRESSED\">\n      <summary>\n        Contains the Rich Text Format (RTF) version of the message text, usually in compressed form.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_PREFIX_COUNT\">\n      <summary>\n        Contains a count of the ignorable characters that appear before the significant characters of the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_SYNC_TRAILING_COUNT\">\n      <summary>\n        Contains a count of the ignorable characters that appear after the significant characters of the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINALLY_INTENDED_RECIP_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the originally intended recipient of an auto-forwarded message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_HTML_A\">\n      <summary>\n        Contains the Hypertext Markup Language (HTML) version of the message text.\n      </summary>\n      <remarks>\n        These properties contain the same message text as the\n        <see cref=\"P:MsgKit.PropertyTags.PR_BODY_CONTENT_LOCATION_W\" />\n        (PidTagBodyContentLocation), but in HTML. A message store that supports HTML indicates this by setting the\n        <see cref=\"F:MsgKit.Enums.StoreSupportMask.STORE_HTML_OK\" /> flag in its\n        <see cref=\"P:MsgKit.PropertyTags.PR_STORE_SUPPORT_MASK\" />\n        (PidTagStoreSupportMask). Note <see cref=\"F:MsgKit.Enums.StoreSupportMask.STORE_HTML_OK\" /> is not defined in versions of\n        Mapidefs.h included with Microsoft® Exchange 2000 Server and earlier. If\n        <see cref=\"F:MsgKit.Enums.StoreSupportMask.STORE_HTML_OK\" />\n        is undefined, use the value 0x00010000 instead.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HTML\">\n      <summary>\n        Contains the message body text in HTML format.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_CONTENT_LOCATION_A\">\n      <summary>\n        Contains the value of a MIME Content-Location header field.\n      </summary>\n      <remarks>\n        To set the value of these properties, MIME clients should write the desired value to a Content-Location header\n        field on a MIME entity that maps to a message body. MIME readers should copy the value of a Content-Location\n        header field on such a MIME entity to the value of these properties\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_CONTENT_LOCATION_W\">\n      <summary>\n        Contains the value of a MIME Content-Location header field. UNICODE compilation.\n      </summary>\n      <remarks>\n        To set the value of these properties, MIME clients should write the desired value to a Content-Location header\n        field on a MIME entity that maps to a message body. MIME readers should copy the value of a Content-Location\n        header field on such a MIME entity to the value of these properties\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INTERNET_MESSAGE_ID_A\">\n      <summary>\n        Corresponds to the message ID field as specified in [RFC2822].\n      </summary>\n      <remarks>\n        These properties should be present on all e-mail messages.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INTERNET_MESSAGE_ID_W\">\n      <summary>\n        Corresponds to the message ID field as specified in [RFC2822]. UNICODE compilation.\n      </summary>\n      <remarks>\n        These properties should be present on all e-mail messages.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IN_REPLY_TO_ID_A\">\n      <summary>\n        Contains the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value.\n      </summary>\n      <remarks>\n        These properties must be set on all message replies.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IN_REPLY_TO_ID_W\">\n      <summary>\n        Contains the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value. UNICODE compilation.\n      </summary>\n      <remarks>\n        These properties should be present on all e-mail messages.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INTERNET_REFERENCES_A\">\n      <summary>\n        Contains the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field.\n      </summary>\n      <remarks>\n        To generate a References header field, clients must set these properties to the desired value. MIME writers must copy\n        the value of these properties to the References header field. To set the value of these properties, MIME clients must\n        write the desired value to a References header field. MIME readers must copy the value of the References header field\n        to these properties. MIME readers may truncate the value of these properties if it exceeds 64KB in length.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INTERNET_REFERENCES_W\">\n      <summary>\n        Contains the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field. UNICODE compilation.\n      </summary>\n      <remarks>\n        To generate a References header field, clients must set these properties to the desired value. MIME writers must copy\n        the value of these properties to the References header field. To set the value of these properties, MIME clients must\n        write the desired value to a References header field. MIME readers must copy the value of the References header field\n        to these properties. MIME readers may truncate the value of these properties if it exceeds 64KB in length.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_INTEGRITY_CHECK\">\n      <summary>\n        Contains an ASN.1 content integrity check value that allows a message sender to protect message content from\n        disclosure to unauthorized recipients.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_EXPLICIT_CONVERSION\">\n      <summary>\n        Indicates that a message sender has requested a message content conversion for a particular recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_RETURN_REQUESTED\">\n      <summary>\n        Contains TRUE if this message should be returned with a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_TOKEN\">\n      <summary>\n        Contains an ASN.1 security token for a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NDR_REASON_CODE\">\n      <summary>\n        Contains a diagnostic code that forms part of a nondelivery report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NDR_DIAG_CODE\">\n      <summary>\n        Contains a diagnostic code that forms part of a nondelivery report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NON_RECEIPT_NOTIFICATION_REQUESTED\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender wants notification of non-receipt for a specified recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT\">\n      <summary>\n        Contains an entry identifier for an alternate recipient designated by the sender.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_DELIVERY_MODE\">\n      <summary>\n        Contains TRUE if the messaging system should use a fax bureau for physical delivery of this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_DELIVERY_REPORT_REQUEST\">\n      <summary>\n        Contains the mode of a report to be delivered to a particular message recipient upon completion of physical message\n        delivery or delivery by the message handling system.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_FORWARDING_ADDRESS\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender requests the message transfer agent to attach a physical forwarding address for a\n        message recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_FORWARDING_PROHIBITED\">\n      <summary>\n        Contains TRUE if a message sender prohibits physical message forwarding for a specific recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PHYSICAL_RENDITION_ATTRIBUTES\">\n      <summary>\n        Contains an ASN.1 object identifier that is used for rendering message attachments.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROOF_OF_DELIVERY\">\n      <summary>\n        This property contains an ASN.1 proof of delivery value.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROOF_OF_DELIVERY_REQUESTED\">\n      <summary>\n        This property contains TRUE if a message sender requests proof of delivery for a particular recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_CERTIFICATE\">\n      <summary>\n        Contains a message recipient's ASN.1 certificate for use in a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_NUMBER_FOR_ADVICE_W\">\n      <summary>\n        This property contains a message recipient's telephone number to call to advise of the physical delivery of a\n        message. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_NUMBER_FOR_ADVICE_A\">\n      <summary>\n        This property contains a message recipient's telephone number to call to advise of the physical delivery of a\n        message. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_TYPE\">\n      <summary>\n        Contains the recipient type for a message recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REGISTERED_MAIL_TYPE\">\n      <summary>\n        This property contains the type of registration used for physical delivery of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REPLY_REQUESTED\">\n      <summary>\n        Contains TRUE if a message sender requests a reply from a recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REQUESTED_DELIVERY_METHOD\">\n      <summary>\n        This property contains a binary array of delivery methods (service providers), in the order of a message sender's\n        preference.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_ENTRYID\">\n      <summary>\n        Contains the message sender's entry identifier.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_NAME_W\">\n      <summary>\n        Contains the message sender's display name. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_NAME_A\">\n      <summary>\n        Contains the message sender's display name. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUPPLEMENTARY_INFO_W\">\n      <summary>\n        Contains additional information for use in a report. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUPPLEMENTARY_INFO_A\">\n      <summary>\n        Contains additional information for use in a report. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TYPE_OF_MTS_USER\">\n      <summary>\n        This property contains the type of a message recipient for use in a report.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_SEARCH_KEY\">\n      <summary>\n        Contains the message sender's search key.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_ADDRTYPE_W\">\n      <summary>\n        Contains the message sender's e-mail address type. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_ADDRTYPE_A\">\n      <summary>\n        Contains the message sender's e-mail address type. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the message sender's e-mail address, encoded in Unicode standard.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENDER_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the message sender's e-mail address, encoded in Non-Unicode standard.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CURRENT_VERSION\">\n      <summary>\n        Was originally meant to contain the current version of a message store. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DELETE_AFTER_SUBMIT\">\n      <summary>\n        Contains TRUE if a client application wants MAPI to delete the associated message after submission.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_BCC_W\">\n      <summary>\n        Contains an ASCII list of the display names of any blind carbon copy (BCC) message recipients, separated by\n        semicolons (;). UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_BCC_A\">\n      <summary>\n        Contains an ASCII list of the display names of any blind carbon copy (BCC) message recipients, separated by\n        semicolons (;). Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_CC_W\">\n      <summary>\n        Contains an ASCII list of the display names of any carbon copy (CC) message recipients, separated by semicolons\n        (;). UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_CC_A\">\n      <summary>\n        Contains an ASCII list of the display names of any carbon copy (CC) message recipients, separated by semicolons\n        (;). Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_TO_W\">\n      <summary>\n        Contains a list of the display names of the primary (To) message recipients, separated by semicolons (;). UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_TO_A\">\n      <summary>\n        Contains a list of the display names of the primary (To) message recipients, separated by semicolons (;).\n        Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PARENT_DISPLAY_W\">\n      <summary>\n        Contains the display name of the folder in which a message was found during a search. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PARENT_DISPLAY_A\">\n      <summary>\n        Contains the display name of the folder in which a message was found during a search. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_DELIVERY_TIME\">\n      <summary>\n        Contains the date and time a message was delivered.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_FLAGS\">\n      <summary>\n        Contains a bitmask of flags indicating the origin and current state of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_SIZE\">\n      <summary>\n        Contains the sum, in bytes, of the sizes of all properties on a message object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PARENT_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the folder containing a folder or message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SENTMAIL_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the folder where the message should be moved after submission.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CORRELATE\">\n      <summary>\n        Contains TRUE if the sender of a message requests the correlation feature of the messaging system.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CORRELATE_MTSID\">\n      <summary>\n        Contains the message transfer system (MTS) identifier used in correlating reports with sent messages.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISCRETE_VALUES\">\n      <summary>\n        Contains TRUE if a nondelivery report applies only to discrete members of a distribution list rather than the\n        entire list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESPONSIBILITY\">\n      <summary>\n        Contains TRUE if some transport provider has already accepted responsibility for delivering the message to this\n        recipient, and FALSE if the MAPI spooler considers that this transport provider should accept responsibility.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SPOOLER_STATUS\">\n      <summary>\n        Contains the status of the message based on information available to the MAPI spooler.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSPORT_STATUS\">\n      <summary>\n        Obsolete MAPI spooler property. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_RECIPIENTS\">\n      <summary>\n        Contains a table of restrictions that can be applied to a contents table to find all messages that contain\n        recipient subobjects meeting the restrictions.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_ATTACHMENTS\">\n      <summary>\n        Contains a table of restrictions that can be applied to a contents table to find all messages that contain\n        attachment subobjects meeting the restrictions.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBMIT_FLAGS\">\n      <summary>\n        Contains a bitmask of flags indicating details about a message submission.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_STATUS\">\n      <summary>\n        Contains a value used by the MAPI spooler in assigning delivery responsibility among transport providers.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSPORT_KEY\">\n      <summary>\n        Contains a value used by the MAPI spooler to track the progress of an outbound message through the outgoing\n        transport providers.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MSG_STATUS\">\n      <summary>\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_DOWNLOAD_TIME\">\n      <summary>\n        Contains a bitmask of property tags that define the status of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CREATION_VERSION\">\n      <summary>\n        Was originally meant to contain the message store version current at the time a message was created. No longer\n        supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MODIFY_VERSION\">\n      <summary>\n        Was originally meant to contain the message store version current at the time the message was last modified. No\n        longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HASATTACH\">\n      <summary>\n        When true then the message contains at least one attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BODY_CRC\">\n      <summary>\n        Contains a circular redundancy check (CRC) value on the message text.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NORMALIZED_SUBJECT_W\">\n      <summary>\n        Contains the message subject with any prefix removed. UNICODE compilation.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc815282.aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_NORMALIZED_SUBJECT_A\">\n      <summary>\n        Contains the message subject with any prefix removed. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RTF_IN_SYNC\">\n      <summary>\n        Contains TRUE if PR_RTF_COMPRESSED has the same text content as PR_BODY for this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_SIZE\">\n      <summary>\n        Contains the sum, in bytes, of the sizes of all properties on an attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_NUM\">\n      <summary>\n        Contains a number that uniquely identifies the attachment within its parent message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_FLAGS\">\n      <summary>\n        Contains a bitmask of flags for an attachment.\n      </summary>\n      <remarks>\n        If the PR_ATTACH_FLAGS property is zero or absent, the attachment is to be processed by all applications.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PREPROCESS\">\n      <summary>\n        Contains TRUE if the message requires preprocessing.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINATING_MTA_CERTIFICATE\">\n      <summary>\n        Contains an identifier for the message transfer agent (MTA) that originated the message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROOF_OF_SUBMISSION\">\n      <summary>\n        Contains an ASN.1 proof of submission value.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ENTRYID\">\n      <summary>\n        The PR_ENTRYID property contains a MAPI entry identifier used to open and edit properties of a particular MAPI\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OBJECT_TYPE\">\n      <summary>\n        Contains the type of an object\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ICON\">\n      <summary>\n        Contains a bitmap of a full size icon for a form.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MINI_ICON\">\n      <summary>\n        Contains a bitmap of a half-size icon for a form.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_ENTRYID\">\n      <summary>\n        Specifies the hexadecimal string representation of the value of the PR_STORE_ENTRYID (PidTagStoreEntryId) property\n        on the shared folder. This is a property of a sharing message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_RECORD_KEY\">\n      <summary>\n        Contains the unique binary-comparable identifier (record key) of the message store in which an object resides.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECORD_KEY\">\n      <summary>\n        Contains a unique binary-comparable identifier for a specific object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MAPPING_SIGNATURE\">\n      <summary>\n        Contains the mapping signature for named properties of a particular MAPI object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ACCESS_LEVEL\">\n      <summary>\n        Indicates the client's access level to the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INSTANCE_KEY\">\n      <summary>\n        Contains a value that uniquely identifies a row in a table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ROW_TYPE\">\n      <summary>\n        Contains a value that indicates the type of a row in a table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ACCESS\">\n      <summary>\n        Contains a bitmask of flags indicating the operations that are available to the client for the object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ICON_INDEX\">\n      <summary>\n        Contains a number that indicates which icon to use when you display a group of e-mail objects.\n      </summary>\n      <remarks>\n        This property, if it exists, is a hint to the client. The client may ignore the value of this property.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LAST_VERB_EXECUTED\">\n      <summary>\n        Specifies the last verb executed for the message item to which it is related.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LAST_VERB_EXECUTION_TIME\">\n      <summary>\n        Contains the time when the last verb was executed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ROWID\">\n      <summary>\n        Contains a unique identifier for a recipient in a recipient table or status table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_NAME_W\">\n      <summary>\n        Contains the display name for a given MAPI object. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_DISPLAY_NAME_A\">\n      <summary>\n        Contains the value of the <see cref=\"P:MsgKit.PropertyTags.PR_DISPLAY_NAME_W\" /> (PidTagDisplayName) property. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_DISPLAY_NAME_W\">\n      <summary>\n        Contains the value of the <see cref=\"P:MsgKit.PropertyTags.PR_DISPLAY_NAME_W\" /> (PidTagDisplayName) property. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECIPIENT_FLAGS\">\n      <summary>\n        Specifies a bit field that describes the recipient status.\n      </summary>\n      <remarks>\n        This property is not required. The following are the individual flags that can be set.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_NAME_A\">\n      <summary>\n        Contains the display name for a given MAPI object. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ADDRTYPE_W\">\n      <summary>\n        Contains the messaging user's e-mail address type, such as SMTP. UNICODE compilation.\n      </summary>\n      <remarks>\n        These properties are examples of the base address properties common to all messaging users.\n        It specifies which messaging system MAPI uses to handle a given message.\n        This property also determines the format of the address string in the PR_EMAIL_ADRESS(PidTagEmailAddress).\n        The string it provides can contain only the uppercase alphabetic characters from A through Z and the numbers\n        from 0 through 9.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ADDRTYPE_A\">\n      <summary>\n        Contains the messaging user's e-mail address type such as SMTP. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_EMAIL_ADDRESS_W\">\n      <summary>\n        Contains the messaging user's e-mail address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SMTP_ADDRESS_A\">\n      <summary>\n        Contains the messaging user's SMTP e-mail address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SMTP_ADDRESS_W\">\n      <summary>\n        Contains the messaging user's SMTP e-mail address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_7BIT_DISPLAY_NAME_A\">\n      <summary>\n        Contains the messaging user's 7bit e-mail address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_7BIT_DISPLAY_NAME_W\">\n      <summary>\n        Contains the messaging user's SMTP e-mail address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_EMAIL_ADDRESS_A\">\n      <summary>\n        Contains the messaging user's e-mail address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COMMENT_W\">\n      <summary>\n        Contains a comment about the purpose or content of an object. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COMMENT_A\">\n      <summary>\n        Contains a comment about the purpose or content of an object. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEPTH\">\n      <summary>\n        Contains an integer that represents the relative level of indentation, or depth, of an object in a hierarchy table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_DISPLAY_W\">\n      <summary>\n        Contains the vendor-defined display name for a service provider. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_DISPLAY_A\">\n      <summary>\n        Contains the vendor-defined display name for a service provider. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CREATION_TIME\">\n      <summary>\n        Contains the creation date and time of a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LAST_MODIFICATION_TIME\">\n      <summary>\n        Contains the date and time when the object or subobject was last modified.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESOURCE_FLAGS\">\n      <summary>\n        Contains a bitmask of flags for message services and providers.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_DLL_NAME_W\">\n      <summary>\n        Contains the base file name of the MAPI service provider dynamic-link library (DLL). UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_DLL_NAME_A\">\n      <summary>\n        Contains the base file name of the MAPI service provider dynamic-link library (DLL). Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SEARCH_KEY\">\n      <summary>\n        Contains a binary-comparable key that identifies correlated objects for a search.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_UID\">\n      <summary>\n        Contains a MAPIUID structure of the service provider that is handling a message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROVIDER_ORDINAL\">\n      <summary>\n        Contains the zero-based index of a service provider's position in the provider table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_VERSION_W\">\n      <summary>\n        Contains the version of a form. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_VERSION_A\">\n      <summary>\n        Contains the version of a form. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CONTACT_NAME_W\">\n      <summary>\n        Contains the name of a contact for information about a form. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CONTACT_NAME_A\">\n      <summary>\n        Contains the name of a contact for information about a form. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CATEGORY_W\">\n      <summary>\n        Contains the category of a form. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CATEGORY_A\">\n      <summary>\n        Contains the category of a form. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CATEGORY_SUB_W\">\n      <summary>\n        Contains the subcategory of a form, as defined by a client application. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_CATEGORY_SUB_A\">\n      <summary>\n        Contains the subcategory of a form, as defined by a client application. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_HOST_MAP\">\n      <summary>\n        Contains a host map of available forms.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_HIDDEN\">\n      <summary>\n        Contains TRUE if a form is to be suppressed from display by compose menus and dialog boxes.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_DESIGNER_NAME_W\">\n      <summary>\n        Contains the display name for the object that is used to design the form. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_DESIGNER_NAME_A\">\n      <summary>\n        Contains the display name for the object that is used to design the form. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FORM_MESSAGE_BEHAVIOR\">\n      <summary>\n        Contains TRUE if a message should be composed in the current folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEFAULT_STORE\">\n      <summary>\n        Contains TRUE if a message store is the default message store in the message store table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_SUPPORT_MASK\">\n      <summary>\n        Contains a bitmask of flags that client applications query to determine the characteristics of a message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_STATE\">\n      <summary>\n        Contains a flag that describes the state of the message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_UNICODE_MASK\">\n      <summary>\n        Contains a bitmask of flags that client applications should query to determine the characteristics of a message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_SUBTREE_SEARCH_KEY\">\n      <summary>\n        Was originally meant to contain the search key of the interpersonal message (IPM) root folder. No longer supported\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_OUTBOX_SEARCH_KEY\">\n      <summary>\n        Was originally meant to contain the search key of the standard Outbox folder. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_WASTEBASKET_SEARCH_KEY\">\n      <summary>\n        Was originally meant to contain the search key of the standard Deleted Items folder. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_SENTMAIL_SEARCH_KEY\">\n      <summary>\n        Was originally meant to contain the search key of the standard Sent Items folder. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MDB_PROVIDER\">\n      <summary>\n        Contains a provider-defined MAPIUID structure that indicates the type of the message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RECEIVE_FOLDER_SETTINGS\">\n      <summary>\n        Contains a table of a message store's receive folder settings.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_VALID_FOLDER_MASK\">\n      <summary>\n        Contains a bitmask of flags that indicate the validity of the entry identifiers of the folders in a message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_SUBTREE_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the root of the IPM folder subtree in the message store's folder tree.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_OUTBOX_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the standard interpersonal message (IPM) Outbox folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_WASTEBASKET_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the standard IPM Deleted Items folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IPM_SENTMAIL_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the standard IPM Sent Items folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_VIEWS_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the user-defined Views folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COMMON_VIEWS_ENTRYID\">\n      <summary>\n        Contains the entry identifier of the predefined common view folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FINDER_ENTRYID\">\n      <summary>\n        Contains the entry identifier for the folder in which search results are typically created.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CE_RECEIVE_BEFORE_SEND\">\n      <summary>\n        When TRUE, forces the serialization of SMTP and POP3 authentication requests such that the POP3 account is\n        authenticated before the SMTP account.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_FLAGS\">\n      <summary>\n        Contains a bitmask of flags describing capabilities of an address book container.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FOLDER_TYPE\">\n      <summary>\n        Contains a constant that indicates the folder type.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_COUNT\">\n      <summary>\n        Contains the number of messages in a folder, as computed by the message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENT_UNREAD\">\n      <summary>\n        Contains the number of unread messages in a folder, as computed by the message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CREATE_TEMPLATES\">\n      <summary>\n        Contains an embedded table object that contains dialog box template entry identifiers.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DETAILS_TABLE\">\n      <summary>\n        Contains an embedded display table object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SEARCH\">\n      <summary>\n        Contains a container object that is used for advanced searches.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SELECTABLE\">\n      <summary>\n        Contains TRUE if the entry in the one-off table can be selected.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SUBFOLDERS\">\n      <summary>\n        Contains TRUE if a folder contains subfolders.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATUS\">\n      <summary>\n        Contains a 32-bit bitmask of flags that define folder status.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ANR_W\">\n      <summary>\n        Contains a string value for use in a property restriction on an address book container contents table. UNICODE\n        compilation\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ANR_A\">\n      <summary>\n        Contains a string value for use in a property restriction on an address book container contents table. Non-UNICODE\n        compilation\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTENTS_SORT_ORDER\">\n      <summary>\n        No longer supported\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_HIERARCHY\">\n      <summary>\n        Contains an embedded hierarchy table object that provides information about the child containers.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_CONTENTS\">\n      <summary>\n        Contains an embedded contents table object that provides information about a container.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FOLDER_ASSOCIATED_CONTENTS\">\n      <summary>\n        Contains an embedded contents table object that provides information about a container.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEF_CREATE_DL\">\n      <summary>\n        Contains the template entry identifier for a default distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEF_CREATE_MAILUSER\">\n      <summary>\n        Contains the template entry identifier for a default messaging user object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_CLASS_W\">\n      <summary>\n        Contains a text string describing the type of a folder. Although this property is generally ignored, versions of\n        Microsoft® Exchange Server prior to Exchange Server 2003 Mailbox Manager expect this property to be present.\n        UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_CLASS_A\">\n      <summary>\n        Contains a text string describing the type of a folder. Although this property is generally ignored, versions of\n        Microsoft® Exchange Server prior to Exchange Server 2003 Mailbox Manager expect this property to be present.\n        Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTAINER_MODIFY_VERSION\">\n      <summary>\n        Unknown\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_PROVIDER_ID\">\n      <summary>\n        Contains an address book provider's MAPIUID structure.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEFAULT_VIEW_ENTRYID\">\n      <summary>\n        Contains the entry identifier of a folder's default view.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ASSOC_CONTENT_COUNT\">\n      <summary>\n        Contains the count of items in the associated contents table of the folder.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACHMENT_X400_PARAMETERS\">\n      <summary>\n        was originally meant to contain an ASN.1 object identifier specifying how the attachment should be handled during\n        transmission. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_CONTENT_ID_W\">\n      <summary>\n        Contains the content identification header of a MIME message attachment. This property is used for MHTML support.\n        It represents the content identification header for the appropriate MIME body part. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_CONTENT_ID_A\">\n      <summary>\n        Contains the content identification header of a MIME message attachment. This property is used for MHTML support.\n        It represents the content identification header for the appropriate MIME body part. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_CONTENT_LOCATION_W\">\n      <summary>\n        Contains the content location header of a MIME message attachment. This property is used for MHTML support. It\n        represents the content location header for the appropriate MIME body part. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_CONTENT_LOCATION_A\">\n      <summary>\n        Contains the content location header of a MIME message attachment. This property is used for MHTML support. It\n        represents the content location header for the appropriate MIME body part. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_DATA_OBJ\">\n      <summary>\n        Contains an attachment object typically accessed through the OLE IStorage:IUnknown interface.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_DATA_BIN\">\n      <summary>\n        Contains binary attachment data typically accessed through the COM IStream:IUnknown interface.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_ENCODING\">\n      <summary>\n        Contains an ASN.1 object identifier specifying the encoding for an attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_EXTENSION_W\">\n      <summary>\n        Contains a filename extension that indicates the document type of an attachment. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_EXTENSION_A\">\n      <summary>\n        Contains a filename extension that indicates the document type of an attachment. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_FILENAME_W\">\n      <summary>\n        Contains an attachment's base filename and extension, excluding path. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_FILENAME_A\">\n      <summary>\n        Contains an attachment's base filename and extension, excluding path. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_METHOD\">\n      <summary>\n        Contains a MAPI-defined constant representing the way the contents of an attachment can be accessed.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_FILENAME_W\">\n      <summary>\n        Contains an attachment's long filename and extension, excluding path. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_FILENAME_A\">\n      <summary>\n        Contains an attachment's long filename and extension, excluding path. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_PATHNAME_W\">\n      <summary>\n        Contains an attachment's fully qualified path and filename. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_PATHNAME_A\">\n      <summary>\n        Contains an attachment's fully qualified path and filename. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_RENDERING\">\n      <summary>\n        Contains a Microsoft Windows metafile with rendering information for an attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_TAG\">\n      <summary>\n        Contains an ASN.1 object identifier specifying the application that supplied an attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RENDERING_POSITION\">\n      <summary>\n        Contains an offset, in characters, to use in rendering an attachment within the main message text.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_TRANSPORT_NAME_W\">\n      <summary>\n        Contains the name of an attachment file modified so that it can be correlated with TNEF messages. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_TRANSPORT_NAME_A\">\n      <summary>\n        Contains the name of an attachment file modified so that it can be correlated with TNEF messages. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_PATHNAME_W\">\n      <summary>\n        Contains an attachment's fully qualified long path and filename. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_LONG_PATHNAME_A\">\n      <summary>\n        Contains an attachment's fully qualified long path and filename. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_MIME_TAG_W\">\n      <summary>\n        Contains formatting information about a Multipurpose Internet Mail Extensions (MIME) attachment. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_MIME_TAG_A\">\n      <summary>\n        Contains formatting information about a Multipurpose Internet Mail Extensions (MIME) attachment. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACH_ADDITIONAL_INFO\">\n      <summary>\n        Provides file type information for a non-Windows attachment.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_TYPE\">\n      <summary>\n        Contains a value used to associate an icon with a particular row of a table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TEMPLATEID\">\n      <summary>\n        Contains the PR_ENTRYID (PidTagEntryId), expressed as a permanent entry ID format.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIMARY_CAPABILITY\">\n      <summary>\n        These properties appear on address book objects. Obsolete.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISPLAY_TYPE_EX\">\n      <summary>\n        Contains the type of an entry, with respect to how the entry should be displayed in a row in a table for the Global\n        Address List.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ACCOUNT_W\">\n      <summary>\n        Contains the recipient's account name. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ACCOUNT_A\">\n      <summary>\n        Contains the recipient's account name. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ALTERNATE_RECIPIENT\">\n      <summary>\n        Contains a list of entry identifiers for alternate recipients designated by the original recipient.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CALLBACK_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains a telephone number that the message recipient can use to reach the sender. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CALLBACK_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains a telephone number that the message recipient can use to reach the sender. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONVERSION_PROHIBITED\">\n      <summary>\n        Contains TRUE if message conversions are prohibited by default for the associated messaging user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DISCLOSE_RECIPIENTS\">\n      <summary>\n        The DiscloseRecipients field represents a PR_DISCLOSE_RECIPIENTS MAPI property.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GENERATION_W\">\n      <summary>\n        Contains a generational abbreviation that follows the full name of the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GENERATION_A\">\n      <summary>\n        Contains a generational abbreviation that follows the full name of the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GIVEN_NAME_W\">\n      <summary>\n        Contains the first or given name of the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GIVEN_NAME_A\">\n      <summary>\n        Contains the first or given name of the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GOVERNMENT_ID_NUMBER_W\">\n      <summary>\n        Contains a government identifier for the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_GOVERNMENT_ID_NUMBER_A\">\n      <summary>\n        Contains a government identifier for the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the primary telephone number of the recipient's place of business. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the primary telephone number of the recipient's place of business. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the primary telephone number of the recipient's home. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the primary telephone number of the recipient's home. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INITIALS_W\">\n      <summary>\n        Contains the initials for parts of the full name of the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INITIALS_A\">\n      <summary>\n        Contains the initials for parts of the full name of the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_KEYWORD_W\">\n      <summary>\n        Contains a keyword that identifies the recipient to the recipient's system administrator. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_KEYWORD_A\">\n      <summary>\n        Contains a keyword that identifies the recipient to the recipient's system administrator. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LANGUAGE_W\">\n      <summary>\n        Contains a value that indicates the language in which the messaging user is writing messages. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LANGUAGE_A\">\n      <summary>\n        Contains a value that indicates the language in which the messaging user is writing messages. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LOCATION_W\">\n      <summary>\n        Contains the location of the recipient in a format that is useful to the recipient's organization. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LOCATION_A\">\n      <summary>\n        Contains the location of the recipient in a format that is useful to the recipient's organization. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MAIL_PERMISSION\">\n      <summary>\n        Contains TRUE if the messaging user is allowed to send and receive messages.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MHS_COMMON_NAME_W\">\n      <summary>\n        Contains the common name of the message handling system. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MHS_COMMON_NAME_A\">\n      <summary>\n        Contains the common name of the message handling system. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORGANIZATIONAL_ID_NUMBER_W\">\n      <summary>\n        Contains an organizational ID number for the contact, such as an employee ID number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORGANIZATIONAL_ID_NUMBER_A\">\n      <summary>\n        Contains an organizational ID number for the contact, such as an employee ID number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SURNAME_W\">\n      <summary>\n        Contains the last or surname of the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SURNAME_A\">\n      <summary>\n        Contains the last or surname of the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_ENTRYID\">\n      <summary>\n        Contains the original entry identifier for an entry copied from an address book to a personal address book or other\n        writeable address book.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_NAME_W\">\n      <summary>\n        Contains the original display name for an entry copied from an address book to a personal address book or other\n        writable address book. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_DISPLAY_NAME_A\">\n      <summary>\n        Contains the original display name for an entry copied from an address book to a personal address book or other\n        writable address book. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ORIGINAL_SEARCH_KEY\">\n      <summary>\n        Contains the original search key for an entry copied from an address book to a personal address book or other\n        writeable address book.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POSTAL_ADDRESS_W\">\n      <summary>\n        Contains the recipient's postal address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POSTAL_ADDRESS_A\">\n      <summary>\n        Contains the recipient's postal address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COMPANY_NAME_W\">\n      <summary>\n        Contains the recipient's company name. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COMPANY_NAME_A\">\n      <summary>\n        Contains the recipient's company name. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TITLE_W\">\n      <summary>\n        Contains the recipient's job title. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TITLE_A\">\n      <summary>\n        Contains the recipient's job title. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEPARTMENT_NAME_W\">\n      <summary>\n        Contains a name for the department in which the recipient works. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEPARTMENT_NAME_A\">\n      <summary>\n        Contains a name for the department in which the recipient works. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OFFICE_LOCATION_W\">\n      <summary>\n        Contains the recipient's office location. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OFFICE_LOCATION_A\">\n      <summary>\n        Contains the recipient's office location. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIMARY_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the recipient's primary telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIMARY_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the recipient's primary telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS2_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains a secondary telephone number at the recipient's place of business. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS2_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains a secondary telephone number at the recipient's place of business. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MOBILE_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the recipient's cellular telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MOBILE_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the recipient's cellular telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RADIO_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the recipient's radio telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RADIO_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the recipient's radio telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CAR_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the recipient's car telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CAR_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the recipient's car telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OTHER_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains an alternate telephone number for the recipient. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OTHER_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains an alternate telephone number for the recipient. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSMITABLE_DISPLAY_NAME_W\">\n      <summary>\n        Contains a recipient's display name in a secure form that cannot be changed. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSMITABLE_DISPLAY_NAME_A\">\n      <summary>\n        Contains a recipient's display name in a secure form that cannot be changed. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PAGER_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the recipient's pager telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PAGER_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the recipient's pager telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_USER_CERTIFICATE\">\n      <summary>\n        Contains an ASN.1 authentication certificate for a messaging user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIMARY_FAX_NUMBER_W\">\n      <summary>\n        Contains the telephone number of the recipient's primary fax machine. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PRIMARY_FAX_NUMBER_A\">\n      <summary>\n        Contains the telephone number of the recipient's primary fax machine. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS_FAX_NUMBER_W\">\n      <summary>\n        Contains the telephone number of the recipient's business fax machine. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_BUSINESS_FAX_NUMBER_A\">\n      <summary>\n        Contains the telephone number of the recipient's business fax machine. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME_FAX_NUMBER_W\">\n      <summary>\n        Contains the telephone number of the recipient's home fax machine. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME_FAX_NUMBER_A\">\n      <summary>\n        Contains the telephone number of the recipient's home fax machine. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COUNTRY_W\">\n      <summary>\n        Contains the name of the recipient's country/region. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_COUNTRY_A\">\n      <summary>\n        Contains the name of the recipient's country/region. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LOCALITY_W\">\n      <summary>\n        Contains the name of the recipient's locality, such as the town or city. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_LOCALITY_A\">\n      <summary>\n        Contains the name of the recipient's locality, such as the town or city. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATE_OR_PROVINCE_W\">\n      <summary>\n        Contains the name of the recipient's state or province. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATE_OR_PROVINCE_A\">\n      <summary>\n        Contains the name of the recipient's state or province. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STREET_ADDRESS_W\">\n      <summary>\n        Contains the recipient's street address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STREET_ADDRESS_A\">\n      <summary>\n        Contains the recipient's street address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POSTAL_CODE_W\">\n      <summary>\n        Contains the postal code for the recipient's postal address. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POSTAL_CODE_A\">\n      <summary>\n        Contains the postal code for the recipient's postal address. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POST_OFFICE_BOX_W\">\n      <summary>\n        Contains the number or identifier of the recipient's post office box. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_POST_OFFICE_BOX_A\">\n      <summary>\n        Contains the number or identifier of the recipient's post office box. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TELEX_NUMBER_W\">\n      <summary>\n        Contains the recipient's telex number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TELEX_NUMBER_A\">\n      <summary>\n        Contains the recipient's telex number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ISDN_NUMBER_W\">\n      <summary>\n        Contains the recipient's ISDN-capable telephone number. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ISDN_NUMBER_A\">\n      <summary>\n        Contains the recipient's ISDN-capable telephone number. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ASSISTANT_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains the telephone number of the recipient's administrative assistant. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ASSISTANT_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains the telephone number of the recipient's administrative assistant. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME2_TELEPHONE_NUMBER_W\">\n      <summary>\n        Contains a secondary telephone number at the recipient's home. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HOME2_TELEPHONE_NUMBER_A\">\n      <summary>\n        Contains a secondary telephone number at the recipient's home. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ASSISTANT_W\">\n      <summary>\n        Contains the name of the recipient's administrative assistant. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ASSISTANT_A\">\n      <summary>\n        Contains the name of the recipient's administrative assistant. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SEND_RICH_INFO\">\n      <summary>\n        Contains TRUE if the recipient can receive all message content, including Rich Text Format (RTF) and Object Linking\n        and Embedding (OLE) objects.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STORE_PROVIDERS\">\n      <summary>\n        Contains a list of identifiers of message store providers in the current profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_PROVIDERS\">\n      <summary>\n        Contains a list of identifiers for address book providers in the current profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_TRANSPORT_PROVIDERS\">\n      <summary>\n        Contains a list of identifiers of transport providers in the current profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DEFAULT_PROFILE\">\n      <summary>\n        Contains TRUE if a messaging user profile is the MAPI default profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_SEARCH_PATH\">\n      <summary>\n        Contains a list of entry identifiers for address book containers that are to be searched to resolve names.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_DEFAULT_DIR\">\n      <summary>\n        Contains the entry identifier of the address book container to display first.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_DEFAULT_PAB\">\n      <summary>\n        Contains the entry identifier of the address book container to use as the personal address book (PAB).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_FILTERING_HOOKS\">\n      <summary>\n        The MAPI property PR_FILTERING_HOOKS.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_NAME_W\">\n      <summary>\n        Contains the unicode name of a message service as set by the user in the MapiSvc.inf file.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_NAME_A\">\n      <summary>\n        Contains the ANSI name of a message service as set by the user in the MapiSvc.inf file.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_DLL_NAME_W\">\n      <summary>\n        Contains the unicode filename of the DLL containing the message service provider entry point function to call for\n        configuration.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_DLL_NAME_A\">\n      <summary>\n        Contains the ANSI filename of the DLL containing the message service provider entry point function to call for\n        configuration.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_UID\">\n      <summary>\n        Contains the MAPIUID structure for a message service.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_EXTRA_UIDS\">\n      <summary>\n        Contains a list of MAPIUID structures that identify additional profile sections for the message service.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICES\">\n      <summary>\n        Contains a list of identifiers of message services in the current profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_SUPPORT_FILES_W\">\n      <summary>\n        Contains a ANSI list of the files that belong to the message service.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_SUPPORT_FILES_A\">\n      <summary>\n        Contains a ANSI list of the files that belong to the message service.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_DELETE_FILES_W\">\n      <summary>\n        Contains a list of unicode filenames that are to be deleted when the message service is uninstalled.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SERVICE_DELETE_FILES_A\">\n      <summary>\n        Contains a list of filenames that are to be deleted when the message service is uninstalled.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_AB_SEARCH_PATH_UPDATE\">\n      <summary>\n        Contains a list of entry identifiers for address book containers explicitly configured by the user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROFILE_NAME_A\">\n      <summary>\n        Contains the ANSI name of the profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_PROFILE_NAME_W\">\n      <summary>\n        Contains the unicode name of the profile.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IDENTITY_DISPLAY_W\">\n      <summary>\n        Contains the display name for a service provider's identity as defined within a messaging system. UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IDENTITY_DISPLAY_A\">\n      <summary>\n        Contains the display name for a service provider's identity as defined within a messaging system. Non-UNICODE\n        compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IDENTITY_ENTRYID\">\n      <summary>\n        Contains the entry identifier for a service provider's identity as defined within a messaging system.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESOURCE_METHODS\">\n      <summary>\n        Contains a bitmask of flags indicating the methods in the IMAPIStatus interface that are supported by the status\n        object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESOURCE_TYPE\">\n      <summary>\n        Contains a value indicating the service provider type.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATUS_CODE\">\n      <summary>\n        Contains a bitmask of flags indicating the current status of a session resource. All service providers set status\n        codes as does MAPI to report on the status of the subsystem, the MAPI spooler, and the integrated address book.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_IDENTITY_SEARCH_KEY\">\n      <summary>\n        Contains the search key for a service provider's identity as defined within a messaging system.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_OWN_STORE_ENTRYID\">\n      <summary>\n        Contains the entry identifier of a transport's tightly coupled message store.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESOURCE_PATH_W\">\n      <summary>\n        Contains a path to the service provider's server. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_RESOURCE_PATH_A\">\n      <summary>\n        Contains a path to the service provider's server. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATUS_STRING_W\">\n      <summary>\n        Contains an ASCII message indicating the current status of a session resource. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_STATUS_STRING_A\">\n      <summary>\n        Contains an ASCII message indicating the current status of a session resource. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_X400_DEFERRED_DELIVERY_CANCEL\">\n      <summary>\n        Was originally meant to contain TRUE if the message transfer system (MTS) allows X.400 deferred delivery\n        cancellation. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_HEADER_FOLDER_ENTRYID\">\n      <summary>\n        Was originally meant to contain the entry identifier that a remote transport provider furnishes for its header\n        folder. No longer supported.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REMOTE_PROGRESS\">\n      <summary>\n        Contains a number indicating the status of a remote transfer.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REMOTE_PROGRESS_TEXT_W\">\n      <summary>\n        Contains an ASCII string indicating the status of a remote transfer. UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REMOTE_PROGRESS_TEXT_A\">\n      <summary>\n        Contains an ASCII string indicating the status of a remote transfer. Non-UNICODE compilation.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_REMOTE_VALIDATE_OK\">\n      <summary>\n        Contains TRUE if the remote viewer is allowed to call the IMAPIStatus::ValidateState method.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTROL_FLAGS\">\n      <summary>\n        Contains a bitmask of flags governing the behavior of a control used in a dialog box built from a display table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTROL_STRUCTURE\">\n      <summary>\n        Contains a pointer to a structure for a control used in a dialog box.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTROL_TYPE\">\n      <summary>\n        Contains a value indicating a control type for a control used in a dialog box.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DELTAX\">\n      <summary>\n        Contains the width of a dialog box control in standard Windows dialog units.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_DELTAY\">\n      <summary>\n        Contains the height of a dialog box control in standard Windows dialog units.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_XPOS\">\n      <summary>\n        Contains the x coordinate of the starting position (the upper-left corner) of a dialog box control, in standard\n        Windows dialog units.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_YPOS\">\n      <summary>\n        Contains the y coordinate of the starting position (the upper-left corner) of a dialog box control, in standard\n        Windows dialog units.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CONTROL_ID\">\n      <summary>\n        Contains a unique identifier for a control used in a dialog box.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INITIAL_DETAILS_PANE\">\n      <summary>\n        Indicates the page of a display template to display first.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MESSAGE_LOCALE_ID\">\n      <summary>\n        Contains the Windows LCID of the end user who created this message.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_INTERNET_CPID\">\n      <summary>\n        Indicates the code page used for <see cref=\"P:MsgKit.PropertyTags.PR_BODY_W\" /> (PidTagBody) or\n        <see cref=\"P:MsgKit.PropertyTags.PR_HTML\" /> (PidTagBodyHtml) properties.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CreatorAddrType_W\">\n      <summary>\n        The creators address type\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CreatorEmailAddr_W\">\n      <summary>\n        The creators e-mail address\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_CreatorSimpleDispName_W\">\n      <summary>\n        The creators display name\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_SenderSimpleDispName_W\">\n      <summary>\n        The senders display name\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACHMENT_LINKID\">\n      <summary>\n        Indicates the type of Message object to which this attachment is linked.\n      </summary>\n      <remarks>\n        Must be 0, unless overridden by other protocols that extend the\n        Message and Attachment Object Protocol as noted in [MS-OXCMSG].\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACHMENT_FLAGS\">\n      <summary>\n        Indicates special handling for this Attachment object.\n      </summary>\n      <remarks>\n        Must be 0x00000000, unless overridden by other protocols that extend the Message\n        and Attachment Object Protocol as noted in [MS-OXCMSG]\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_ATTACHMENT_HIDDEN\">\n      <summary>\n        Indicates whether an attachment is hidden from the end user.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTags.PR_MSG_EDITOR_FORMAT\">\n      <summary>\n        Specifies the format for an editor to use to display a message.\n      </summary>\n      <remarks>\n        By default, mail messages (with the message class IPM.Note or with a custom message\n        class derived from IPM.Note) sent from a POP3/SMTP mail account are sent in the Transport\n        Neutral Encapsulation Format (TNEF). The PR_MSG_EDITOR_FORMAT property can be used to enforce\n        only plain text, and not TNEF, when sending a message. If PR_MSG_EDITOR_FORMAT is set to\n        EDITOR_FORMAT_PLAINTEXT, the message is sent as plain text without TNEF. If PR_MSG_EDITOR_FORMAT\n        is set to EDITOR_FORMAT_RTF, TNEF encoding is implicitly enabled, and the message is sent by using\n        the default Internet format that is specified in the Outlook client.\n      </remarks>\n    </member>\n    <member name=\"T:MsgKit.PropertyTag\">\n      <summary>\n        Used to hold exactly one property tag\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTag.Id\">\n      <summary>\n        The 2 byte identifier\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTag.Type\">\n      <summary>\n        The 2 byte <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.PropertyTag.Name\">\n      <summary>\n        Returns the PropertyTag as a readable string, e.g. __substg1.0_0037001F\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.PropertyTag.#ctor(System.UInt16,MsgKit.Enums.PropertyType)\">\n      <summary>\n        Creates this object and sets all its properties\n      </summary>\n      <param name=\"id\">The id</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Receiving\">\n      <summary>\n        Contains the e-mail address for the messaging user who receives the message.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who receives the message. They must\n        be set by the incoming transport provider.\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Receiving.#ctor(System.String,System.String,MsgKit.Enums.AddressType)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Receiving.WriteProperties(MsgKit.Streams.TopLevelProperties)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream, this depends on the\n        <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"propertiesStream\">The <see cref=\"T:MsgKit.Streams.TopLevelProperties\" /></param>\n    </member>\n    <member name=\"T:MsgKit.ReceivingRepresenting\">\n      <summary>\n        Contains the e-mail address for the messaging user who is represented by the receiving user.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who is being represented by the\n        receiving user. They must be set by the incoming transport provider, which is also responsible for authorization or\n        verification of the delegate. If no messaging user is being represented, these properties should be set to the\n        e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.ReceivingRepresenting.#ctor(System.String,System.String,MsgKit.Enums.AddressType)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n    </member>\n    <member name=\"M:MsgKit.ReceivingRepresenting.WriteProperties(MsgKit.Streams.TopLevelProperties)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream, this depends on the\n        <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"propertiesStream\">The <see cref=\"T:MsgKit.Streams.TopLevelProperties\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Recipients\">\n      <summary>\n        Contains a list of <see cref=\"T:MsgKit.Recipients\" /> objects that are added to a\n        <see cref=\"T:MsgKit.Message\" />\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Recipients.AddTo(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.MapiObjectType,MsgKit.Enums.RecipientRowDisplayType)\">\n      <summary>\n        Adds an <see cref=\"F:MsgKit.Enums.RecipientType.To\" /> <see cref=\"T:MsgKit.Recipient\" />\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"T:MsgKit.Enums.AddressType\" /></param>\n      <param name=\"objectType\">\n        <see cref=\"T:MsgKit.Enums.MapiObjectType\" />\n      </param>\n      <param name=\"displayType\">\n        <see cref=\"T:MsgKit.Enums.RecipientRowDisplayType\" />\n      </param>\n    </member>\n    <member\n      name=\"M:MsgKit.Recipients.AddCc(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.MapiObjectType,MsgKit.Enums.RecipientRowDisplayType)\">\n      <summary>\n        Adds an <see cref=\"F:MsgKit.Enums.RecipientType.Cc\" /> <see cref=\"T:MsgKit.Recipient\" />\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"T:MsgKit.Enums.AddressType\" /></param>\n      <param name=\"objectType\">\n        <see cref=\"T:MsgKit.Enums.MapiObjectType\" />\n      </param>\n      <param name=\"displayType\">\n        <see cref=\"T:MsgKit.Enums.RecipientRowDisplayType\" />\n      </param>\n    </member>\n    <member\n      name=\"M:MsgKit.Recipients.AddBcc(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.MapiObjectType,MsgKit.Enums.RecipientRowDisplayType)\">\n      <summary>\n        Adds an <see cref=\"F:MsgKit.Enums.RecipientType.Bcc\" /> <see cref=\"T:MsgKit.Recipient\" />\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"T:MsgKit.Enums.AddressType\" /></param>\n      <param name=\"objectType\">\n        <see cref=\"T:MsgKit.Enums.MapiObjectType\" />\n      </param>\n      <param name=\"displayType\">\n        <see cref=\"T:MsgKit.Enums.RecipientRowDisplayType\" />\n      </param>\n    </member>\n    <member\n      name=\"M:MsgKit.Recipients.AddRecipient(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.RecipientType,MsgKit.Enums.MapiObjectType,MsgKit.Enums.RecipientRowDisplayType)\">\n      <summary>\n        Adds an <see cref=\"T:MsgKit.Recipient\" />\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"T:MsgKit.Enums.AddressType\" /></param>\n      <param name=\"recipientType\">The <see cref=\"T:MsgKit.Enums.RecipientType\" /></param>\n      <param name=\"objectType\">\n        <see cref=\"T:MsgKit.Enums.MapiObjectType\" />\n      </param>\n      <param name=\"displayType\">\n        <see cref=\"T:MsgKit.Enums.RecipientRowDisplayType\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Recipients.WriteToStorage(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes the <see cref=\"T:MsgKit.Recipient\" /> objects to the given <paramref name=\"rootStorage\" />\n        and it will set all the needed properties\n      </summary>\n      <param name=\"rootStorage\">The root <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Recipient\" /> objects and it's\n        <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Recipient\">\n      <summary>\n        This class represents a recipient\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Recipient.RowId\">\n      <summary>\n        Returns or sets a unique identifier for a recipient in a recipient table or status table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Recipient.RecipientType\">\n      <summary>\n        The <see cref=\"P:MsgKit.Recipient.RecipientType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Recipient.Flags\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.RecipientFlags\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Recipient.ObjectType\">\n      <summary>\n        Contains the type of email object.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Recipient.DisplayType\">\n      <summary>\n        Contains the display type.\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Recipient.#ctor(System.Int64,System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.RecipientType,MsgKit.Enums.MapiObjectType,MsgKit.Enums.RecipientRowDisplayType)\">\n      <summary>\n        Creates a new recipient object and sets all its properties\n      </summary>\n      <param name=\"rowId\">Contains a unique identifier for a recipient in a recipient table or status table.</param>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"recipientType\">The <see cref=\"P:MsgKit.Recipient.RecipientType\" /></param>\n      <param name=\"addressType\">The <see cref=\"T:MsgKit.Enums.AddressType\" /></param>\n      <param name=\"objectType\">\n        <see cref=\"T:MsgKit.Enums.MapiObjectType\" />\n      </param>\n      <param name=\"displayType\">\n        <see cref=\"T:MsgKit.Enums.RecipientRowDisplayType\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Recipient.WriteProperties(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given <paramref name=\"storage\" />, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Recipient\" /> object and it's\n        <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Representing\">\n      <summary>\n        Contains the e-mail address for the messaging user represented by the sender.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the messaging user who is being represented by the\n        <see cref=\"T:MsgKit.Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n        authorization or\n        verification of the delegate. If no messaging user is being represented, these properties should be set to the\n        e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Representing.#ctor(System.String,System.String,MsgKit.Enums.AddressType)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Representing.WriteProperties(MsgKit.Streams.TopLevelProperties)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream, this depends on the\n        <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"propertiesStream\">The <see cref=\"T:MsgKit.Streams.TopLevelProperties\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Sender\">\n      <summary>\n        Contains the message sender's e-mail address.\n      </summary>\n      <remarks>\n        These properties are examples of the address properties for the message sender. They must be set by the outgoing\n        transport provider, which should never propagate any previously existing values.\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Sender._messageFormat\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.MessageFormat\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Sender._canLookupEmailAddress\">\n      <summary>\n        A flag that indicates whether the server can look up an address in the\n        address book\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Sender._senderIsCreator\">\n      <summary>\n        Set to <c>true</c> when the sender is also the creator of the message (default <c>true</c>)\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Sender.#ctor(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.MessageFormat,System.Boolean,System.Boolean)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n      <param name=\"messageFormat\">\n        <see cref=\"T:MsgKit.Enums.MessageFormat\" />\n      </param>\n      <param name=\"canLookupEmailAddress\">\n        Indicates that the <paramref name=\"email\" /> address\n        can be lookup in the addressbook. This parameter is only usefull when opening E-mails in an Exchange environment\n      </param>\n      <param name=\"senderIsCreator\">\n        Set to <c>true</c> when the sender is also the creator of the message (default\n        <c>true</c>)\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Sender.WriteProperties(MsgKit.Streams.TopLevelProperties)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream, this depends on the\n        <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"propertiesStream\">The <see cref=\"T:MsgKit.Streams.TopLevelProperties\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Streams.AttachmentProperties\">\n      <summary>\n        The properties stream contained inside an Attachment storage object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.AttachmentProperties.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.AttachmentProperties.#ctor(OpenMcdf.OpenMcdf.CfbStream)\">\n      <summary>\n        Creates this object and reads all the <see cref=\"T:MsgKit.Structures.Property\">properties</see> from\n        the given <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />\n      </summary>\n      <param name=\"stream\">The <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.AttachmentProperties.WriteProperties(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given storage, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Streams.EmbeddedMessageProperties\">\n      <summary>\n        The properties stream contained inside an Embedded Message storage object\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EmbeddedMessageProperties.NextRecipientId\">\n      <summary>\n        The ID to use for naming the next Recipient object storage if one is created inside the .msg file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EmbeddedMessageProperties.NextAttachmentId\">\n      <summary>\n        The ID to use for naming the next Attachment object storage if one is created inside the .msg file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EmbeddedMessageProperties.RecipientCount\">\n      <summary>\n        The number of Recipient objects\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EmbeddedMessageProperties.AttachmentCount\">\n      <summary>\n        The number of Attachment objects\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Streams.EmbeddedMessageProperties.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)\">\n      <summary>\n        Creates this object and sets all its properties\n      </summary>\n      <param name=\"nextRecipientId\">\n        The ID to use for naming the next Recipient object storage if one is created inside the\n        .msg file. If no Recipient object storages are contained in the .msg file, this field MUST be set to 0\n      </param>\n      <param name=\"nextAttachmentId\">\n        The ID to use for naming the next Attachment object storage if one is created inside the\n        .msg file. If no Attachment object storages are contained in the .msg file, this field MUST be set to 0\n      </param>\n      <param name=\"recipientCount\">The number of Recipient objects</param>\n      <param name=\"attachmentCount\">The number of Attachment objects</param>\n    </member>\n    <member name=\"M:MsgKit.Streams.EmbeddedMessageProperties.#ctor(OpenMcdf.OpenMcdf.CfbStream)\">\n      <summary>\n        Create this object and reads all the <see cref=\"T:MsgKit.Structures.Property\">properties</see> from\n        the given <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />\n      </summary>\n      <param name=\"stream\">The <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.EmbeddedMessageProperties.WriteProperties(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given <paramref name=\"storage\" />, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Streams.EntryStream\">\n      <summary>\n        The entry stream MUST be named \"__substg1.0_00030102\" and consist of 8-byte entries, one for each\n        named property being stored. The properties are assigned unique numeric IDs (distinct from any property\n        ID assignment) starting from a base of 0x8000. The IDs MUST be numbered consecutively, like an array.\n        In this stream, there MUST be exactly one entry for each named property of the Message object or any of\n        its subobjects. The index of the entry for a particular ID is calculated by subtracting 0x8000 from it.\n        For example, if the ID is 0x8005, the index for the corresponding 8-byte entry would be 0x8005 – 0x8000 = 5.\n        The index can then be multiplied by 8 to get the actual byte offset into the stream from where to start\n        reading the corresponding entry.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee159689(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStream.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStream.#ctor(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Creates this object and reads all the <see cref=\"T:MsgKit.Streams.EntryStreamItem\" /> objects from\n        the given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">\n        The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /> that containts the\n        <see cref=\"F:MsgKit.PropertyTags.EntryStream\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStream.Write(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all the <see cref=\"T:MsgKit.Streams.EntryStreamItem\" />'s as a <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> to the\n        given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Streams.EntryStreamItem\">\n      <summary>\n        Represents one item in the <see cref=\"T:MsgKit.Streams.EntryStream\" /> stream\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EntryStreamItem.NameIdentifierOrStringOffset\">\n      <summary>\n        Name Identifier/String Offset (4 bytes): If this property is a numerical named property (as specified by\n        the Property Kind subfield of the Index and Kind Information field), this value is the LID part of the\n        PropertyName structure, as specified in [MS-OXCDATA] section 2.6.1. If this property is a string named\n        property, this value is the offset in bytes into the strings stream where the value of the Name field of\n        the PropertyName structure is located.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EntryStreamItem.NameIdentifierOrStringOffsetHex\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.EntryStreamItem.IndexAndKindInformation\">\n      <summary>\n        The following structure specifies the stream indexes and whether the property is a numerical named\n        property or a string named property\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStreamItem.#ctor(System.IO.BinaryReader)\">\n      <summary>\n        Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStreamItem.#ctor(System.UInt16,MsgKit.Streams.IndexAndKindInformation)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"nameIdentifierOrStringOffset\">\n        <see cref=\"P:MsgKit.Streams.EntryStreamItem.NameIdentifierOrStringOffset\" />\n      </param>\n      <param name=\"indexAndKindInformation\">\n        <see cref=\"P:MsgKit.Streams.EntryStreamItem.IndexAndKindInformation\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.EntryStreamItem.Write(System.IO.BinaryWriter)\">\n      <summary>\n        Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n    </member>\n    <member name=\"T:MsgKit.Streams.IndexAndKindInformation\">\n      <summary>\n        2.2.3.1.2.1 Index and Kind Information\n        The following structure specifies the stream indexes and whether the property is a numerical named\n        property or a string named property.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.IndexAndKindInformation.PropertyIndex\">\n      <summary>\n        Sequentially increasing, zero-based index. This MUST be 0 for the first\n        named property, 1 for the second, and so on.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.IndexAndKindInformation.GuidIndex\">\n      <summary>\n        Index into the GUID stream. The possible values are shown in the following table.<br />\n        - 1 Always use the PS_MAPI property set, as specified in [MS-OXPROPS] section 1.3.2. No GUID is stored in<br />\n        the GUID stream.<br />\n        - 2 Always use the PS_PUBLIC_STRINGS property set, as specified in [MS-OXPROPS]<br />\n        section 1.3.2. No GUID is stored in the GUID stream.<br />\n        - >= 3 Use Value minus 3 as the index of the GUID into the GUID stream.For example, if the GUID index is 5,\n        <br />\n        the third GUID(5 minus 3, resulting in a zero-based index of 2) is used as the GUID for the name<br />\n        property being derived.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.IndexAndKindInformation.PropertyKind\">\n      <summary>\n        Bit indicating the type of the property; zero (0) if numerical named property\n        and 1 if string named property.\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Streams.IndexAndKindInformation.GetUIntFromBitArray(System.Collections.BitArray,System.Int32,System.Int32)\">\n      <summary>\n        Converts the given <paramref name=\"bitArray\" /> to an unsigned integer\n      </summary>\n      <param name=\"bitArray\"></param>\n      <param name=\"offset\"></param>\n      <param name=\"count\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.Streams.IndexAndKindInformation.#ctor(System.IO.BinaryReader)\">\n      <summary>\n        Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n    </member>\n    <member\n      name=\"M:MsgKit.Streams.IndexAndKindInformation.#ctor(System.UInt16,System.UInt16,MsgKit.Enums.PropertyKind)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"propertyIndex\">\n        <see cref=\"P:MsgKit.Streams.IndexAndKindInformation.PropertyIndex\" />\n      </param>\n      <param name=\"guidIndex\">\n        <see cref=\"P:MsgKit.Streams.IndexAndKindInformation.GuidIndex\" />\n      </param>\n      <param name=\"propertyKind\">\n        <see cref=\"P:MsgKit.Streams.IndexAndKindInformation.PropertyKind\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.IndexAndKindInformation.Write(System.IO.BinaryWriter)\">\n      <summary>\n        Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n    </member>\n    <member name=\"T:MsgKit.Streams.GuidStream\">\n      <summary>\n        The GUID stream MUST be named \"__substg1.0_00020102\". It MUST store the property set GUID\n        part of the property name of all named properties in the Message object or any of its subobjects,\n        except for those named properties that have PS_MAPI or PS_PUBLIC_STRINGS, as described in [MSOXPROPS]\n        section 1.3.2, as their property set GUID.\n        The GUIDs are stored in the stream consecutively like an array. If there are multiple named properties\n        that have the same property set GUID, then the GUID is stored only once and all the named\n        properties will refer to it by its index\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.GuidStream.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.GuidStream.#ctor(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Creates this object and reads all the <see cref=\"T:System.Guid\" /> objects from\n        the given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">\n        The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /> that containts the\n        <see cref=\"F:MsgKit.PropertyTags.GuidStream\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.GuidStream.Write(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all the <see cref=\"T:System.Guid\" />'s as a <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> to the\n        given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n    </member>\n    <member name=\"F:MsgKit.Streams.NamedProperties._topLevelProperties\">\n      <summary>\n        <see cref=\"T:MsgKit.Streams.TopLevelProperties\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Streams.NamedProperties._namedPropertyIndex\">\n      <summary>\n        The offset index for a <see cref=\"T:MsgKit.Structures.NamedProperty\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.NamedProperties.#ctor(MsgKit.Streams.TopLevelProperties)\">\n      <summary>\n        Creates this object\n      </summary>\n      <param name=\"topLevelProperties\">\n        <see cref=\"T:MsgKit.Streams.TopLevelProperties\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.NamedProperties.AddProperty(MsgKit.NamedPropertyTag,System.Object)\">\n      <summary>\n        Adds a <see cref=\"T:MsgKit.NamedPropertyTag\" />\n      </summary>\n      <remarks>\n        Only support for properties by ID for now.\n      </remarks>\n      <param name=\"mapiTag\"></param>\n      <param name=\"obj\"></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.NamedProperties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.Int64)\">\n      <summary>\n        Writes the properties to the <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />\n      </summary>\n      <param name=\"storage\"></param>\n      <param name=\"messageSize\"></param>\n      <remarks>\n        Unfortunately this is going to have to be used after we already written the top level properties.\n      </remarks>\n    </member>\n    <member\n      name=\"M:MsgKit.Streams.NamedProperties.GenerateStreamString(System.UInt32,System.UInt32,MsgKit.Enums.PropertyKind)\">\n      <summary>\n        Generates the stream strings\n      </summary>\n      <param name=\"nameIdentifier\"></param>\n      <param name=\"guidTarget\"></param>\n      <param name=\"propertyKind\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Streams.RecipientProperties\">\n      <summary>\n        The properties stream contained inside an Recipient storage object.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.RecipientProperties.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.RecipientProperties.#ctor(OpenMcdf.OpenMcdf.CfbStream)\">\n      <summary>\n        Creates this object and reads all the <see cref=\"T:MsgKit.Structures.Property\">properties</see>\n        from the given <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />\n      </summary>\n      <param name=\"stream\">The <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.RecipientProperties.WriteProperties(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given storage, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Streams.StringStream\">\n      <summary>\n        The string stream MUST be named \"__substg1.0_00040102\". It MUST consist of one entry for each\n        string named property, and all entries MUST be arranged consecutively, like in an array.\n        As specified in section 2.2.3.1.2, the offset, in bytes, to use for a particular property is stored in the\n        corresponding entry in the entry stream.That is a byte offset into the string stream from where the\n        entry for the property can be read.The strings MUST NOT be null-terminated. Implementers can add a\n        terminating null character to the string\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee124409(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStream.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStream.#ctor(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Creates this object and reads all the <see cref=\"T:MsgKit.Streams.StringStreamItem\" /> objects\n        from the given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">\n        The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /> that contains the\n        <see cref=\"F:MsgKit.PropertyTags.EntryStream\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStream.Write(OpenMcdf.OpenMcdf.Storage)\">\n      <summary>\n        Writes all the <see cref=\"T:MsgKit.Streams.StringStream\" />'s as a <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> to the\n        given <paramref name=\"storage\" />\n      </summary>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n    </member>\n    <member name=\"T:MsgKit.Streams.StringStreamItem\">\n      <summary>\n        Represents one item in the <see cref=\"T:MsgKit.Streams.StringStream\" /> stream\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.StringStreamItem.Length\">\n      <summary>\n        The length of the following <see cref=\"P:MsgKit.Streams.StringStreamItem.Name\" /> field in bytes.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.StringStreamItem.Name\">\n      <summary>\n        A Unicode string that is the name of the property. A new entry MUST always start\n        on a 4 byte boundary; therefore, if the size of the Name field is not an exact multiple of 4, and\n        another Name field entry occurs after it, null characters MUST be appended to the stream after it\n        until the 4-byte boundary is reached.The Name Length field for the next entry will then start at\n        the beginning of the next 4-byte boundary\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStreamItem.#ctor(System.IO.BinaryReader)\">\n      <summary>\n        Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStreamItem.#ctor(System.String)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"name\">\n        <see cref=\"P:MsgKit.Streams.StringStreamItem.Name\" />\n      </param>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStreamItem.Write(System.IO.BinaryWriter)\">\n      <summary>\n        Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n      </summary>\n      <param name=\"binaryWriter\"></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.StringStreamItem.Get4BytesBoundry(System.UInt32)\">\n      <summary>\n        Extract 4 from the given <paramref name=\"length\" /> until the result is smaller\n        then 4 and then returns this result;\n      </summary>\n      <param name=\"length\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.Streams.TopLevelProperties\">\n      <summary>\n        The properties stream contained inside the top level of the .msg file, which represents the Message object itself.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.TopLevelProperties.NextRecipientId\">\n      <summary>\n        The ID to use for naming the next Recipient object storage if one is created inside the .msg file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.TopLevelProperties.NextAttachmentId\">\n      <summary>\n        The ID to use for naming the next Attachment object storage if one is created inside the .msg file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.TopLevelProperties.RecipientCount\">\n      <summary>\n        The number of Recipient objects\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Streams.TopLevelProperties.AttachmentCount\">\n      <summary>\n        The number of Attachment objects\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Streams.TopLevelProperties.#ctor(OpenMcdf.OpenMcdf.CfbStream)\">\n      <summary>\n        Create this object and reads all the <see cref=\"T:MsgKit.Structures.Property\">properties</see> from\n        the given <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />\n      </summary>\n      <param name=\"stream\">The <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /></param>\n    </member>\n    <member name=\"M:MsgKit.Streams.TopLevelProperties.#ctor\">\n      <summary>\n        Creates this object\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Streams.TopLevelProperties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.Nullable{System.Int64})\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given <paramref name=\"storage\" />, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <remarks>\n        See the <see cref=\"T:MsgKit.Structures.Properties\" /> class it's\n        <see\n          cref=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\" />\n        method for the logic\n        that is used to determine this\n      </remarks>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <param name=\"messageSize\">Used to calculate the exact size of the <see cref=\"T:MsgKit.Message\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member name=\"T:MsgKit.Structures.AddressBookEntryId\">\n      <summary>\n        An Address Book EntryID structure specifies several types of Address Book objects, including\n        individual users, distribution lists, containers, and templates.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee160588(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.AddressBookEntryId.Flags\">\n      <summary>\n        Flags (4 bytes): This value MUST be set to 0x00000000. Bits in this field indicate under\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.AddressBookEntryId.X500Dn\">\n      <summary>\n        The X500 DN of the Address Book object.\n      </summary>\n      <remarks>\n        A distinguished name (DN), in Teletex form, of an object that is in an address book. An X500 DN can be more limited\n        in the size and number of relative distinguished names (RDNs) than a full DN.\n      </remarks>\n    </member>\n    <member name=\"T:MsgKit.Structures.CLSID\">\n      <summary>\n        The packet version of the CLSID structure represents a class identifier (CLSID) in a serialized manner.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.CLSID.Data1\">\n      <summary>\n        Data1 (4 bytes): This MUST be identical in meaning to the Data1 field specified in [MS-DTYP] section 2.3.4.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.CLSID.Data2\">\n      <summary>\n        Data2 (2 bytes): This MUST be identical in meaning to the Data2 field specified in [MS-DTYP] section 2.3.4.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.CLSID.Data3\">\n      <summary>\n        Data3 (2 bytes): This MUST be identical in meaning to the Data3 field specified in [MS-DTYP] section 2.3.4.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.CLSID.Data4\">\n      <summary>\n        Data4 (8 bytes): This MUST be identical in meaning to the Data4 field specified in [MS-DTYP] section 2.3.4.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Structures.CLSID.#ctor(System.IO.BinaryReader)\">\n      <summary>\n        Creatis this object and sets all it properties\n      </summary>\n      <param name=\"binaryReader\"></param>\n    </member>\n    <member name=\"M:MsgKit.Structures.CLSID.ToGuid\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.CLSID.Data1\" />, <see cref=\"P:MsgKit.Structures.CLSID.Data2\" />,\n        <see cref=\"P:MsgKit.Structures.CLSID.Data3\" />, <see cref=\"P:MsgKit.Structures.CLSID.Data4\" /> as\n        a <see cref=\"T:System.Guid\" />\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Structures.NamedProperty\">\n      <summary>\n        The PropertyName Structure\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee158295(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.NamedProperty.NameIdentifier\">\n      <summary>\n        This should be the ID of the built in property name we are attaching to.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.NamedProperty.Kind\">\n      <summary>\n        The possible values for the Kind field are in the following table.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.NamedProperty.NameSize\">\n      <summary>\n        The value of this field is equal to the number of bytes in the Name string that follows it. This field is present\n        only if the value of the <see cref=\"P:MsgKit.Structures.NamedProperty.Kind\" /> field is equal to\n        <see cref=\"F:MsgKit.Enums.PropertyKind.Name\" />\n      </summary>\n      <remarks>\n        Optional\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.NamedProperty.Name\">\n      <summary>\n        This field is present only if <see cref=\"P:MsgKit.Structures.NamedProperty.Kind\" /> is equal to\n        <see cref=\"F:MsgKit.Enums.PropertyKind.Name\" />. The value is a\n        Unicode (UTF-16 format) string, followed by two zero bytes as terminating null characters, that identifies the\n        property within its property set.\n      </summary>\n      <remarks>\n        Optional\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.NamedProperty.Guid\">\n      <summary>\n        A <see cref=\"P:MsgKit.Structures.NamedProperty.Guid\" />\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Structures.OneOffEntryId\">\n      <summary>\n        A One-Off EntryID structure specifies a set of data representing recipients\n        that do not exist in the directory. All information about a one-off recipient\n        is contained in the EntryID.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee202811(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"F:MsgKit.Structures.OneOffEntryId._messageFormat\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.MessageFormat\" />\n      </summary>\n    </member>\n    <member name=\"F:MsgKit.Structures.OneOffEntryId._canLookupEmailAddress\">\n      <summary>\n        A flag that indicates whether the server can look up an address in the\n        address book\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.OneOffEntryId.#ctor(System.String,System.String,MsgKit.Enums.AddressType,MsgKit.Enums.MessageFormat,System.Boolean)\">\n      <summary>\n        Creates this object and sets all it's needed properties\n      </summary>\n      <param name=\"email\">The full E-mail address</param>\n      <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n      <param name=\"addressType\">The <see cref=\"P:MsgKit.Address.AddressType\" /></param>\n      <param name=\"messageFormat\">\n        <see cref=\"T:MsgKit.Enums.MessageFormat\" />\n      </param>\n      <param name=\"canLookupEmailAddress\"></param>\n    </member>\n    <member name=\"M:MsgKit.Structures.OneOffEntryId.ToByteArray\">\n      <summary>\n        Returns this class as a byte array\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Structures.Properties\">\n      <summary>\n        The properties inside an msg file\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee178759%28v=exchg.80%29.aspx\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.Structures.Properties.ReadProperties(System.IO.BinaryReader)\">\n      <summary>\n        Reads all the <see cref=\"T:MsgKit.Structures.Property\" /> objects from the given\n        <paramref name=\"binaryReader\" />\n      </summary>\n      <param name=\"binaryReader\"></param>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Properties.WriteProperties(OpenMcdf.OpenMcdf.Storage,System.IO.BinaryWriter,System.Nullable{System.Int64})\">\n      <summary>\n        Writes all <see cref=\"T:MsgKit.Structures.Property\">properties</see> either as a\n        <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /> or as a collection in\n        a <see cref=\"F:MsgKit.PropertyTags.PropertiesStreamName\" /> stream to the given <paramref name=\"storage\" />, this depends\n        on the <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n      <param name=\"storage\">The <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" /></param>\n      <param name=\"binaryWriter\">The <see cref=\"T:System.IO.BinaryWriter\" /></param>\n      <param name=\"messageSize\">Used to calculate the exact size of the <see cref=\"T:MsgKit.Message\" /></param>\n      <returns>\n        Total size of the written <see cref=\"T:MsgKit.Structures.Properties\" />\n      </returns>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Properties.AddProperty(MsgKit.PropertyTag,System.Object,MsgKit.Enums.PropertyFlags)\">\n      <summary>\n        Adds a property\n      </summary>\n      <param name=\"mapiTag\">The <see cref=\"T:MsgKit.PropertyTag\" /></param>\n      <param name=\"obj\">The value for the mapi tag</param>\n      <param name=\"flags\">\n        the flags to set on the property, default <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_READABLE\" />\n        and <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_WRITABLE\" />\n      </param>\n      <exception cref=\"T:System.ArgumentNullException\">Raised when <paramref name=\"obj\" /> is <c>null</c></exception>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Properties.AddProperty(System.UInt16,MsgKit.Enums.PropertyType,System.Byte[],MsgKit.Enums.PropertyFlags)\">\n      <summary>\n        Adds a property that has been read from the propertiesstream\n      </summary>\n      <param name=\"id\">The id of the property</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n      <param name=\"data\"></param>\n      <param name=\"flags\">\n        the flags to set on the property, default <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_READABLE\" />\n        and <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_WRITABLE\" />\n      </param>\n      <exception cref=\"T:System.ArgumentOutOfRangeException\">Raised when <paramref name=\"data\" /> is not 8 bytes</exception>\n    </member>\n    <member name=\"M:MsgKit.Structures.Properties.AddProperty(OpenMcdf.OpenMcdf.CfbStream)\">\n      <summary>\n        Adds a OpenMcdf.CfbStream and converts it into a property\n      </summary>\n      <param name=\"stream\">The <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" /></param>\n      <exception cref=\"T:System.ArgumentOutOfRangeException\">\n        Raised when the <paramref name=\"stream\" /> does not start with\n        \"__substg1.0_\"\n      </exception>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Properties.AddOrReplaceProperty(MsgKit.PropertyTag,System.Object,MsgKit.Enums.PropertyFlags)\">\n      <summary>\n        Adds a property when it not exists, otherwise it is replaced\n      </summary>\n      <param name=\"mapiTag\">The <see cref=\"T:MsgKit.PropertyTag\" /></param>\n      <param name=\"obj\">The value for the mapi tag</param>\n      <param name=\"flags\">\n        the flags to set on the property, default <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_READABLE\" />\n        and <see cref=\"F:MsgKit.Enums.PropertyFlags.PROPATTR_WRITABLE\" />\n      </param>\n      <exception cref=\"T:System.ArgumentNullException\">Raised when <paramref name=\"obj\" /> is <c>null</c></exception>\n    </member>\n    <member name=\"T:MsgKit.Structures.Property\">\n      <summary>\n        A property inside the MSG file\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.Id\">\n      <summary>\n        The id of the property\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.Name\">\n      <summary>\n        Returns the Property as a readable string\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ShortName\">\n      <summary>\n        Returns the Property as a readable string without the streamprefix and type\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.Type\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.PropertyType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.Flags\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.PropertyFlags\">property flags</see> that have been set\n        in its <see cref=\"T:System.UInt32\" /> raw form\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.MultiValue\">\n      <summary>\n        Returns <c>true</c> when this property is part of a multivalue property\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.FlagsCollection\">\n      <summary>\n        The <see cref=\"T:MsgKit.Enums.PropertyFlags\">property flags</see> that have been set\n        as a readonly collection\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.Data\">\n      <summary>\n        The property data\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToInt\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an integer when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_SHORT\" />,\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_LONG\" /> or <see cref=\"F:MsgKit.Enums.PropertyType.PT_ERROR\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_SHORT\" /> or\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_LONG\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToSingle\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a single when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToDouble\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a single when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_DOUBLE\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_DOUBLE\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToDecimal\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a decimal when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToDateTime\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a datetime when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_APPTIME\" />\n        or <see cref=\"F:MsgKit.Enums.PropertyType.PT_SYSTIME\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_APPTIME\" /> or\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_SYSTIME\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToBool\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a boolean when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_BOOLEAN\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_BOOLEAN\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToLong\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a boolean when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_LONGLONG\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_LONGLONG\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToString\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a string when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_UNICODE\" />\n        or <see cref=\"F:MsgKit.Enums.PropertyType.PT_STRING8\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_UNICODE\" /> or <see cref=\"F:MsgKit.Enums.PropertyType.PT_STRING8\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToGuid\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a Guid when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to <see cref=\"F:MsgKit.Enums.PropertyType.PT_CLSID\" />\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_OBJECT\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_BINARY\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToBinary\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as a byte[] when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to <see cref=\"F:MsgKit.Enums.PropertyType.PT_BINARY\" />\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_OBJECT\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_BINARY\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToIntCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of integers when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_SHORT\" /> or <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_LONG\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToFloatCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of floats when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_FLOAT\" /> or\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_DOUBLE\" />\n      </summary>\n      <exception cref=\"T:MsgKit.Exceptions.MKInvalidProperty\">\n        Raised when the <see cref=\"P:MsgKit.Structures.Property.Type\" /> is not set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_FLOAT\" />\n      </exception>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToDecimalCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of decimals when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_CURRENCY\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToDateTimeCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of datetime when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_APPTIME\" /> or\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_SYSTIME\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToLongCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of datetime when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_LONGLONG\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToStringCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of strings when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_STRING8\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.Property.ToBinaryCollection\">\n      <summary>\n        Returns <see cref=\"P:MsgKit.Structures.Property.Data\" /> as an readonly collection of byte arrays when\n        <see cref=\"P:MsgKit.Structures.Property.Type\" /> is set to\n        <see cref=\"F:MsgKit.Enums.PropertyType.PT_MV_BINARY\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Structures.Property.ByteArrayToDecimal(System.Byte[],System.Int32)\">\n      <summary>\n        Converts a byte array to a decimal\n      </summary>\n      <param name=\"source\">The byte array</param>\n      <param name=\"offset\">The offset to start reading</param>\n      <returns></returns>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Property.#ctor(System.UInt16,MsgKit.Enums.PropertyType,System.Byte[],System.Boolean)\">\n      <summary>\n        Creates this object and sets all its propertues\n      </summary>\n      <param name=\"id\">The id of the property</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n      <param name=\"data\">The property data</param>\n      <param name=\"multiValue\">\n        Set to <c>true</c> to indicate that this property is part of a\n        multivalue property\n      </param>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Property.#ctor(System.UInt16,MsgKit.Enums.PropertyType,MsgKit.Enums.PropertyFlags,System.Byte[],System.Boolean)\">\n      <summary>\n        Creates this object and sets all its propertues\n      </summary>\n      <param name=\"id\">The id of the property</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n      <param name=\"flags\">The <see cref=\"T:MsgKit.Enums.PropertyFlags\" /></param>\n      <param name=\"data\">The property data</param>\n      <param name=\"multiValue\">\n        Set to <c>true</c> to indicate that this property is part of a\n        multivalue property\n      </param>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.Property.#ctor(System.UInt16,MsgKit.Enums.PropertyType,System.UInt32,System.Byte[],System.Boolean)\">\n      <summary>\n        Creates this object and sets all its propertues\n      </summary>\n      <param name=\"id\">The id of the property</param>\n      <param name=\"type\">The <see cref=\"T:MsgKit.Enums.PropertyType\" /></param>\n      <param name=\"flags\">The <see cref=\"T:MsgKit.Enums.PropertyFlags\" /></param>\n      <param name=\"data\">The property data</param>\n      <param name=\"multiValue\">\n        Set to <c>true</c> to indicate that this property is part of a\n        multivalue property\n      </param>\n    </member>\n    <member name=\"T:MsgKit.Structures.RecipientRow\">\n      <summary>\n        An array of RecipientRow structures, as specified in [MS-OXCDATA] section 2.8.3.\n        Each structure specifies an unsendable attendee. The RowCount field specifies the\n        number of structures contained in this field. For details about properties that can\n        be set on RecipientRow structures for Calendar objects and meeting-related objects,\n        see section 2.2.4.10.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee179606(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.RecipientType\">\n      <summary>\n        The <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientType\" /> or null when not available\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\">\n      <summary>\n        The <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.AddressPrefixUsed\">\n      <summary>\n        The address prefix used\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.RecipientRowDisplayType\">\n      <summary>\n        The <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowDisplayType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.X500Dn\">\n      <summary>\n        This field MUST be present when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n        field of the RecipientFlags\n        field is set to X500DN (0x1) and MUST NOT be present otherwise. This value specifies the X500 DN of\n        this recipient (1).\n      </summary>\n      <remarks>\n        A distinguished name (DN), in Teletex form, of an object that is in an address book. An X500 DN can be more limited\n        in the size and number of relative distinguished names (RDNs) than a full DN.\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.EntryIdSize\">\n      <summary>\n        This field MUST be present when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n        field of the RecipientFlags field is set to\n        PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n        NOT be present otherwise. This value specifies the size of the EntryID field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.EntryId\">\n      <summary>\n        This field MUST be present when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n        field of the RecipientFlags field is set to\n        PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST NOT be present otherwise. The\n        number of bytes in this field MUST be the same as specified in the EntryIdSize field. This array specifies the\n        address book EntryID structure, as specified in section 2.2.5.2, of the distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.SearchKeySize\">\n      <summary>\n        This field MUST be present when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n        field of the RecipientFlags field is set to\n        PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n        NOT be present otherwise. This value specifies the size of the SearchKey field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.SearchKey\">\n      <summary>\n        This field is used when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" /> field of the RecipientFlags field is set to\n        PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n        NOT be present otherwise. The number of bytes in this field MUST be the same as what\n        is specified in the SearchKeySize field and can be 0. This array specifies the search\n        key of the distribution list.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.AddresType\">\n      <summary>\n        This field MUST be present when the <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n        field of the\n        RecipientsFlags field is set to NoType (0x0) and the O flag of the RecipientsFlags field\n        is set. This field MUST NOT be present otherwise. This string specifies the address type\n        of the recipient (1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.EmailAddress\">\n      <summary>\n        A null-terminated string. This field MUST be present when the E flag of the RecipientsFlags\n        field is set and MUST NOT be present otherwise. This field MUST be specified in Unicode\n        characters if the U flag of the RecipientsFlags field is set and in the 8-bit character set\n        otherwise. This string specifies the email address of the recipient (1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.DisplayName\">\n      <summary>\n        This field MUST be present when the D flag of the RecipientsFlags\n        field is set and MUST NOT be present otherwise. This field MUST be specified in Unicode characters if the U flag of\n        the RecipientsFlags field is set and in the 8-bit character set otherwise. This string specifies the email address\n        of the recipient (1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.SimpleDisplayName\">\n      <summary>\n        A null-terminated string. This field MUST be present when the I flag of the RecipientsFlags field is set and MUST\n        NOT be present otherwise. This field MUST be specified in Unicode characters if the U flag of the RecipientsFlags\n        field is set and in the 8-bit character set otherwise. This string specifies the email address of the recipient\n        (1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.TransmittableDisplayName\">\n      <summary>\n        This field MUST be present when the T flag of the RecipientsFlags field is set and MUST NOT be present otherwise.\n        This field MUST be specified in Unicode characters if the U flag of the RecipientsFlags field is set and in the\n        8-bit character set otherwise. This string specifies the email address of the recipient (1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.RecipientProperties\">\n      <summary>\n        PropertyRow structures, as specified in section 2.8.1. The columns used for this row are those specified in\n        RecipientProperties.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecipientRow.SupportsRtf\">\n      <summary>\n        Specifies that the recipient does support receiving rich text messages.\n      </summary>\n    </member>\n    <member\n      name=\"M:MsgKit.Structures.RecipientRow.#ctor(System.IO.BinaryReader,MsgKit.Enums.RecipientRowAddressType,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)\">\n      <summary>\n        Creates this object and sets all it's properties\n      </summary>\n      <param name=\"binaryReader\">The <see cref=\"T:System.IO.BinaryReader\" /></param>\n      <param name=\"recipientRowAddressType\">\n        The <see cref=\"P:MsgKit.Structures.RecipientRow.RecipientRowAddressType\" />\n      </param>\n      <param name=\"supportsRtf\">\n        Set to <c>true</c> when the recipient in the <see cref=\"T:MsgKit.Structures.RecipientRow\" />\n        supports RTF\n      </param>\n      <param name=\"displayNameIncluded\">If this flag is b'1', the DisplayName (section 2.8.3.2) field is included</param>\n      <param name=\"emailAddressIncluded\">If this flag is b'1', the EmailAddress (section 2.8.3.2) field is included.</param>\n      <param name=\"addressTypeIncluded\">\n        If this flag is b'1', this recipient (1) has a non-standard address type and the\n        AddressType field is included.\n      </param>\n      <param name=\"simpleDisplayNameIncluded\">If this flag is b'1', the SimpleDisplayName field is included.</param>\n      <param name=\"transmittableDisplayNameSameAsDisplayName\">\n        If this flag is b'1', the value of the TransmittableDisplayName\n        field is the same as the value of the DisplayName field.\n      </param>\n      <param name=\"transmittableDisplayNameIncluded\">\n        If this flag is b'1', the TransmittableDisplayName (section 2.8.3.2)\n        field is included.\n      </param>\n      <param name=\"stringsInUnicode\">\n        If this flag is b'1', the associated string properties are in Unicode with a 2-\n        byte terminating null character; if this flag is b'0', string properties are MBCS with a single\n        terminating null character, in the code page sent to the server in the EcDoConnectEx method,\n        as specified in [MS-OXCRPC] section 3.1.4.1, or the Connect request type 6, as specified in\n        [MS-OXCMAPIHTTP] section 2.2.4.1.\n      </param>\n    </member>\n    <member name=\"T:MsgKit.Structures.RecurrencePattern\">\n      <summary>\n        The RecurrencePattern structure specifies a recurrence pattern. The fields of this structure are stored in\n        little-endian byte order.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.RecurFrequency\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.RecurrencePatternFrequency\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.PatternType\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.RecurrencePatternPatternType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.CalendarType\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.RecurrencePatternCalendarType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.FirstDateTime\">\n      <summary>\n        An integer that specifies the first ever day, week, or month of a recurring series, dating back to a reference date, which is January 1, 1601, for a Gregorian calendar. The value and its meaning depend on the value of the RecurFrequency field. The value of the FirstDateTime field is used to determine the valid dates of a recurring series, as specified in section 2.2.1.44.1.2.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.Period\">\n      <summary>\n        An integer that specifies the interval at which the meeting pattern specified in PatternTypeSpecific field repeats.\n        The Period value MUST be between 1 and the maximum recurrence interval, which is 999 days for daily recurrences, 99\n        weeks for weekly recurrences, and 99 months for monthly recurrences. The following table lists the values for this\n        field based on the recurrence frequency, which is specified in the RecurFrequency field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.PatternTypeSpecific\">\n      <summary>\n        TODO: Make structure\n        PatternTypeSpecific (variable):  A structure that specifies the details of the recurrence pattern. The structure\n        varies according to the value of the PatternType field, as specified in sections 2.2.1.44.1.3, 2.2.1.44.1.4,\n        2.2.1.44.1.5, and 2.2.1.44.1.6.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.EndType\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.RecurrencePatternRecurrenceRangeType\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.OccurenceCount\">\n      <summary>\n        An integer that specifies the number of occurrences in a recurrence.\n      </summary>\n      <remarks>\n        When the EndType of the pattern is \"End after date\", this value always has to be computed. Although the value of\n        this field is always set, its value has no meaning on a recurring series that has no end date. This value can be\n        set to 0x0000000A for a recurring series with no end date\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.FirstDOW\">\n      <summary>\n        <see cref=\"T:MsgKit.Enums.RecurrencePatternFirstDOWDay\" />\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.StartDate\">\n      <summary>\n        An integer that specifies the date of the first occurrence. The value is the number of minutes between midnight,\n        January 1, 1601, and midnight of the date of the first occurrence.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.RecurrencePattern.EndDate\">\n      <summary>\n        An integer that specifies the ending date for the recurrence. The value is the number of minutes between midnight,\n        January 1, 1601, and midnight of the date of the last occurrence. When the value of the EndType field is 0x00002022\n        (end after n occurrences), this value is calculated based on the number of occurrences If the recurrence does not\n        have an end date, the value of the EndDate field MUST be set to 0x5AE980DF.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Structures.RecurrencePattern.ToByteArray\">\n      <summary>\n        Returns this class as a byte array\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Structures.ReportTag\">\n      <summary>\n        The PidTagReportTag property ([MS-OXPROPS] section 2.917) contains the data that is used to correlate the report\n        and the original message. The property can be absent if the sender does not request a reply or response to the\n        original e-mail message. If the original E-mail object has either the PidTagResponseRequested property (section\n        2.2.1.46) set to 0x01 or the PidTagReplyRequested property (section 2.2.1.45) set to 0x01, then the property is set\n        on the original E-mail object by using the following format.\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/ee160822(v=exchg.80).aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.Cookie\">\n      <summary>\n        (9 bytes): A null-terminated string of nine characters used for validation; set to \"PCDFEB09\".\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.Version\">\n      <summary>\n        (4 bytes): This field specifies the version. If the SearchFolderEntryId field is present, this field MUST be set to\n        0x00020001; otherwise, this field MUST be set to 0x00010001.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.StoreEntryIdSize\">\n      <summary>\n        (4 bytes): Size of the StoreEntryId field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.StoreEntryId\">\n      <summary>\n        (Variable length of bytes): This field specifies the entry ID of the mailbox that contains the original message. If\n        the value of the\n        StoreEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, this field is filled with\n        the number of bytes specified by the StoreEntryIdSize field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.FolderEntryIdSize\">\n      <summary>\n        (4 bytes): Size of the FolderEntryId field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.FolderEntryId\">\n      <summary>\n        (Variable): This field specifies the entry ID of the folder that contains the original message. If the value of the\n        FolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the field is filled with\n        the number of bytes specified by the FolderEntryIdSize field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.MessageEntryIdSize\">\n      <summary>\n        (4 bytes): Size of the MessageEntryId field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.MessageEntryId\">\n      <summary>\n        (Variable): This field specifies the entry ID of the original message. If the value of the MessageEntryIdSize field\n        is 0x00000000, this field is omitted. If the value is not zero, the field is filled with the number of bytes\n        specified by the MessageEntryIdSize field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.SearchFolderEntryIdSize\">\n      <summary>\n        (4 bytes): Size of the SearchFolderEntryId field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.SearchFolderEntryId\">\n      <summary>\n        (Variable): This field specifies the entry ID of an alternate folder that contains the original message. If the\n        value of the SearchFolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the\n        field is filled with the number of bytes specified by the SearchFolderEntryIdSize field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.MessageSearchKeySize\">\n      <summary>\n        (4 bytes): Size of the MessageSearchKey field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.MessageSearchKey\">\n      <summary>\n        (variable): This field specifies the search key of the original message. If the value of the MessageSearchKeySize\n        field is 0x00000000, this field is omitted. If the value is not zero, the MessageSearchKey field is filled with the\n        number of bytes specified by the MessageSearchKeySize field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.ANSITextSize\">\n      <summary>\n        (4 bytes): Number of characters in the ANSI Text field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.ReportTag.ANSIText\">\n      <summary>\n        (Variable): The subject of the original message. If the value of the ANSITextSize field is 0x00000000, this field\n        is omitted. If the value is not zero, the field is filled with the number of bytes specified by the ANSITextSize\n        field.\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Structures.ReportTag.ToByteArray\">\n      <summary>\n        Returns this class as a byte array\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Structures.UnsendableRecipients\">\n      <summary>\n        The PidLidAppointmentUnsendableRecipients property ([MS-OXPROPS] section 2.35) contains a list of\n        unsendable attendees. This property is not required but SHOULD be set\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.RowCount\">\n      <summary>\n        An integer that specifies the number of structures in the RecipientRow field\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.DifferentTransportDelivery\">\n      <summary>\n        If this flag is b'1', a different transport is responsible for delivery to this recipient(1).\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.DisplayNameIncluded\">\n      <summary>\n        If this flag is b'1', the DisplayName (section 2.8.3.2) field is included\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.EmailAddressIncluded\">\n      <summary>\n        If this flag is b'1', the EmailAddress (section 2.8.3.2) field is included.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.AddressTypeIncluded\">\n      <summary>\n        If this flag is b'1', this recipient (1) has a non-standard address type and the AddressType field is included.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.SimpleDisplayNameIncluded\">\n      <summary>\n        If this flag is b'1', the SimpleDisplayName field is included.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.TransmittableDisplayNameSameAsDisplayName\">\n      <summary>\n        If this flag is b'1', the value of the TransmittableDisplayName field is the same as the value of the DisplayName\n        field.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.TransmittableDisplayNameIncluded\">\n      <summary>\n        If this flag is b'1', the TransmittableDisplayName (section 2.8.3.2) field is included.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Structures.UnsendableRecipients.StringsInUnicode\">\n      <summary>\n        If this flag is b'1', the associated string properties are in Unicode with a 2-\n        byte terminating null character; if this flag is b'0', string properties are MBCS with a single\n        terminating null character, in the code page sent to the server in the EcDoConnectEx method,\n        as specified in [MS-OXCRPC] section 3.1.4.1, or the Connect request type 6, as specified in\n        [MS-OXCMAPIHTTP] section 2.2.4.1.\n      </summary>\n    </member>\n    <member name=\"T:MsgKit.Task\">\n      <summary>\n        A class used to make a task that can be added to an <see cref=\"T:MsgKit.Email\" /> or\n        <see cref=\"T:MsgKit.Appointment\" />\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc979231.aspx\n      </remarks>\n    </member>\n    <member name=\"P:MsgKit.Task.ReminderTime\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskStartDate\">\n      <summary>\n        Start date of the task\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskDueDate\">\n      <summary>\n        Due date of the task\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskComplete\">\n      <summary>\n        <c>true</c> when the task is complete\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.PercentComplete\">\n      <summary>\n        The complete percentage of the task\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskActualEffort\">\n      <summary>\n        The actual task effort in minutes\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskEstimatedEffort\">\n      <summary>\n        The estimated task effort in minutes\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskNoCompute\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskFFixOffline\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskOwnership\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskAcceptanceState\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskRole\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskVersion\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskState\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskAssigner\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskOwner\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TeamTask\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskOrdinal\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskFRecurring\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.ReminderDelta\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.ReminderSignalTime\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.CommonStart\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.CommonEnd\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.AgingDontAgeMe\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.TaskMode\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.ToDoOrdinalDate\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.ToDoSubOrdinal\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.Task.ValidFlagStringProof\">\n      <summary>\n\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Task.WriteToStorage\">\n      <summary>\n        Writes all the properties that are part of the <see cref=\"T:MsgKit.Appointment\" /> object either as\n        <see cref=\"T:OpenMcdf.OpenMcdf.Storage\" />'s\n        or <see cref=\"T:OpenMcdf.OpenMcdf.CfbStream\" />'s to the <see cref=\"P:OpenMcdf.OpenMcdf.RootStorage\" />\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.Task.Save(System.IO.Stream)\">\n      <summary>\n        Saves the message to the given <paramref name=\"stream\" />\n      </summary>\n      <param name=\"stream\"></param>\n    </member>\n    <member name=\"M:MsgKit.Task.Save(System.String)\">\n      <summary>\n        Saves the message to the given <paramref name=\"fileName\" />\n      </summary>\n      <param name=\"fileName\"></param>\n    </member>\n    <member name=\"T:MsgKit.ThreadIndex\">\n      <summary>\n        Identifies a particular conversation thread; computed from message references.\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.ThreadIndex.Date\">\n      <summary>\n        The date and time\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.ThreadIndex.Id\">\n      <summary>\n        The unique GUID for this thread\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.ThreadIndex.Raw\">\n      <summary>\n        The RAW base64 encoded thread index\n      </summary>\n    </member>\n    <member name=\"P:MsgKit.ThreadIndex.IsValid\">\n      <summary>\n        Returns <c>true</c> when the thread index is valid\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.ThreadIndex.#ctor(System.String)\">\n      <summary>\n        Creates this object and parses the given <paramref name=\"threadIndex\" />\n      </summary>\n      <param name=\"threadIndex\"></param>\n    </member>\n    <member name=\"M:MsgKit.ThreadIndex.ToString\">\n      <summary>\n        Returns the information about this thread index as a string\n      </summary>\n      <returns></returns>\n    </member>\n    <member name=\"T:MsgKit.TranslateTags\">\n      <summary>\n        This class maps each MAPI property to the corresponding canonical property name (and the otherway around).\n      </summary>\n      <remarks>\n        See https://msdn.microsoft.com/en-us/library/office/cc815492.aspx\n      </remarks>\n    </member>\n    <member name=\"M:MsgKit.TranslateTags.#cctor\">\n      <summary>\n        Creates this object and sets all it's properties\n      </summary>\n    </member>\n    <member name=\"M:MsgKit.TranslateTags.PropertyNameToCanonical(System.String)\">\n      <summary>\n        Returns the canonical name of the give <paramref name=\"propertyName\" />. When the property does not\n        exists then <c>null</c> is returned\n      </summary>\n      <param name=\"propertyName\"></param>\n      <returns></returns>\n    </member>\n    <member name=\"M:MsgKit.TranslateTags.CanonicalToPropertyName(System.String)\">\n      <summary>\n        Returns the property name of the give <paramref name=\"canonicalName\" />. When the property does not\n        exists then <c>null</c> is returned\n      </summary>\n      <remarks>\n        When more then one property is found then the UNICODE property is returned instead\n        of it's Non-UNICODE counter parts\n      </remarks>\n      <param name=\"canonicalName\">The canonical name of the <see cref=\"T:MsgKit.PropertyTags\" /></param>\n      <returns></returns>\n    </member>\n  </members>\n</doc>"
  },
  {
    "path": "MsgKit/NamedPropertyMapping.cs",
    "content": "﻿//\n// NamedPropertyMapping.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nnamespace MsgKit;\n\n/// <summary>\n///     A process that converts PropertyName structures to property IDs and vice-versa. Named properties can be referred to\n///     by their PropertyName. However, before accessing the property on a specific message store, named properties need to\n///     be mapped to property IDs that are valid for that message store. The reverse is also true. When properties need to\n///     be copied across message stores, property IDs that are valid for the source message store need to be mapped to\n///     their PropertyName structures before they can be sent to the destination message store.\n/// </summary>\ninternal class NamedPropertyMapping\n{\n    /*\n    3.2.1.1 Fetching the Name Identifier\n     *\n    In this example, property ID 0x8005 has to be mapped to its property name. First, the entry index into the entry stream (1) is determined:\n    Property ID – 0x8000\n    =0x8005 – 0x8000\n    =0x0005\n    Then, the offset for the corresponding 8-byte entry is determined:\n    Entry index * size of entry\n    = 0x05 * 0x08\n    = 0x28\n    The offset is then used to fetch the entry from the entry stream (1) (\"__substg1.0_00030102\"), which is contained inside the named property\n    mapping storage (\"__nameid_version1.0\"). In this case, bytes 40 – 47 are fetched from the stream (1). Then, the structure specified in the\n    entry stream (1) section is applied to those bytes, taking into consideration that the data is stored in little-endian format.\n\n     */\n}"
  },
  {
    "path": "MsgKit/NamedPropertyTags.cs",
    "content": "﻿//\n// NamedPropertyTags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing MsgKit.Enums;\nusing MsgKit.Structures;\n\n// ReSharper disable UnusedMember.Global\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n// ReSharper disable MemberCanBePrivate.Global\n\n// ReSharper disable ConvertPropertyToExpressionBody\n// ReSharper disable InconsistentNaming\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class that holds all the known named mapi tags\n/// </summary>\npublic static class NamedPropertyTags\n{\n    /// <summary>\n    ///     Specifies the date and time at which the meeting-related object was sent\n    /// </summary>\n    public static NamedPropertyTag PidLidAttendeeCriticalChange\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0001, \"PidLidAttendeeCriticalChange\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidLidLocation property (section 2.159) from the associated\n    ///     Meeting object.\n    /// </summary>\n    public static NamedPropertyTag PidLidWhere\n    {\n        get\n        {\n            return new NamedPropertyTag(0x002, \"PidLidWhere\", new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"),\n                PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidLidGlobalObjectId property (section 2.142) for an object\n    ///     that represents an Exception object to a recurring series, where the Year, Month, and Day fields are\n    ///     all zero.\n    /// </summary>\n    public static NamedPropertyTag PidLidGlobalObjectId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0003, \"PidLidGlobalObjectId\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the user did not include any text in the body of the Meeting Response\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidIsSilent\n    {\n        get\n        {\n            return new NamedPropertyTag(0x004, \"PidLidIsSilent\", new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"),\n                PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the object is associated with a recurring series.\n    /// </summary>\n    public static NamedPropertyTag PidLidIsRecurring\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0005, \"PidLidIsRecurring\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies required attendees for the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidRequiredAttendees\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0006, \"PidLidRequiredAttendees\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies optional attendees.\n    /// </summary>\n    public static NamedPropertyTag PidLidOptionalAttendees\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0007, \"PidLidOptionalAttendees\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies resource attendees for the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidResourceAttendees\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0008, \"PidLidResourceAttendees\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether a delegate responded to the meeting request.\n    /// </summary>\n    public static NamedPropertyTag PidLidDelegateMail\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0009, \"PidLidDelegateMail\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the object represents an exception (including an orphan instance).\n    /// </summary>\n    public static NamedPropertyTag PidLidIsException\n    {\n        get\n        {\n            return new NamedPropertyTag(0x000A, \"PidLidIsException\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Deprecated\n    /// </summary>\n    public static NamedPropertyTag PidLidSingleInvite\n    {\n        get\n        {\n            return new NamedPropertyTag(0x000B, \"PidLidSingleInvite\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a stream that maps to the persisted format of a TZREG structure, which describes the time zone to be used\n    ///     for the start and end time of a recurring appointment or meeting request.\n    /// </summary>\n    public static NamedPropertyTag PidLidTimeZone\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8233, \"PidLidTimeZone\", new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F130\"),\n                PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the start date of the recurrence pattern.\n    /// </summary>\n    public static NamedPropertyTag PidLidStartRecurrenceDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x000D, \"PidLidStartRecurrenceDate\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the start time of the recurrence pattern.\n    /// </summary>\n    public static NamedPropertyTag PidLidStartRecurrenceTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0003, \"PidLidStartRecurrenceTime\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the end date of the recurrence range\n    /// </summary>\n    public static NamedPropertyTag PidLidEndRecurrenceDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x000F, \"PidLidEndRecurrenceDate\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the end time of the recurrence range.\n    /// </summary>\n    public static NamedPropertyTag PidLidEndRecurrenceTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0001, \"PidLidEndRecurrenceTime\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the day interval for the recurrence pattern.\n    /// </summary>\n    public static NamedPropertyTag PidLidDayInterval\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0011, \"PidLidDayInterval\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SHORT);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the number of weeks that occur between each meeting\n    /// </summary>\n    public static NamedPropertyTag PidLidWeekInterval\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0012, \"PidLidWeekInterval\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SHORT);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the monthly interval of the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidMonthInterval\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0013, \"PidLidMonthInterval\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SHORT);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the monthly interval of the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidYearInterval\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0014, \"PidLidYearInterval\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SHORT);\n        }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static NamedPropertyTag PidLidMonthOfYearMask\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0017, \"PidLidMonthOfYearMask\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the month of the year in which the appointment or meeting occurs.\n    /// </summary>\n    public static NamedPropertyTag PidLidOldRecurrenceType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0018, \"PidLidOldRecurrenceType\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SHORT);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the date and time at which a Meeting Request object was sent by the\n    ///     organizer.\n    /// </summary>\n    public static NamedPropertyTag PidLidOwnerCriticalChange\n    {\n        get\n        {\n            return new NamedPropertyTag(0x001A, \"PidLidOwnerCriticalChange\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the CalendarType field from the PidLidAppointmentRecur\n    ///     property(section 2.22).\n    /// </summary>\n    public static NamedPropertyTag PidLidCalendarType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x001C, \"PidLidCalendarType\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Deprecated\n    /// </summary>\n    public static NamedPropertyTag PidLidAllAttendeesList\n    {\n        get\n        {\n            return new NamedPropertyTag(0x001D, \"PidLidAllAttendeesList\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidLidGlobalObjectId property (section 2.142) for an object\n    ///     that represents an Exception object to a recurring series, where the Year, Month, and Day fields are\n    ///     all zero.\n    /// </summary>\n    public static NamedPropertyTag PidLidCleanGlobalObjectId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0023, \"PidLidCleanGlobalObjectId\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the message class of the Meeting object to be generated from the Meeting\n    ///     Request object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentMessageClass\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0024, \"PidLidAppointmentMessageClass\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static NamedPropertyTag PidLidMeetingType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0026, \"PidLidMeetingType\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the type of Meeting Request object or Meeting Update object.\n    /// </summary>\n    public static NamedPropertyTag PidLidOldLocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0028, \"PidLidOldLocation\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the original value of the PidLidAppointmentStartWhole property (section2.29) before a meeting update.\n    /// </summary>\n    public static NamedPropertyTag PidLidOldWhenStartWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0029, \"PidLidOldWhenStartWhole\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the original value of the PidLidAppointmentEndWhole property (section2.14) before a meeting update.\n    /// </summary>\n    public static NamedPropertyTag PidLidOldWhenEndWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x002A, \"PidLidOldWhenStartWhole\",\n                new Guid(\"6ED8DA90-450B-101B-98DA-00AA003F1305\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the name under which to file a contact when displaying a list of contacts.\n    /// </summary>\n    public static NamedPropertyTag PidLidFileUnder\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8005, \"PidLidFileUnder\", new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies how to generate and recompute the value of the PidLidFileUnder property\n    ///     (section 2.132) when other contact name properties change.\n    /// </summary>\n    public static NamedPropertyTag PidLidFileUnderId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8006, \"PidLidFileUnderId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the visible fields in the application's user interface that are used to help display\n    ///     the contact information.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactItemData\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8007, \"PidLidContactItemData\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Deprecated\n    /// </summary>\n    public static NamedPropertyTag PidLidReferredBy\n    {\n        get\n        {\n            return new NamedPropertyTag(0x800E, \"PidLidReferredBy\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property is ignored by the server and is set to an empty string by the client\n    /// </summary>\n    public static NamedPropertyTag PidLidDepartment\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8010, \"PidLidDepartment\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the attachment has a picture.\n    /// </summary>\n    public static NamedPropertyTag PidLidHasPicture\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8015, \"PidLidHasPicture\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     The PidLidSmartNoAttach property ([MS-OXPROPS] section 2.301) is set to TRUE (0x01)\n    ///     if the Message object has no attachments that are visible to the end user. If this\n    ///     property is unset, a default value of FALSE (0x00) is used\n    /// </summary>\n    public static NamedPropertyTag PidLidSmartNoAttach\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8514, \"PidLidSmartNoAttach\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"),\n                PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the complete address of the home address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidHomeAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x801A, \"PidLidHomeAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the complete address of the work address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x801B, \"PidLidWorkAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the complete address of the contact’s other address.\n    /// </summary>\n    public static NamedPropertyTag PidLidOtherAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x801C, \"PidLidOtherAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies which physical address is the contact's mailing address..\n    /// </summary>\n    public static NamedPropertyTag PidLidPostalAddressId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8022, \"PidLidPostalAddressId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the character set used for this contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactCharacterSet\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8023, \"PidLidContactCharacterSet\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the character set used for a Contact object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAutoLog\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8025, \"PidLidAutoLog\", new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a list of possible values for the PidLidFileUnderId property (section 2.133)\n    /// </summary>\n    public static NamedPropertyTag PidLidFileUnderList\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8026, \"PidLidFileUnderList\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     The value of this property is ignored.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmailList\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8027, \"PidLidEmailList\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies which electronic address properties are set on the Contact object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAddressBookProviderEmailList\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8028, \"PidLidAddressBookProviderEmailList\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_LONG);\n        }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static NamedPropertyTag PidLidAddressBookProviderArrayType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8029, \"PidLidAddressBookProviderArrayType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the state of the electronic addresses of the contact and represents a set of bit\n    ///     flags.\n    /// </summary>\n    public static NamedPropertyTag PidLidHtml\n    {\n        get\n        {\n            return new NamedPropertyTag(0x802B, \"PidLidHtml\", new Guid(\"00062004-0000-0000-C000-000000000046\"),\n                PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the phonetic pronunciation of the given name of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidYomiFirstName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x802C, \"PidLidYomiFirstName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the phonetic pronunciation of the surname of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidYomiLastName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x802D, \"PidLidYomiLastName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the phonetic pronunciation of the company name of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidYomiCompanyName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x802E, \"PidLidYomiCompanyName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains user customization details for displaying a contact as a business card.\n    /// </summary>\n    public static NamedPropertyTag PidLidBusinessCardDisplayDefinition\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8040, \"PidLidBusinessCardDisplayDefinition\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the image to be used on a business card.\n    /// </summary>\n    public static NamedPropertyTag PidLidBusinessCardCardPicture\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8041, \"PidLidBusinessCardCardPicture\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the street portion of the work address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressStreet\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8045, \"PidLidWorkAddressStreet\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the city or locality portion of the work address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressCity\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8046, \"PidLidWorkAddressCity\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    /// Specifies the postal code (ZIP code) portion of the work address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressPostalCode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8048, \"PidLidWorkAddressPostalCode\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the country code portion of the work address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressCountry\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8049, \"PidLidWorkAddressCountry\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the post office box portion of the contact's work address.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressPostOfficeBox\n    {\n        get\n        {\n            return new NamedPropertyTag(0x804A, \"PidLidWorkAddressPostOfficeBox\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the 32-bit cyclic redundancy check (CRC) polynomial checksum, as\n    ///     specified in [ISO/IEC8802-3], calculated on the value of the PidLidDistributionListMembers\n    ///     property(section 2.96).\n    /// </summary>\n    public static NamedPropertyTag PidLidDistributionListChecksum\n    {\n        get\n        {\n            return new NamedPropertyTag(0x804C, \"PidLidDistributionListChecksum\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of an optional Appointment object that represents the birthday of\n    ///     the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidBirthdayEventEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x804D, \"PidLidBirthdayEventEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the Appointment object that represents an anniversary of\n    ///     the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidAnniversaryEventEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x804E, \"PidLidAnniversaryEventEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains text used to add custom text to a business card representation of a Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactUserField1\n    {\n        get\n        {\n            return new NamedPropertyTag(0x804F, \"PidLidContactUserField1\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains text used to add custom text to a business card representation of a Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactUserField2\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8050, \"PidLidContactUserField2\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains text used to add custom text to a business card representation of a Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactUserField3\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8051, \"PidLidContactUserField3\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains text used to add custom text to a business card representation of a Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidContactUserField4\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8052, \"PidLidContactUserField4\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the name of the personal distribution list.\n    /// </summary>\n    public static NamedPropertyTag PidLidDistributionListName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8053, \"PidLidDistributionListName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the list of one-off EntryIDs corresponding to the members of the personal\n    ///     distribution list.\n    /// </summary>\n    public static NamedPropertyTag PidLidDistributionListOneOffMembers\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8054, \"PidLidDistributionListOneOffMembers\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the 32-bit cyclic redundancy check (CRC) polynomial checksum, as\n    ///     specified in [ISO/IEC8802-3], calculated on the value of PidLidDistributionListMembers(section 2.91)\n    /// </summary>\n    public static NamedPropertyTag PidLidDistributionListMembers\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8055, \"PidLidDistributionListMembers\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_MV_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the contact's instant messaging address.\n    /// </summary>\n    public static NamedPropertyTag PidLidInstantMessagingAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8062, \"PidLidInstantMessagingAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the list of EntryIds and one-off EntryIds corresponding to the members of\n    ///     the personal distribution list.\n    /// </summary>\n    public static NamedPropertyTag PidLidDistributionListStream\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8064, \"PidLidDistributionListStream\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the user-readable display name for the email address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1DisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8080, \"PidLidEmail1DisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the address type of an electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8082, \"PidLidEmail1AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the email address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8083, \"PidLidEmail1EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the SMTP email address that corresponds to the email address for the Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8084, \"PidLidEmail1OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the object corresponding to this electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8085, \"PidLidEmail1OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Returns true when the E-mail is stored in RTF format\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail1RichTextFormat\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8086, \"PidLidEmail1RichTextFormat\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the user-readable display name for the e-mail address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2DisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8090, \"PidLidEmail2DisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the object corresponding to this electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2EntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8091, \"PidLidEmail2EntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the address type of an electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8092, \"PidLidEmail2AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the email address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8093, \"PidLidEmail2EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the SMTP email address that corresponds to the email address for the Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8094, \"PidLidEmail2OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the object corresponding to this electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8095, \"PidLidEmail2OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Returns true when the E-mail is stored in RTF format\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail2RichTextFormat\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8096, \"PidLidEmail2RichTextFormat\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the user-readable display name for the e-mail address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3DisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A0, \"PidLidEmail3DisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the object corresponding to this electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3EntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A1, \"PidLidEmail3EntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the address type of an electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A2, \"PidLidEmail3AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the email address of the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A3, \"PidLidEmail3EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the SMTP email address that corresponds to the email address for the Contact\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A4, \"PidLidEmail3OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the EntryID of the object corresponding to this electronic address.\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A5, \"PidLidEmail3OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Returns true when the E-mail is stored in RTF format\n    /// </summary>\n    public static NamedPropertyTag PidLidEmail3RichTextFormat\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80A6, \"PidLidEmail3RichTextFormat\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the string value \"FAX\".\n    /// </summary>\n    public static NamedPropertyTag PidLidFax1AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80B2, \"PidLidFax1AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a user-readable display name, followed by the \"@\" character, followed by a\n    ///     fax number.\n    /// </summary>\n    public static NamedPropertyTag PidLidFax1EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80B3, \"PidLidFax1EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the same value as PidTagNormalizedSubject (section 2.907).\n    /// </summary>\n    public static NamedPropertyTag PidLidFax1OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80B4, \"PidLidFax1OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a one-off EntryId corresponding to this fax address.\n    /// </summary>\n    public static NamedPropertyTag PidLidFax1OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80B5, \"PidLidFax1OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the string value \"FAX\".\n    /// </summary>\n    public static NamedPropertyTag PidLidFax2AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80C2, \"PidLidFax2AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a user-readable display name, followed by the \"@\" character, followed by a\n    ///     fax number.\n    /// </summary>\n    public static NamedPropertyTag PidLidFax2EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80C3, \"PidLidFax2EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the same value as PidTagNormalizedSubject (section 2.907).\n    /// </summary>\n    public static NamedPropertyTag PidLidFax2OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80C4, \"PidLidFax2OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a one-off EntryId corresponding to this fax address.\n    /// </summary>\n    public static NamedPropertyTag PidLidFax2OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80C5, \"PidLidFax2OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the string value \"FAX\".\n    /// </summary>\n    public static NamedPropertyTag PidLidFax3AddressType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80D2, \"PidLidFax3AddressType\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a user-readable display name, followed by the \"@\" character, followed by a\n    ///     fax number. \n    /// </summary>\n    public static NamedPropertyTag PidLidFax3EmailAddress\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80D3, \"PidLidFax3EmailAddress\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the same value as PidTagNormalizedSubject (section 2.907).\n    /// </summary>\n    public static NamedPropertyTag PidLidFax3OriginalDisplayName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80D4, \"PidLidFax3OriginalDisplayName\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a one-off EntryId corresponding to this fax address.\n    /// </summary>\n    public static NamedPropertyTag PidLidFax3OriginalEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80D5, \"PidLidFax3OriginalEntryId\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a URL path from which a client can retrieve free/busy status information\n    ///     for the contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidFreeBusyLocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80D8, \"PidLidFreeBusyLocation\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the country code portion of the contact's home address.\n    /// </summary>\n    public static NamedPropertyTag PidLidHomeAddressCountryCode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DA, \"PidLidHomeAddressCountryCode\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the country code portion of the contact's work address.\n    /// </summary>\n    public static NamedPropertyTag PidLidWorkAddressCountryCode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DB, \"PidLidWorkAddressCountryCode\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the country code portion of the contact's other address.\n    /// </summary>\n    public static NamedPropertyTag PidLidOtherAddressCountryCode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DC, \"PidLidOtherAddressCountryCode\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the birthday of a contact.\n    /// </summary>\n    public static NamedPropertyTag PidLidBirthdayLocal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DE, \"PidLidBirthdayLocal\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the country code portion of the contact's mailing address.\n    /// </summary>\n    public static NamedPropertyTag PidLidAddressCountryCode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DD, \"PidLidAddressCountryCode\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the wedding anniversary of the contact, at 0:00 in the client's local time\n    ///     zone and it is saved without any time zone conversions.\n    /// </summary>\n    public static NamedPropertyTag PidLidWeddingAnniversaryLocal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x80DF, \"PidLidWeddingAnniversaryLocal\",\n                new Guid(\"00062004-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the status of a task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8101, \"PidLidTaskStatus\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether a time-flagged Message object is completed or not.\n    /// </summary>\n    public static NamedPropertyTag PidLidPercentComplete\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8102, \"PidLidPercentComplete\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_DOUBLE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies if the task is for a team\n    /// </summary>\n    public static NamedPropertyTag PidLidTeamTask\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8103, \"PidLidTeamTask\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the date on which the user expects work on the task to begin.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskStartDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8104, \"PidLidTaskStartDate\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the date by which the user expects work on the task to be complete.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskDueDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8105, \"PidLidTaskDueDate\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether future instances of recurring tasks need reminders, even though\n    ///     <see cref=\"PidLidReminderSet\" />(section 2.220) is 0x00.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskResetReminder\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8107, \"PidLidTaskResetReminder\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether a task assignee has replied to a task request for this Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskAccepted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8108, \"PidLidTaskAccepted\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether new occurrences remain to be generated.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskDeadOccurrence\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8109, \"PidLidTaskDeadOccurrence\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the date when the user completed work on the task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskDateCompleted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x810F, \"PidLidTaskDateCompleted\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the number of minutes that the user actually spent working on a task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskActualEffort\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8110, \"PidLidTaskActualEffort\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the number of minutes that the user expects to work on a task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskEstimatedEffort\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8111, \"PidLidTaskEstimatedEffort\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates which copy is the latest update of a Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskVersion\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8112, \"PidLidTaskVersion\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the current assignment state of the Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskState\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8113, \"PidLidTaskState\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the date and time of the most recent change made to the Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskLastUpdate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8115, \"PidLidTaskLastUpdate\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a RecurrencePattern structure that provides information about recurring\n    ///     tasks.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskRecurrence\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8116, \"PidLidTaskRecurrence\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///      Contains a stack of entries, each representing a task assigner.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskAssigners\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8117, \"PidLidTaskAssigners\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether the task assignee has been requested to send an e-mail message\n    ///     update when the task assignee completes the assigned task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskStatusOnComplete\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8119, \"PidLidTaskStatusOnComplete\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the type of change that was last made to the Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskHistory\n    {\n        get\n        {\n            return new NamedPropertyTag(0x811A, \"PidLidTaskHistory\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether the task assignee has been requested to send a task update when\n    ///     the assigned Task object changes.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskUpdates\n    {\n        get\n        {\n            return new NamedPropertyTag(0x811B, \"PidLidTaskUpdates\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates that the task has been completed.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskComplete\n    {\n        get\n        {\n            return new NamedPropertyTag(0x811C, \"PidLidTaskComplete\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates that the Task object was originally created by the action of the current user\n    ///     or user agent instead of by the processing of a task request.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskFCreator\n    {\n        get\n        {\n            return new NamedPropertyTag(0x811E, \"PidLidTaskFCreator\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the name of the task owner.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskOwner\n    {\n        get\n        {\n            return new NamedPropertyTag(0x811F, \"PidLidTaskOwner\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Provides optimization hints about the recipients of a Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskMultipleRecipients\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8120, \"PidLidTaskMultipleRecipients\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the name of the user that last assigned the task.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskAssigner\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8121, \"PidLidTaskAssigner\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the name of the most recent user to have been the task owner.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskLastUser\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8122, \"PidLidTaskLastUser\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Provides an aid to custom sorting of Task objects\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskOrdinal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8123, \"PidLidTaskOrdinal\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Not used. The client can set this property, but it has no impact on the Task-Related\n    ///     Objects protocol and is ignored by the server.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskNoCompute\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8124, \"PidLidTaskNoCompute\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the name of the user who most recently assigned the task, or the user to\n    ///     whom it was most recently assigned.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskLastDelegate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8125, \"PidLidTaskLastDelegate\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the task includes a recurrence pattern.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskFRecurring\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8126, \"PidLidTaskFRecurring\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Not used. The client can set this property, but it has no impact on the Task-Related\n    ///     Objects protocol and is ignored by the server.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskRole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8127, \"PidLidTaskRole\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the role of the current user relative to the Task object.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskOwnership\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8129, \"PidLidTaskOwnership\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     The acceptance state of the task\n    /// </summary>\n    public static NamedPropertyTag PidLidAcceptanceState\n    {\n        get\n        {\n            return new NamedPropertyTag(0x812A, \"PidLidAcceptanceState\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the accuracy of PidLidTaskOwner (section 2.326).\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskFFixOffline\n    {\n        get\n        {\n            return new NamedPropertyTag(0x812C, \"PidLidTaskFFixOffline\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     The client can set this property, but it has no impact on the Task-Related Objects\n    ///     protocol and is ignored by the server.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskCustomFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8139, \"PidLidTaskCustomFlags\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     The client can set this property, but it has no impact on the Task-Related Objects\n    ///     protocol and is ignored by the server.\n    /// </summary>\n    public static NamedPropertyTag PidLidTaskMode\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8518, \"PidLidTaskMode\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Determines the sort order of objects in a consolidated to-do list\n    /// </summary>\n    public static NamedPropertyTag PidLidToDoOrdinalDate \n    {\n        get\n        {\n            return new NamedPropertyTag(0x85A0, \"PidLidToDoOrdinalDate\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Acts as a tiebreaker when the dispidToDoOrdinalDate (PidLidToDoOrdinalDate) property sorts objects and the result in a tie\n    /// </summary>\n    public static NamedPropertyTag PidLidToDoSubOrdinal \n    {\n        get\n        {\n            return new NamedPropertyTag(0x85A0, \"PidLidToDoSubOrdinal\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Represents the start date and time of a message.\n    /// </summary>\n    public static NamedPropertyTag PidLidCommonStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8516, \"PidLidCommonStart\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Represents the end date and time of a message.\n    /// </summary>\n    public static NamedPropertyTag PidLidCommonEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8517, \"PidLidCommonEnd\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidTrustRecipientHighlights\n    {\n        get\n        {\n            return new NamedPropertyTag(0x823E, \"PidLidTrustRecipientHighlights\",\n                new Guid(\"00062003-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidSendMeetingAsIcal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8200, \"PidLidSendMeetingAsIcal\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the sequence number of a Meeting object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentSequence\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8201, \"PidLidAppointmentSequence\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the date and time at which the property PidLidAppointmentSequence\n    ///     (section 2.25) was last modified.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentSequenceTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8202, \"PidLidAppointmentSequence\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates to the organizer the last sequence number that was sent to any attendee.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentLastSequence\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8203, \"PidLidAppointmentSequence\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a bit field that indicates how the Meeting object has changed.\n    /// </summary>\n    public static NamedPropertyTag PidLidChangeHighlight\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8204, \"PidLidChangeHighlight\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the availability of a user for the event described by the object.\n    /// </summary>\n    public static NamedPropertyTag PidLidBusyStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8205, \"PidLidBusyStatus\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates that the Exception Embedded Message object has a body that differs from the\n    ///     Recurring Calendar object.\n    /// </summary>\n    public static NamedPropertyTag PidLidFExceptionalBody\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8206, \"PidLidFExceptionalBody\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a bit field that describes the auxiliary state of the object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentAuxiliaryFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8207, \"PidLidAppointmentAuxiliaryFlags\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether the value of the <see cref=\"PidLidLocation\"/> property (section 2.159) is set to\n    ///     the PidTagDisplayName property(section 2.667).\n    /// </summary>\n    public static NamedPropertyTag PidLidLocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8208, \"PidLidLocation\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the URL of the Meeting Workspace that is associated with a Calendar object.\n    /// </summary>\n    public static NamedPropertyTag PidLidMeetingWorkspaceUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8209, \"PidLidMeetingWorkspaceUrl\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the Meeting Request object represents an exception to a recurring\n    ///     series, and whether it was forwarded(even when forwarded by the organizer) rather than being an\n    ///     invitation sent by the organizer.\n    /// </summary>\n    public static NamedPropertyTag PidLidForwardInstance\n    {\n        get\n        {\n            return new NamedPropertyTag(0x820A, \"PidLidForwardInstance\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the user did not include any text in the body of the Meeting Response\n    ///     object.\n    /// </summary>\n    public static NamedPropertyTag PidLidLinkedTaskItems\n    {\n        get\n        {\n            return new NamedPropertyTag(0x820C, \"PidLidLinkedTaskItems\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_MV_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies time zone information that indicates the time zone of the\n    ///     <see cref=\"PidLidAppointmentStartWhole\"/> property(section 2.29).\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentStartWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x820D, \"PidLidAppointmentStartWhole\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies time zone information that indicates the time zone of the\n    ///     <see cref=\"PidLidAppointmentEndWhole\"/> property(section 2.14).\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentEndWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x820E, \"PidLidAppointmentEndWhole\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Identifies the time that the appointment starts.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentStartTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x820F, \"PidLidAppointmentStartTime\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the time that the appointment ends.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentEndTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8210, \"PidLidAppointmentEndTime\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the date that the appointment ends.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentEndDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8211, \"PidLidAppointmentEndDate\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the date that the appointment starts.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentStartDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8212, \"PidLidAppointmentStartDate\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the length of the event, in minutes.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentDuration\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8213, \"PidLidAppointmentDuration\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the color to be used when displaying the Calendar object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentColor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8214, \"PidLidAppointmentColor\",\n                new Guid(\"00062002 -0000-0000-C000-000000\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the event is an all-day event.\n    /// </summary>\n    /// <remarks>\n    ///     This property specifies whether or not the event is an all-day event, as \n    ///     specified by the user. A value of <c>true</c> indicates that the event is an all-day \n    ///     event, in which case the start time and end time must be midnight so that the \n    ///     duration is a multiple of 24 hours and is at least 24 hours. A value of <c>false</c> \n    ///     or the absence of this property indicates the event is not an all-day event. The \n    ///     client or server must not infer the value as TRUE when a user happens to create an \n    ///     event that is 24 hours, even if the event starts and ends at midnight.\n    /// </remarks>\n    public static NamedPropertyTag PidLidAppointmentSubType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8215, \"PidLidAppointmentSubType\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the CalendarType field from the PidLidAppointmentRecur\n    ///     property(section 2.22).\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentRecur\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8216, \"PidLidAppointmentRecur\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"),\n                PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies a bit field that describes the state of the object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentStateFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8217, \"PidLidAppointmentStateFlags\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the response status of an attendee.\n    /// </summary>\n    public static NamedPropertyTag PidLidResponseStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8218, \"PidLidResponseStatus\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"),\n                PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the date and time at which the attendee responded to a received meeting\n    ///     request or Meeting Update object.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentReplyTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8220, \"PidLidAppointmentReplyTime\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the object represents a recurring series.\n    /// </summary>\n    public static NamedPropertyTag PidLidRecurring\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8223, \"PidLidRecurring\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidLidBusyStatus property (section 2.47) on the Meeting\n    ///     object in the organizer's calendar at the time the Meeting Request object or Meeting \n    ///     Update object was sent.\n    /// </summary>\n    public static NamedPropertyTag PidLidIntendedBusyStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8224, \"PidLidIntendedBusyStatus\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the time at which the appointment was last updated.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentUpdateTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8226, \"PidLidAppointmentUpdateTime\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the date and time, in UTC, within a recurrence pattern that an exception will\n    ///     replace.\n    /// </summary>\n    public static NamedPropertyTag PidLidExceptionReplaceTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8228, \"PidLidExceptionReplaceTime\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether invitations have been sent for the meeting that this Meeting object\n    ///     represents.\n    /// </summary>\n    public static NamedPropertyTag PidLidFInvited\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8229, \"PidLidFInvited\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates that the object is a Recurring Calendar object with one or more\n    ///     exceptions, and at least one of the Exception Embedded Message objects has at least \n    ///     one RecipientRow.\n    /// </summary>\n    public static NamedPropertyTag PidLidFExceptionalAttendees\n    {\n        get\n        {\n            return new NamedPropertyTag(0x822B, \"PidLidFExceptionalAttendees\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the name of the owner of the mailbox.\n    /// </summary>\n    public static NamedPropertyTag PidLidOwnerName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x822E, \"PidLidOwnerName\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the Calendar folder from which the meeting was opened is\n    ///     another user's calendar.\n    /// </summary>\n    public static NamedPropertyTag PidLidFOthersAppointment\n    {\n        get\n        {\n            return new NamedPropertyTag(0x822F, \"PidLidFOthersAppointment\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the user who last replied to the meeting request or meeting update.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentReplyName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8230, \"PidLidAppointmentReplyName\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the recurrence type of the recurring series.\n    /// </summary>\n    public static NamedPropertyTag PidLidRecurrenceType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8231, \"PidLidRecurrenceType\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies a description of the recurrence pattern of the Calendar object.\n    /// </summary>\n    public static NamedPropertyTag PidLidRecurrencePattern\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8232, \"PidLidRecurrencePattern\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a human-readable description of the time zone that is represented by the\n    ///     data in the <see cref=\"PidLidTimeZoneStruct\"/> property(section 2.340).\n    /// </summary>\n    public static NamedPropertyTag PidLidTimeZoneStruct\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8233, \"PidLidTimeZoneStruct\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a human-readable description of the time zone that is represented by the\n    ///     data in the PidLidTimeZoneStruct property(section 2.340).\n    /// </summary>\n    public static NamedPropertyTag PidLidTimeZoneDescription\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8234, \"PidLidTimeZoneDescription\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the start date and time of the event in UTC.\n    /// </summary>\n    public static NamedPropertyTag PidLidClipStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8235, \"PidLidClipStart\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the end date and time of the event in UTC.\n    /// </summary>\n    public static NamedPropertyTag PidLidClipEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8236, \"PidLidClipEnd\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     The original store id\n    /// </summary>\n    public static NamedPropertyTag PidLidOriginalStoreEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8237, \"PidLidOriginalStoreEntryId\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies a list of all the attendees except for the organizer, including resources and\n    ///     unsendable attendees.\n    /// </summary>\n    public static NamedPropertyTag PidLidAllAttendeesString\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8238, \"PidLidAllAttendeesString\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the value of the <see cref=\"PidLidLocation\"/> property (section 2.157) \n    ///     is set to the <see cref=\"PropertyTags.PR_DISPLAY_NAME_W\"/> property(section 2.746)\n    /// </summary>\n    public static NamedPropertyTag PidLidAutoFillLocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x823A, \"PidLidAutoFillLocation\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Contains a list of all the sendable attendees who are also required attendees.\n    /// </summary>\n    public static NamedPropertyTag PidLidToAttendeesString\n    {\n        get\n        {\n            return new NamedPropertyTag(0x823B, \"PidLidToAttendeesString\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains a list of all the sendable attendees who are also optional attendees.\n    /// </summary>\n    public static NamedPropertyTag PidLidCcAttendeesString\n    {\n        get\n        {\n            return new NamedPropertyTag(0x823C, \"PidLidCcAttendeesString\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     When set to TRUE (0x00000001), the PidLidConferencingCheck property ([MS-OXPROPS] section 2.65) \n    ///     indicates that the associated meeting is one of the following types:\n    ///     -   \"Windows Media Services\"\n    ///     -   \"Windows NetMeeting\"\n    ///     -   \"Exchange Conferencing\"\n    ///\n    ///     If this property is set, <see cref=\"PidLidConferencingType\"/> (section 2.2.1.51.3) is also to \n    ///     be set. This property is set to TRUE only on Meeting objects or meeting-related objects.\n    /// </summary>\n    public static NamedPropertyTag PidLidConferencingCheck\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8240, \"PidLidConferencingCheck\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the type of the meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidConferencingType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8241, \"PidLidConferencingType\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the directory server to be used with NetMeeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidDirectory\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8242, \"PidLidDirectory\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the e-mail address of the organizer.\n    /// </summary>\n    public static NamedPropertyTag PidLidOrganizerAlias\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8243, \"PidLidOrganizerAlias\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether or not to automatically start the conferencing application when a\n    ///     reminder for the meeting fires.\n    /// </summary>\n    public static NamedPropertyTag PidLidAutoStartCheck\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8244, \"PidLidAutoStartCheck\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidAutoStartWhen\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8245, \"PidLidAutoStartWhen\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     This property is set to TRUE\n    /// </summary>\n    public static NamedPropertyTag PidLidAllowExternalCheck\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8246, \"PidLidAllowExternalCheck\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the document to be launched when the user joins the meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidCollaborateDoc\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8247, \"PidLidCollaborateDoc\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the URL to be launched when the user joins the meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidNetShowUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8248, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the password for a meeting on which the <see cref=\"PidLidConferencingType\"/> property\n    ///     (section 2.66) has the value 0x00000002.\n    /// </summary>\n    public static NamedPropertyTag PidLidOnlinePassword\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8249, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the proposed value for the <see cref=\"PidLidAppointmentStartWhole\"/> \n    ///     property (section 2.29) for a counter proposal.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentProposedStartWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8250, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the proposed value for the <see cref=\"PidLidAppointmentEndWhole\"/> property (section 2.14) \n    ///     for a counter proposal.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentProposedEndWhole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8251, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the proposed value for the <see cref=\"PidLidAppointmentDuration\"/> property (section 2.11) \n    ///     for a counter proposal.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentProposedDuration\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8256, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether a Meeting Response object is a counter proposal.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentCounterProposal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8257, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the number of attendees who have sent counter proposals that have not been\n    ///     accepted or rejected by the organizer.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentProposalNumber\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8259, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether attendees are not allowed to propose a new date and/or time for the\n    ///     meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentNotAllowPropose\n    {\n        get\n        {\n            return new NamedPropertyTag(0x825A, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a list of unsendable attendees.\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentUnsendableRecipients\n    {\n        get\n        {\n            return new NamedPropertyTag(0x825D, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies time zone information that indicates the time zone of the\n    ///     <see cref=\"PidLidAppointmentStartWhole\"/> property(section 2.29).\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentTimeZoneDefinitionStartDisplay\n    {\n        get\n        {\n            return new NamedPropertyTag(0x825E, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentTimeZoneDefinitionEndDisplay\n    {\n        get\n        {\n            return new NamedPropertyTag(0x825F, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies time zone information that indicates the time zone of the\n    ///     <see cref=\"PidLidAppointmentEndWhole\"/> property(section 2.14).\n    /// </summary>\n    public static NamedPropertyTag PidLidAppointmentTimeZoneDefinitionRecur\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8260, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a list of <see cref=\"RecipientRow\"/> structures, as described in [MS-OXCDATA] section 2.8.3,\n    ///     that indicate the <see cref=\"Recipients\"/> of a meeting forward.\n    /// </summary>\n    public static NamedPropertyTag PidLidForwardNotificationRecipients\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8261, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the contents of the iCalendar MIME part of the original MIME message.\n    /// </summary>\n    public static NamedPropertyTag PidLidInboundICalStream\n    {\n        get\n        {\n            return new NamedPropertyTag(0x827A, \"\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the interval, in minutes, between the time at which the reminder first\n    ///     becomes overdue and the start time of the Calendar object.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderDelta\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8501, \"PidLidReminderDelta\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the filename of the sound that a client is to play when the reminder for that\n    ///     object becomes overdue.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderFileParameter\n    {\n        get\n        {\n            return new NamedPropertyTag(0x851F, \"PidLidReminderFileParameter\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the client is to respect the values PidLidReminderPlaySound (section\n    ///     2.219) and <see cref=\"PidLidReminderFileParameter\" /> (section 2.217), or use the default \n    ///     values for those properties.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderOverride\n    {\n        get\n        {\n            return new NamedPropertyTag(0x851C, \"PidLidReminderOverride\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the client is to play a sound when the reminder becomes overdue.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderPlaySound\n    {\n        get\n        {\n            return new NamedPropertyTag(0x851E, \"PidLidReminderPlaySound\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n        /// <summary>\n        ///     Specifies whether a reminder is set on the object.\n        /// </summary>\n        public static NamedPropertyTag PidLidReminderSet\n        {\n            get { return new NamedPropertyTag(0x8503, \"PidLidReminderSet\",\n                    new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN); }\n        }\n\n    /// <summary>\n    ///      Specifies the point in time when a reminder transitions from pending to overdue.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderSignalTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8560, \"PidLidReminderSignalTime\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the initial signal time for non-Calendar objects.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8502, \"PidLidReminderTime\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the time and date of the reminder for the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderTimeDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8505, \"PidLidReminderTimeDate\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the time of the reminder for the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderTimeTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8504, \"PidLidReminderTimeTime\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      This property is not set and if set, is ignored.\n    /// </summary>\n    public static NamedPropertyTag PidLidReminderType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x851D, \"PidLidReminderType\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidSingleBodyIcal\n    {\n        get\n        {\n            return new NamedPropertyTag(0x827B, \"PidLidSingleBodyIcal\",\n                new Guid(\"00062002-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///      Identifies the day of the month for the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidDayOfMonth\n    {\n        get\n        {\n            return new NamedPropertyTag(0x1000, \"PidLidDayOfMonth\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the contact’s business web page URL.\n    /// </summary>\n    public static NamedPropertyTag PidLidICalendarDayOfWeekMask\n    {\n        get\n        {\n            return new NamedPropertyTag(0x1001, \"PidLidICalendarDayOfWeekMask\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the number of occurrences in the recurring appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidOccurrences\n    {\n        get\n        {\n            return new NamedPropertyTag(0x1005, \"PidLidOccurrences\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the number of occurrences in the recurring appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidMonthOfYear\n    {\n        get\n        {\n            return new NamedPropertyTag(0x1006, \"PidLidMonthOfYear\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates whether the recurrence pattern has an end date.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoEndDateFlag\n    {\n        get\n        {\n            return new NamedPropertyTag(0x100B, \"PidLidNoEndDateFlag\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the length, in minutes, of the appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidLidRecurrenceDuration\n    {\n        get\n        {\n            return new NamedPropertyTag(0x100D, \"PidLidRecurrenceDuration\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the remote status of the calendar item.\n    /// </summary>\n    public static NamedPropertyTag PidLidRemoteStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8511, \"PidLidRemoteStatus\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the entry ID for the destination folder.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationActionMoveFolderEid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85C6, \"PidLidConversationActionMoveFolderEid\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the entry ID for a move to a folder in a different store.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationActionMoveStoreEid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85C7, \"PidLidConversationActionMoveStoreEid\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the maximum value of <see cref=\"PropertyTags.PR_MESSAGE_DELIVERY_TIME\"/> (section 2.886) of all the\n    ///     E-mail objects modified in response to the last time the user changed a conversation action on the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationActionMaxDeliveryTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85C8, \"PidLidConversationActionMaxDeliveryTime\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the time (in UTC) that an E-mail object was last received in the\n    ///     conversation, or the last time that the user modified the conversation action, whichever occurs\n    ///     later.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationProcessed\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85C9, \"PidLidConversationProcessed\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the time (in UTC) that an E-mail object was last received in the\n    ///     conversation, or the last time that the user modified the conversation action, whichever occurs\n    ///     later.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationActionLastAppliedTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85CA, \"PidLidConversationActionLastAppliedTime\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the version of the conversation action FAI message.\n    /// </summary>\n    public static NamedPropertyTag PidLidConversationActionVersion\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85CB, \"PidLidConversationActionVersion\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Briefly describes the activity that is being recorded.\n    /// </summary>\n    public static NamedPropertyTag PidLidLogType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8700, \"PidLidLogType\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the time at which the activity began.\n    /// </summary>\n    public static NamedPropertyTag PidLidLogStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8706, \"PidLidLogStart\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the duration in minutes of the activity.\n    /// </summary>\n    public static NamedPropertyTag PidLidLogDuration\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8707, \"PidLidLogDuration\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidLogEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8708, \"PidLidLogEnd\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the time at which the activity ended.\n    /// </summary>\n    public static NamedPropertyTag PidLidLogFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x870C, \"PidLidLogFlags\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the document was printed during journaling.\n    /// </summary>\n    public static NamedPropertyTag PidLidDocumentPrinted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x870E, \"PidLidDocumentPrinted\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the document was saved during journaling.\n    /// </summary>\n    public static NamedPropertyTag PidLidDocumentSaved\n    {\n        get\n        {\n            return new NamedPropertyTag(0x870F, \"PidLidDocumentSaved\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the document was routed during journaling.\n    /// </summary>\n    public static NamedPropertyTag PidLidDocumentRouted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8710, \"PidLidDocumentRouted\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the document was posted during journaling.\n    /// </summary>\n    public static NamedPropertyTag PidLidDocumentPosted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8711, \"PidLidDocumentPosted\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Describes the activity that is being recorded.\n    /// </summary>\n    public static NamedPropertyTag PidLidLogTypeDesc\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8712, \"PidLidLogTypeDesc\",\n                new Guid(\"0006200A-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the URL of the RSS or Atom feed that the XML file came from.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssChannelLink\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8900, \"PidLidPostRssChannelLink\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the URL of the link from the item.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssItemLink\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8901, \"PidLidPostRssItemLink\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a hash of the feed XML computed by using an implementation-dependent\n    ///     algorithm.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssItemHash\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8902, \"PidLidPostRssItemHash\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a unique identifier for the RSS object.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssItemGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8903, \"PidLidPostRssItemGuid\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the contents of the title field from the XML of the Atom feed or RSS channel.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssChannel\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8904, \"PidLidPostRssChannel\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the item element and all its sub-elements from an RSS feed, or the entry\n    ///     element and all its sub-elements from an Atom feed.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssItemXml\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8905, \"PidLidPostRssItemXml\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the user's preferred name for the subscription.\n    /// </summary>\n    public static NamedPropertyTag PidLidPostRssSubscription\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8906, \"PidLidPostRssSubscription\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n\n    /// <summary>\n    ///     Indicates whether the end-user wants this message object hidden from other users who have access to the message object.\n    /// </summary>\n    public static NamedPropertyTag PidLidPrivate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8506, \"PidLidPrivate\",\n                new Guid(\"00062041-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A00, \"PidLidSharingStatus\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the value \"%xAE.F0.06.00.00.00.00.00.C0.00.00.00.00.00.00.46\".\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingProviderGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A01, \"PidLidSharingProviderGuid\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a user-displayable name of the sharing provider identified by the\n    ///     <see cref=\"PidLidSharingProviderGuid\"/> property(section 2.266).\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingProviderName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A02, \"PidLidSharingProviderName\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a URL related to the sharing provider identified by the\n    ///     <see cref=\"PidLidSharingProviderGuid\"/> property(section 2.266).\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingProviderUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A03, \"PidLidSharingProviderUrl\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemotePath\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A04, \"PidLidSharingRemotePath\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the PidLidSharingRemoteName property (section 2.277).\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A05, \"PidLidSharingRemoteName\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the EntryID of the folder being shared. \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A06, \"PidLidSharingRemoteUid\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidTagDisplayName property(section 2.667) from the\n    ///     Address Book object identified by the <see cref=\"PidLidSharingInitiatorEntryId\"/>\n    ///     property(section 2.248).\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingInitiatorName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A07, \"PidLidSharingInitiatorName\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidTagSmtpAddress property (section 2.1010) from the\n    ///     Address Book object identified by the <see cref=\"PidLidSharingInitiatorEntryId\"/>\n    ///     property(section 2.248).   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingInitiatorSmtp\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A08, \"PidLidSharingInitiatorSmtp\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the value of the PidTagEntryId property (section 2.674) for \n    ///     the Address Book object of the currently logged-on user.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingInitiatorEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A09, \"PidLidSharingInitiatorEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0A, \"PidLidSharingFlags\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingProviderExtension\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0B, \"PidLidSharingProviderExtension\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteUser\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0C, \"PidLidSharingRemoteUser\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemotePass\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0D, \"PidLidSharingRemotePass\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client. \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalPath\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0E, \"PidLidSharingLocalPath\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A0F, \"PidLidSharingLocalName\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.     \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A10, \"PidLidSharingLocalUid\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingFilter\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A13, \"PidLidSharingFilter\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client. \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A14, \"PidLidSharingLocalType\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingFolderEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A15, \"PidLidSharingFolderEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingCapabilities\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A17, \"PidLidSharingCapabilities\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingFlavor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A18, \"PidLidSharingFlavor\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingAnonymity\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A19, \"PidLidSharingAnonymity\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingReciprocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1A, \"PidLidSharingReciprocation\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingPermissions\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1B, \"PidLidSharingPermissions\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingInstanceGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1C, \"PidLidSharingInstanceGuid\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1D, \"PidLidSharingRemoteType\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingParticipants\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1E, \"PidLidSharingParticipants\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLastSyncTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A1F, \"PidLidSharingLastSyncTime\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingExtensionXml\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A21, \"PidLidSharingExtensionXml\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteLastModificationTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A22, \"PidLidSharingRemoteLastModificationTime\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalLastModificationTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A23, \"PidLidSharingLocalLastModificationTime\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Contains a zero-length string.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingConfigurationUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A24, \"PidLidSharingConfigurationUrl\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A25, \"PidLidSharingStart\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingStop\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A26, \"PidLidSharingStop\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.     \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingResponseType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A27, \"PidLidSharingResponseType\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the time at which the recipient of the sharing request sent a sharing response.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingResponseTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A28, \"PidLidSharingResponseTime\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingOriginalMessageEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A29, \"PidLidSharingOriginalMessageEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.     \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingSyncInterval\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2A, \"PidLidSharingSyncInterval\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingDetail\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2B, \"PidLidSharingDetail\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingTimeToLive\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2C, \"PidLidSharingTimeToLive\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingBindingEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2D, \"PidLidSharingBindingEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingIndexEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2E, \"PidLidSharingIndexEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteComment\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A2F, \"PidLidSharingRemoteComment\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingWorkingHoursStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A40, \"PidLidSharingWorkingHoursStart\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.   \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingWorkingHoursEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A41, \"PidLidSharingWorkingHoursEnd\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.      \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingWorkingHoursDays\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A42, \"PidLidSharingWorkingHoursDays\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingWorkingHoursTimeZone\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A43, \"PidLidSharingWorkingHoursTimeZone\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.     \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingDataRangeStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A44, \"PidLidSharingDataRangeStart\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.    \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingDataRangeEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A45, \"PidLidSharingDataRangeEnd\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRangeStart\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A46, \"PidLidSharingRangeStart\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRangeEnd\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A47, \"PidLidSharingRangeEnd\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a hexadecimal string representation of the value of the PidTagStoreEntryId\n    ///     property(section 2.1018) on the folder being shared.\n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteStoreUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A48, \"PidLidSharingRemoteStoreUid\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalStoreUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A49, \"PidLidSharingLocalStoreUid\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteByteSize\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A4B, \"PidLidSharingRemoteByteSize\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteCrc\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A4C, \"PidLidSharingRemoteCrc\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLocalComment\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A4D, \"PidLidSharingLocalComment\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRoamLog\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A4E, \"PidLidSharingRoamLog\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteMessageCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A4F, \"PidLidSharingRemoteMessageCount\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingBrowseUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A51, \"PidLidSharingBrowseUrl\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.  \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingLastAutoSyncTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A55, \"PidLidSharingLastAutoSyncTime\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.      \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingTimeToLiveAuto\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A56, \"PidLidSharingTimeToLiveAuto\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.       \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingRemoteVersion\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A5B, \"PidLidSharingRemoteVersion\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.      \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingParentBindingEntryId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A5C, \"PidLidSharingParentBindingEntryId\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.      \n    /// </summary>\n    public static NamedPropertyTag PidLidSharingSyncFlags\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8A60, \"PidLidSharingSyncFlags\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the suggested background color of the Note object.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoteColor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8B00, \"PidLidNoteColor\",\n                new Guid(\"0006200E-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the width of the visible message window in pixels.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoteWidth\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8B02, \"PidLidNoteWidth\",\n                new Guid(\"0006200E-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the height of the visible message window in pixels.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoteHeight\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8B03, \"PidLidNoteHeight\",\n                new Guid(\"0006200E-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the distance, in pixels, from the left edge of the screen that a user interface\n    ///     displays a Note object.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoteX\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8B04, \"PidLidNoteX\",\n                new Guid(\"0006200E-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the distance, in pixels, from the top edge of the screen that a user interface\n    ///     displays a Note object.\n    /// </summary>\n    public static NamedPropertyTag PidLidNoteY\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8B05, \"PidLidNoteY\",\n                new Guid(\"0006200E-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the array of text labels assigned to this Message object.\n    /// </summary>\n    public static NamedPropertyTag PidLidCategories\n    {\n        get\n        {\n            return new NamedPropertyTag(0x9000, \"PidLidCategories\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_MV_STRING8);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the application used to open the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameApplicationName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameApplicationName\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the author of the file attached to the Document object\n    /// </summary>\n    public static NamedPropertyTag PidNameAuthor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAuthor\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the size, in bytes, of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameByteCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameByteCount\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the role of the attendee.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarAttendeeRole\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarAttendeeRole\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies whether the attendee is busy at the time of an appointment on their calendar.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarBusyStatus\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarBusyStatus\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Identifies the name of a contact who is an attendee of a meeting.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarContact\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarContact\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Identifies the URL where you can access contact information in HTML format\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarContactUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarContactUrl\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the date and time, in UTC, when the organizer created the appointment or\n    ///     meeting.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarCreated\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarCreated\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the URL of a resource that contains a description of an appointment or\n    ///     meeting.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarDescriptionUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarDescriptionUrl\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Identifies the duration, in seconds, of an appointment or meeting.\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarDuration\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarDuration\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Identifies a list of dates that are exceptions to a recurring appointment\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarExceptionDate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarExceptionDate\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_MV_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies an exception rule for a recurring appointment\n    /// </summary>\n    public static NamedPropertyTag PidNameCalendarExceptionRule\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCalendarExceptionRule\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_MV_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the category of the file attached to the Document object\n    /// </summary>\n    public static NamedPropertyTag PidNameCategory\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCategory\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the character count of the file attached to the Document object\n    /// </summary>\n    public static NamedPropertyTag PidNameCharacterCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCharacterCount\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the comments of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameComments\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameComments\",\n                new Guid(\"00062040-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    /// Specifies the company for which the file was created.\n    /// </summary>\n    public static NamedPropertyTag PidNameCompany\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCompany\",\n                new Guid(\"00062039-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the time, in UTC, that the file was first created.\n    /// </summary>\n    public static NamedPropertyTag PidNameCreateDateTimeReadOnly\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCreateDateTimeReadOnly\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the value used to cache the Use License for the rights-managed email\n    ///     message.\n    /// </summary>\n    public static NamedPropertyTag PidNameRightsManagementLicense\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameRightsManagementLicense\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_MV_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the time that the file was last edited.\n    /// </summary>\n    public static NamedPropertyTag PidNameEditTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameEditTime\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the hidden value of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameHiddenCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameHiddenCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains keywords or categories for the Message object.\n    /// </summary>\n    public static NamedPropertyTag PidNameKeywords\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameKeywords\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_MV_STRING8);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the most recent author of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameLastAuthor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameLastAuthor\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the time, in UTC, that the file was last printed.\n    /// </summary>\n    public static NamedPropertyTag PidNameLastPrinted\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameLastPrinted\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the time, in UTC, that the file was last saved.\n    /// </summary>\n    public static NamedPropertyTag PidNameLastSaveDateTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameLastSaveDateTime\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the number of lines in the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameLineCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameLineCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the manager of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameManager\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameManager\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the number of multimedia clips in the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameMultimediaClipCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameMultimediaClipCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the number of notes in the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameNoteCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameNoteCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the GUID of the SMS account used to deliver the message.\n    /// </summary>\n    public static NamedPropertyTag PidNameOMSAccountGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOMSAccountGuid\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Indicates the model of the mobile device used to send the SMS or MMS message.\n    /// </summary>\n    public static NamedPropertyTag PidNameOMSMobileModel\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOMSMobileModel\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the time, in UTC, at which the client requested that the service provider send\n    ///     the SMS or MMS message. \n    /// </summary>\n    public static NamedPropertyTag PidNameOMSGScheduleTime\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOMSGScheduleTime\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_SYSTIME);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the type of service used to send an SMS or MMS message.\n    /// </summary>\n    public static NamedPropertyTag PidNameOMSServiceType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOMSServiceType\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the source of an SMS or MMS message.\n    /// </summary>\n    public static NamedPropertyTag PidNameOMSSourceType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOMSSourceType\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether a message is likely to be phishing.\n    /// </summary>\n    public static NamedPropertyTag PidNamePhishingStamp\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNamePhishingStamp\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether a message is likely to be spoofing.\n    /// </summary>\n    public static NamedPropertyTag PidNameSpoofingStamp\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameSpoofingStamp\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the page count of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNamePageCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNamePageCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the number of paragraphs in the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameParagraphCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameParagraphCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the presentation format of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNamePresentationFormat\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNamePresentationFormat\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the security level of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameSecurity\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameSecurity\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the number of slides in the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameSlideCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameSlideCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the subject of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameSubject\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameSubject\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the template of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameTemplate\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameTemplate\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Specifies the title of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameTitle\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameTitle\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the word count of the file attached to the Document object.\n    /// </summary>\n    public static NamedPropertyTag PidNameWordCount\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameWordCount\",\n                new Guid(\"00020329-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the value of the MIME Accept-Language header.\n    /// </summary>\n    public static NamedPropertyTag PidNameAcceptLanguage\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAcceptLanguage\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the address of the moderator that approved and posted a message.\n    /// </summary>\n    public static NamedPropertyTag PidNameApproved\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameApproved\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameApprovalAllowedDescisionMakers\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameApprovalAllowedDescisionMakers\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameApprovalRequestor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameApprovalRequestor\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameAuthenticatedAs\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAuthenticatedAs\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameAuthenticatedDomain\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAuthenticatedDomain\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameAuthenticatedMechanism\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAuthenticatedMechanism\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameAuthenticatedSource\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAuthenticatedSource\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the blind carbon copy addressees of the message. This property\n    ///     SHOULD be directly imported from and exported to the bcc header that is specified in\n    ///     [RFC822].\n    /// </summary>\n    public static NamedPropertyTag PidNameBcc\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameBcc\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the carbon copy addressees of the message. This property SHOULD\n    ///     be directly imported from and exported to the cc header that is specified in [RFC822].\n    /// </summary>\n    public static NamedPropertyTag PidNameCc\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCc\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Specifies the value of the MIME Content-Base header, which defines the base URI for\n    ///     resolving relative URLs contained within the message body.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentBase\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentBase\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a string that identifies the type of content of a Message object.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentClass\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentClass\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the intended disposition of the body part.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentDisposition\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentDisposition\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies a unique identifier for the body part.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentID\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentID\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///    This property specifies the language identifier for the text content of the body part. \n    /// </summary>\n    public static NamedPropertyTag PidNameContentLanguage\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentLanguage\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the Uniform Resource Identifier (URI) that corresponds to the content\n    ///     of the body part. \n    /// </summary>\n    public static NamedPropertyTag PidNameContentLocation\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentLocation\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the encoding mechanism used to encode the content of the body part.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentTransferEncoding\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentTransferEncoding\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     This property specifies the type of the body part's content.\n    /// </summary>\n    public static NamedPropertyTag PidNameContentType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameContentType\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidNameCrossReference\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameCrossReference\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingBrowseUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingBrowseUrl\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains a string representation of the value of the <see cref=\"PidLidSharingCapabilities\"/>\n    ///     property(section 2.237).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingCapabilities\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingCapabilities\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingConfigurationUrl\"/> property (section 2.238).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingConfigUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingConfigUrl\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingExtendedCaps\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingExtendedCaps\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a hexadecimal string representation of the value of the PidLidSharingFlavor\n    ///     property(section 2.245).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingFlavor\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingFlavor\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingInstanceGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingInstanceGuid\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingLocalType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingLocalType\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the same value as the PidLidSharingLocalType property (section 2.259).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingProviderGuid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingProviderGuid\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingProviderName\"/> property (section 2.267).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingProviderName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingProviderName\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingProviderUrl\"/> property (section 2.268).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingProviderUrl\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingProviderUrl\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the same value as the <see cref=\"PidLidSharingRemoteName\"/> property (section 2.277).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingRemoteName\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingRemoteName\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains a value that is ignored by the server no matter what value is generated by the\n    ///     client.\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingRemotePath\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingRemotePath\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingRemoteStoreUid\"/> property (section 2.282).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingRemoteStoreUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingRemoteStoreUid\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingRemoteType\"/> property (section 2.281).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingRemoteType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingRemoteType\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the same value as the <see cref=\"PidLidSharingRemoteUid\"/> property (section 2.282).\n    /// </summary>\n    public static NamedPropertyTag PidNameXSharingRemoteUid\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSharingRemoteUid\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameXSieve\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXSieve\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static NamedPropertyTag PidNameXVirusScanned\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXVirusScanned\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates what actions the user has taken on this Meeting object.\n    /// </summary>\n    public static NamedPropertyTag PidLidClientIntent\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0015, \"PidLidClientIntent\",\n                new Guid(\"11000E07-B51B-40D6-AF21-CAA85EDAB1D0\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether the Meeting Request object or Meeting Update object has been \n    ///     processed.\n    /// </summary>\n    public static NamedPropertyTag PidLidServerProcessed\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85CC, \"PidLidServerProcessed\",\n                new Guid(\"11000E07-B51B-40D6-AF21-CAA85EDAB1D0\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidLidServerProcessingActions\n    {\n        get\n        {\n            return new NamedPropertyTag(0x85CD, \"PidLidServerProcessingActions\",\n                new Guid(\"11000E07-B51B-40D6-AF21-CAA85EDAB1D0\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the Content-Type of the Mac attachment.\n    /// </summary>\n    public static NamedPropertyTag PidNameAttachmentMacContentType\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAttachmentMacContentType\",\n                new Guid(\"96357F7F-59E1-47D0-99A7-46515C183B54\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///      Contains the headers and resource fork data associated with the Mac attachment.\n    /// </summary>\n    public static NamedPropertyTag PidNameAttachmentMacInfo\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAttachmentMacInfo\",\n                new Guid(\"96357F7F-59E1-47D0-99A7-46515C183B54\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     \n    /// </summary>\n    public static NamedPropertyTag PidNameAudioNotes\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAudioNotes\",\n                new Guid(\"00020386-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains textual annotations to a voice message after it has been delivered to the user's\n    ///      mailbox.\n    /// </summary>\n    public static NamedPropertyTag PidNameAutomaticSpeechRecognitionData\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameAutomaticSpeechRecognitionData\",\n                new Guid(\"4442858E-A9E3-4E80-B900-317A210CC15B\"), PropertyType.PT_BINARY);\n        }\n    }\n\n    /// <summary>\n    ///     Outlook protection rule timestamp\n    /// </summary>\n    public static NamedPropertyTag PidNameOutlookProtectionRuleTimestamp\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOutlookProtectionRuleTimestamp\",\n                new Guid(\"4442858E-A9E3-4E80-B900-317A210CC15B\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///    X-Unified messaging partner assigned id\n    /// </summary>\n    public static NamedPropertyTag PidNameXUnifiedMessagingPartnerAssignedId\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXUnifiedMessagingPartnerAssignedId\",\n                new Guid(\"4442858E-A9E3-4E80-B900-317A210CC15B\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     X-Unified messaging partner content\n    /// </summary>\n    public static NamedPropertyTag PidNameXUnifiedMessagingPartnerContent\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameXUnifiedMessagingPartnerContent\",\n                new Guid(\"4442858E-A9E3-4E80-B900-317A210CC15B\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     The spam confidence level\n    /// </summary>\n    public static NamedPropertyTag PidNameOriginalSpamConfidenceLevel\n    {\n        get\n        {\n            return new NamedPropertyTag(0x0000, \"PidNameOriginalSpamConfidenceLevel\",\n                new Guid(\"4442858E-A9E3-4E80-B900-317A210CC15B\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates the transfer size, in bytes, for a remote item.\n    /// </summary>\n    public static NamedPropertyTag PidLidRemoteTransferSize\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8F05, \"PidLidRemoteTransferSize\",\n                new Guid(\"00062014-0000-0000-C000-000000000046\"), PropertyType.PT_LONG);\n        }\n    }\n\n    /// <summary>\n    ///     Indicates whether a remote item has an attachment associated with it.\n    /// </summary>\n    public static NamedPropertyTag PidLidRemoteAttachment\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8F07, \"PidLidRemoteAttachment\",\n                new Guid(\"00062014-0000-0000-C000-000000000046\"), PropertyType.PT_BOOLEAN);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the mileage information that is associated with an item.\n    /// </summary>\n    public static NamedPropertyTag PidLidMileage\n    {\n        get\n        {\n            return new NamedPropertyTag(8534, \"PidLidMileage\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n\n    /// <summary>\n    ///     Contains the billing information associated with an item.\n    /// </summary>\n    public static NamedPropertyTag PidLidBilling\n    {\n        get\n        {\n            return new NamedPropertyTag(0x8535, \"PidLidBilling\",\n                new Guid(\"00062008-0000-0000-C000-000000000046\"), PropertyType.PT_UNICODE);\n        }\n    }\n}\n\n/// <summary>\n///     Used to hold exactly one named property tag\n/// </summary>\npublic class NamedPropertyTag\n{\n    #region Properties\n    /// <summary>\n    ///     The 2 byte identifier\n    /// </summary>\n    public ushort Id { get; }\n\n    /// <summary>\n    ///     The name of the property\n    /// </summary>\n    public string Name { get; }\n\n    /// <summary>\n    ///     The <see cref=\"Guid\" />\n    /// </summary>\n    public Guid Guid { get; }\n\n    /// <summary>\n    ///     The 2 byte <see cref=\"PropertyType\" />\n    /// </summary>\n    public PropertyType Type { get; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all its properties\n    /// </summary>\n    /// <param name=\"id\">The id</param>\n    /// <param name=\"name\">The name of the property</param>\n    /// <param name=\"guid\">The property <see cref=\"Guid\" /></param>\n    /// <param name=\"type\">The <see cref=\"PropertyType\" /></param>\n    public NamedPropertyTag(ushort id, string name, Guid guid, PropertyType type)\n    {\n        Id = id;\n        Name = name;\n        Guid = guid;\n        Type = type;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/PropertyTags.cs",
    "content": "﻿// ReSharper disable CommentTypo\n//\n// PropertyTags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Enums;\n\n// ReSharper disable InconsistentNaming\n// ReSharper disable ConvertPropertyToExpressionBody\n// ReSharper disable IdentifierTypo\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class that holds all the known mapi tags\n/// </summary>\npublic static class PropertyTags\n{\n    /// <summary>\n    ///     The prefix for an <see cref=\"Recipient\" /> <see cref=\"OpenMcdf.OpenMcdf.Storage\" />\n    /// </summary>\n    internal const string RecipientStoragePrefix = \"__recip_version1.0_#\";\n\n    /// <summary>\n    ///     The prefix for an <see cref=\"Attachment\" /> <see cref=\"OpenMcdf.OpenMcdf.Storage\" />\n    /// </summary>\n    internal const string AttachmentStoragePrefix = \"__attach_version1.0_#\";\n\n    /// <summary>\n    ///     The prefix for a <see cref=\"PropertyTag\" /> <see cref=\"OpenMcdf.OpenMcdf.CfbStream\" />\n    /// </summary>\n    internal const string SubStorageStreamPrefix = \"__substg1.0_\";\n\n    /// <summary>\n    ///     The name for the properties stream\n    /// </summary>\n    internal const string PropertiesStreamName = \"__properties_version1.0\";\n\n    /// <summary>\n    ///     The name id storage (named property mapping storage)\n    /// </summary>\n    internal const string NameIdStorage = \"__nameid_version1.0\";\n\n    /// <summary>\n    ///     The <see cref=\"Streams.EntryStream\"/> stream\n    /// </summary>\n    internal const string EntryStream = \"__substg1.0_00030102\";\n\n    /// <summary>\n    ///     The <see cref=\"Streams.GuidStream\"/> stream\n    /// </summary>\n    internal const string GuidStream = \"__substg1.0_00020102\";\n\n    /// <summary>\n    ///     The <see cref=\"Streams.StringStream\"/> stream\n    /// </summary>\n    internal const string StringStream = \"__substg1.0_00040102\";\n\n    /// <summary>\n    ///     Contains the identifier of the mode for message acknowledgment.\n    /// </summary>\n    public static PropertyTag PR_ACKNOWLEDGEMENT_MODE\n    {\n        get { return new PropertyTag(0x0001, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the sender permits auto forwarding of this message.\n    /// </summary>\n    public static PropertyTag PR_ALTERNATE_RECIPIENT_ALLOWED\n    {\n        get { return new PropertyTag(0x0002, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a list of entry identifiers for users who have authorized the sending of a message.\n    /// </summary>\n    public static PropertyTag PR_AUTHORIZING_USERS\n    {\n        get { return new PropertyTag(0x0003, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a unicode comment added by the auto-forwarding agent.\n    /// </summary>\n    public static PropertyTag PR_AUTO_FORWARD_COMMENT_W\n    {\n        get { return new PropertyTag(0x0004, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a comment added by the auto-forwarding agent.\n    /// </summary>\n    internal static PropertyTag PR_AUTO_FORWARD_COMMENT_A\n    {\n        get { return new PropertyTag(0x0004, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the client requests an X-MS-Exchange-Organization-AutoForwarded header field.\n    /// </summary>\n    public static PropertyTag PR_AUTO_FORWARDED\n    {\n        get { return new PropertyTag(0x0005, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an identifier for the algorithm used to confirm message content confidentiality.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID\n    {\n        get { return new PropertyTag(0x0006, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a value the message sender can use to match a report with the original message.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_CORRELATOR\n    {\n        get { return new PropertyTag(0x0007, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a unicode key value that enables the message recipient to identify its content.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_IDENTIFIER_W\n    {\n        get { return new PropertyTag(0x0008, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a ANSI key value that enables the message recipient to identify its content.\n    /// </summary>\n    internal static PropertyTag PR_CONTENT_IDENTIFIER_A\n    {\n        get { return new PropertyTag(0x0008, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a message length, in bytes, passed to a client application or service provider to determine if a message\n    ///     of that length can be delivered.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_LENGTH\n    {\n        get { return new PropertyTag(0x0009, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message should be returned with a nondelivery report.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_RETURN_REQUESTED\n    {\n        get { return new PropertyTag(0x000A, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the conversation key used in Microsoft Outlook only when locating IPM.MessageManager messages, such as the\n    ///     message that contains download history for a Post Office Protocol (POP3) account. This property has been deprecated\n    ///     in Exchange Server.\n    /// </summary>\n    public static PropertyTag PR_CONVERSATION_KEY\n    {\n        get { return new PropertyTag(0x000B, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the encoded information types (EITs) that are applied to a message in transit to describe conversions.\n    /// </summary>\n    public static PropertyTag PR_CONVERSION_EITS\n    {\n        get { return new PropertyTag(0x000C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message transfer agent (MTA) is prohibited from making message text conversions that lose\n    ///     information.\n    /// </summary>\n    public static PropertyTag PR_CONVERSION_WITH_LOSS_PROHIBITED\n    {\n        get { return new PropertyTag(0x000D, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an identifier for the types of text in a message after conversion.\n    /// </summary>\n    public static PropertyTag PR_CONVERTED_EITS\n    {\n        get { return new PropertyTag(0x000E, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     \tContains the date and time when a message sender wants a message delivered.\n    /// </summary>\n    public static PropertyTag PR_DEFERRED_DELIVERY_TIME\n    {\n        get { return new PropertyTag(0x000F, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time when the original message was delivered.\n    /// </summary>\n    public static PropertyTag PR_DELIVER_TIME\n    {\n        get { return new PropertyTag(0x0010, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a reason why a message transfer agent (MTA) has discarded a message.\n    /// </summary>\n    public static PropertyTag PR_DISCARD_REASON\n    {\n        get { return new PropertyTag(0x0011, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if disclosure of recipients is allowed.\n    /// </summary>\n    public static PropertyTag PR_DISCLOSURE_OF_RECIPIENTS\n    {\n        get { return new PropertyTag(0x0012, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a history showing how a distribution list has been expanded during message transmiss\n    /// </summary>\n    public static PropertyTag PR_DL_EXPANSION_HISTORY\n    {\n        get { return new PropertyTag(0x0013, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message transfer agent (MTA) is prohibited from expanding distribution lists.\n    /// </summary>\n    public static PropertyTag PR_DL_EXPANSION_PROHIBITED\n    {\n        get { return new PropertyTag(0x0014, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time when the messaging system can invalidate the content of a message.\n    /// </summary>\n    public static PropertyTag PR_EXPIRY_TIME\n    {\n        get { return new PropertyTag(0x0015, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time when the messaging system can invalidate the content of a message.\n    /// </summary>\n    public static PropertyTag PR_IMPLICIT_CONVERSION_PROHIBITED\n    {\n        get { return new PropertyTag(0x0016, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a value that indicates the message sender's opinion of the importance of a message.\n    /// </summary>\n    public static PropertyTag PR_IMPORTANCE\n    {\n        get { return new PropertyTag(0x0017, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     The IpmId field represents a PR_IPM_ID MAPI property.\n    /// </summary>\n    public static PropertyTag PR_IPM_ID\n    {\n        get { return new PropertyTag(0x0018, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the latest date and time when a message transfer agent (MTA) should deliver a message.\n    /// </summary>\n    public static PropertyTag PR_LATEST_DELIVERY_TIME\n    {\n        get { return new PropertyTag(0x0019, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a text string that identifies the sender-defined message class, such as IPM.Note.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_CLASS_W\n    {\n        get { return new PropertyTag(0x001A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a text string that identifies the sender-defined message class, such as IPM.Note.\n    /// </summary>\n    internal static PropertyTag PR_MESSAGE_CLASS_A\n    {\n        get { return new PropertyTag(0x001A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a message transfer system (MTS) identifier for a message delivered to a client application.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_DELIVERY_ID\n    {\n        get { return new PropertyTag(0x001B, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a security label for a message.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_SECURITY_LABEL\n    {\n        get { return new PropertyTag(0x001E, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the identifiers of messages that this message supersedes.\n    /// </summary>\n    public static PropertyTag PR_OBSOLETED_IPMS\n    {\n        get { return new PropertyTag(0x001F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the encoded name of the originally intended recipient of an autoforwarded message.\n    /// </summary>\n    public static PropertyTag PR_ORIGINALLY_INTENDED_RECIPIENT_NAME\n    {\n        get { return new PropertyTag(0x0020, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a copy of the original encoded information types (EITs) for message text.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_EITS\n    {\n        get { return new PropertyTag(0x0021, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 certificate for the message originator.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_CERTIFICATE\n    {\n        get { return new PropertyTag(0x0022, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender requests a delivery report for a particular recipient from the messaging system\n    ///     before the message is placed in the message store.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED\n    {\n        get { return new PropertyTag(0x0023, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the binary-encoded return address of the message originator.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_RETURN_ADDRESS\n    {\n        get { return new PropertyTag(0x0024, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain a value used in correlating conversation threads. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_PARENT_KEY\n    {\n        get { return new PropertyTag(0x0025, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the relative priority of a message.\n    /// </summary>\n    public static PropertyTag PR_PRIORITY\n    {\n        get { return new PropertyTag(0x0026, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a binary verification value enabling a delivery report recipient to verify the origin of the original\n    ///     message.\n    /// </summary>\n    public static PropertyTag PR_ORIGIN_CHECK\n    {\n        get { return new PropertyTag(0x0027, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender requests proof that the message transfer system has submitted a message for\n    ///     delivery to the originally intended recipient.\n    /// </summary>\n    public static PropertyTag PR_PROOF_OF_SUBMISSION_REQUESTED\n    {\n        get { return new PropertyTag(0x0028, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender wants the messaging system to generate a read report when the recipient has read\n    ///     a message.\n    /// </summary>\n    public static PropertyTag PR_READ_RECEIPT_REQUESTED\n    {\n        get { return new PropertyTag(0x0029, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time a delivery report is generated.\n    /// </summary>\n    public static PropertyTag PR_RECEIPT_TIME\n    {\n        get { return new PropertyTag(0x002A, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if recipient reassignment is prohibited.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_REASSIGNMENT_PROHIBITED\n    {\n        get { return new PropertyTag(0x002B, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains information about the route covered by a delivered message.\n    /// </summary>\n    public static PropertyTag PR_REDIRECTION_HISTORY\n    {\n        get { return new PropertyTag(0x002C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of identifiers for messages to which a message is related.\n    /// </summary>\n    public static PropertyTag PR_RELATED_IPMS\n    {\n        get { return new PropertyTag(0x002D, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the sensitivity value assigned by the sender of the first version of a message — that is, the message\n    ///     before being forwarded or replied to.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENSITIVITY\n    {\n        get { return new PropertyTag(0x002E, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the languages incorporated in a message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_LANGUAGES_W\n    {\n        get { return new PropertyTag(0x002F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the languages incorporated in a message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_LANGUAGES_A\n    {\n        get { return new PropertyTag(0x002F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time by which a reply is expected for a message.\n    /// </summary>\n    public static PropertyTag PR_REPLY_TIME\n    {\n        get { return new PropertyTag(0x0030, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a binary tag value that the messaging system should copy to any report generated for the message.\n    /// </summary>\n    public static PropertyTag PR_REPORT_TAG\n    {\n        get { return new PropertyTag(0x0031, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time when the messaging system generated a report.\n    /// </summary>\n    public static PropertyTag PR_REPORT_TIME\n    {\n        get { return new PropertyTag(0x0032, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the original message is being returned with a nonread report.\n    /// </summary>\n    public static PropertyTag PR_RETURNED_IPM\n    {\n        get { return new PropertyTag(0x0033, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a flag that indicates the security level of a message.\n    /// </summary>\n    public static PropertyTag PR_SECURITY\n    {\n        get { return new PropertyTag(0x0034, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if this message is an incomplete copy of another message.\n    /// </summary>\n    public static PropertyTag PR_INCOMPLETE_COPY\n    {\n        get { return new PropertyTag(0x0035, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a value indicating the message sender's opinion of the sensitivity of a message.\n    /// </summary>\n    public static PropertyTag PR_SENSITIVITY\n    {\n        get { return new PropertyTag(0x0036, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the full subject, encoded in Unicode standard, of a message.\n    /// </summary>\n    public static PropertyTag PR_SUBJECT_W\n    {\n        get { return new PropertyTag(0x0037, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the full subject, encoded in ANSI standard, of a message.\n    /// </summary>\n    internal static PropertyTag PR_SUBJECT_A\n    {\n        get { return new PropertyTag(0x0037, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a binary value that is copied from the message for which a report is being generated.\n    /// </summary>\n    public static PropertyTag PR_SUBJECT_IPM\n    {\n        get { return new PropertyTag(0x0038, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time the message sender submitted a message.\n    /// </summary>\n    public static PropertyTag PR_CLIENT_SUBMIT_TIME\n    {\n        get { return new PropertyTag(0x0039, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the unicode display name for the recipient that should get reports for this message.\n    /// </summary>\n    public static PropertyTag PR_REPORT_NAME_W\n    {\n        get { return new PropertyTag(0x003A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the ANSI display name for the recipient that should get reports for this message.\n    /// </summary>\n    internal static PropertyTag PR_REPORT_NAME_A\n    {\n        get { return new PropertyTag(0x003A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the search key for the messaging user represented by the sender.\n    /// </summary>\n    public static PropertyTag PR_SENT_REPRESENTING_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x003B, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     This property contains the content type for a submitted message.\n    /// </summary>\n    public static PropertyTag PR_X400_CONTENT_TYPE\n    {\n        get { return new PropertyTag(0x003C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a unicode subject prefix that typically indicates some action on a messagE, such as \"FW: \" for forwarding.\n    /// </summary>\n    public static PropertyTag PR_SUBJECT_PREFIX_W\n    {\n        get { return new PropertyTag(0x003D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a ANSI subject prefix that typically indicates some action on a messagE, such as \"FW: \" for forwarding.\n    /// </summary>\n    internal static PropertyTag PR_SUBJECT_PREFIX_A\n    {\n        get { return new PropertyTag(0x003D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains reasons why a message was not received that forms part of a non-delivery report.\n    /// </summary>\n    public static PropertyTag PR_NON_RECEIPT_REASON\n    {\n        get { return new PropertyTag(0x003E, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the messaging user that actually receives the message.\n    /// </summary>\n    public static PropertyTag PR_RECEIVED_BY_ENTRYID\n    {\n        get { return new PropertyTag(0x003F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the messaging user that actually receives the message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RECEIVED_BY_NAME_W\n    {\n        get { return new PropertyTag(0x0040, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the messaging user that actually receives the message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RECEIVED_BY_NAME_A\n    {\n        get { return new PropertyTag(0x0040, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier for the messaging user represented by the sender.\n    /// </summary>\n    public static PropertyTag PR_SENT_REPRESENTING_ENTRYID\n    {\n        get { return new PropertyTag(0x0041, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the messaging user represented by the sender. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SENT_REPRESENTING_NAME_W\n    {\n        get { return new PropertyTag(0x0042, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the messaging user represented by the sender. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SENT_REPRESENTING_NAME_A\n    {\n        get { return new PropertyTag(0x0042, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the messaging user represented by the receiving user. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RCVD_REPRESENTING_NAME_W\n    {\n        get { return new PropertyTag(0x0044, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the messaging user represented by the receiving user. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RCVD_REPRESENTING_NAME_A\n    {\n        get { return new PropertyTag(0x0044, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier for the recipient that should get reports for this message.\n    /// </summary>\n    public static PropertyTag PR_REPORT_ENTRYID\n    {\n        get { return new PropertyTag(0x0045, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an entry identifier for the messaging user to which the messaging system should direct a read report for\n    ///     this message.\n    /// </summary>\n    public static PropertyTag PR_READ_RECEIPT_ENTRYID\n    {\n        get { return new PropertyTag(0x0046, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a message transfer system (MTS) identifier for the message transfer agent (MTA).\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_SUBMISSION_ID\n    {\n        get { return new PropertyTag(0x0047, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time a transport provider passed a message to its underlying messaging system.\n    /// </summary>\n    public static PropertyTag PR_PROVIDER_SUBMIT_TIME\n    {\n        get { return new PropertyTag(0x0048, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the subject of an original message for use in a report about the message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SUBJECT_W\n    {\n        get { return new PropertyTag(0x0049, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the subject of an original message for use in a report about the message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SUBJECT_A\n    {\n        get { return new PropertyTag(0x0049, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     The obsolete precursor of the PR_DISCRETE_VALUES property. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_DISC_VAL\n    {\n        get { return new PropertyTag(0x004A, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the class of the original message for use in a report. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIG_MESSAGE_CLASS_W\n    {\n        get { return new PropertyTag(0x004B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the class of the original message for use in a report. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIG_MESSAGE_CLASS_A\n    {\n        get { return new PropertyTag(0x004B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the author of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_AUTHOR_ENTRYID\n    {\n        get { return new PropertyTag(0x004C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the author of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_AUTHOR_NAME_W\n    {\n        get { return new PropertyTag(0x004D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the author of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_AUTHOR_NAME_A\n    {\n        get { return new PropertyTag(0x004D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the original submission date and time of the message in the report.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SUBMIT_TIME\n    {\n        get { return new PropertyTag(0x004E, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a sized array of entry identifiers for recipients that are to get a reply.\n    /// </summary>\n    public static PropertyTag PR_REPLY_RECIPIENT_ENTRIES\n    {\n        get { return new PropertyTag(0x004F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of display names for recipients that are to get a reply. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_REPLY_RECIPIENT_NAMES_W\n    {\n        get { return new PropertyTag(0x0050, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a list of display names for recipients that are to get a reply. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_REPLY_RECIPIENT_NAMES_A\n    {\n        get { return new PropertyTag(0x0050, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the search key of the messaging user that actually receives the message.\n    /// </summary>\n    public static PropertyTag PR_RECEIVED_BY_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0051, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the search key for the messaging user represented by the receiving user.\n    /// </summary>\n    public static PropertyTag PR_RCVD_REPRESENTING_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0052, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a search key for the messaging user to which the messaging system should direct a read report for a\n    ///     message.\n    /// </summary>\n    public static PropertyTag PR_READ_RECEIPT_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0053, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the search key for the recipient that should get reports for this message.\n    /// </summary>\n    public static PropertyTag PR_REPORT_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0054, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a copy of the original message's delivery date and time in a thread.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_DELIVERY_TIME\n    {\n        get { return new PropertyTag(0x0055, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the search key of the author of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_AUTHOR_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0056, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if this messaging user is specifically named as a primary (To) recipient of this message and is not\n    ///     part of a distribution list.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_TO_ME\n    {\n        get { return new PropertyTag(0x0057, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if this messaging user is specifically named as a carbon copy (CC) recipient of this message and is\n    ///     not part of a distribution list.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_CC_ME\n    {\n        get { return new PropertyTag(0x0058, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if this messaging user is specifically named as a primary (To), carbon copy (CC), or blind carbon\n    ///     copy (BCC) recipient of this message and is not part of a distribution list.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_RECIP_ME\n    {\n        get { return new PropertyTag(0x0059, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENDER_NAME_W\n    {\n        get { return new PropertyTag(0x005A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENDER_NAME_A\n    {\n        get { return new PropertyTag(0x005A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENDER_ENTRYID\n    {\n        get { return new PropertyTag(0x005B, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the search key for the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENDER_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x005C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the messaging user on whose behalf the original message was sent. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_NAME_W\n    {\n        get { return new PropertyTag(0x005D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the messaging user on whose behalf the original message was sent. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_NAME_A\n    {\n        get { return new PropertyTag(0x005D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the messaging user on whose behalf the original message was sent.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_ENTRYID\n    {\n        get { return new PropertyTag(0x005E, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the search key of the messaging user on whose behalf the original message was sent.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x005F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the starting date and time of an appointment as managed by a scheduling application.\n    /// </summary>\n    public static PropertyTag PR_START_DATE\n    {\n        get { return new PropertyTag(0x0060, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the ending date and time of an appointment as managed by a scheduling application.\n    /// </summary>\n    public static PropertyTag PR_END_DATE\n    {\n        get { return new PropertyTag(0x0061, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains an identifier for an appointment in the owner's schedule.\n    /// </summary>\n    public static PropertyTag PR_OWNER_APPT_ID\n    {\n        get { return new PropertyTag(0x0062, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the message sender wants a response to a meeting request.\n    /// </summary>\n    public static PropertyTag PR_RESPONSE_REQUESTED\n    {\n        get { return new PropertyTag(0x0063, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the address type for the messaging user represented by the sender. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SENT_REPRESENTING_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0064, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type for the messaging user represented by the sender. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SENT_REPRESENTING_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0064, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user represented by the sender. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SENT_REPRESENTING_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0065, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user represented by the sender. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SENT_REPRESENTING_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0065, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENDER_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0066, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the sender of the first version of a messagE, that is, the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENDER_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0066, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the sender of the first version of a message, that is, the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0067, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the sender of the first version of a message, that is, the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0067, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the messaging user on whose behalf the original message was sent. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0068, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the messaging user on whose behalf the original message was sent. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0068, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the messaging user on whose behalf the original message was sent. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0069, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the messaging user on whose behalf the original message was sent. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0069, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the topic of the first message in a conversation thread. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CONVERSATION_TOPIC_W\n    {\n        get { return new PropertyTag(0x0070, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the topic of the first message in a conversation thread. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_CONVERSATION_TOPIC_A\n    {\n        get { return new PropertyTag(0x0070, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a binary value that indicates the relative position of this message within a conversation thread.\n    /// </summary>\n    /// <remarks>\n    ///     See https://msdn.microsoft.com/en-us/library/office/cc842470.aspx\n    /// </remarks>\n    public static PropertyTag PR_CONVERSATION_INDEX\n    {\n        get { return new PropertyTag(0x0071, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a binary value that indicates the relative position of this message within a conversation thread.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_DISPLAY_BCC_W\n    {\n        get { return new PropertyTag(0x0072, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display names of any blind carbon copy (BCC) recipients of the original message. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_DISPLAY_BCC_A\n    {\n        get { return new PropertyTag(0x0072, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the display names of any carbon copy (CC) recipients of the original message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_DISPLAY_CC_W\n    {\n        get { return new PropertyTag(0x0073, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display names of any carbon copy (CC) recipients of the original message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_DISPLAY_CC_A\n    {\n        get { return new PropertyTag(0x0073, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the display names of the primary (To) recipients of the original message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_DISPLAY_TO_W\n    {\n        get { return new PropertyTag(0x0074, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display names of the primary (To) recipients of the original message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_DISPLAY_TO_A\n    {\n        get { return new PropertyTag(0x0074, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address typE, such as SMTP, for the messaging user that actually receives the message. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_RECEIVED_BY_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0075, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address typE, such as SMTP, for the messaging user that actually receives the message.\n    ///     Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RECEIVED_BY_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0075, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user that actually receives the message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RECEIVED_BY_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0076, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user that actually receives the message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RECEIVED_BY_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0076, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the address type for the messaging user represented by the user actually receiving the message. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_RCVD_REPRESENTING_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0077, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type for the messaging user represented by the user actually receiving the message.\n    ///     Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RCVD_REPRESENTING_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0077, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user represented by the receiving user. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0078, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address for the messaging user represented by the receiving user. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0078, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the author of the first version of a message. That is — the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_AUTHOR_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0079, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the author of the first version of a message. That is — the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_AUTHOR_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0079, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the author of the first version of a message. That is — the message before being\n    ///     forwarded or replied to. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x007A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the author of the first version of a message. That is — the message before being\n    ///     forwarded or replied to. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x007A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the originally intended recipient of an autoforwarded message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x007B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the address type of the originally intended recipient of an autoforwarded message. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x007B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the originally intended recipient of an autoforwarded message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x007C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the e-mail address of the originally intended recipient of an autoforwarded message. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x007C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains transport-specific message envelope information. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TRANSPORT_MESSAGE_HEADERS_A\n    {\n        get { return new PropertyTag(0x007D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains transport-specific message envelope information. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_TRANSPORT_MESSAGE_HEADERS_W\n    {\n        get { return new PropertyTag(0x007D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the converted value of the attDelegate workgroup property.\n    /// </summary>\n    public static PropertyTag PR_DELEGATION\n    {\n        get { return new PropertyTag(0x007E, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a value used to correlate a Transport Neutral Encapsulation Format (TNEF) attachment with a message\n    /// </summary>\n    public static PropertyTag PR_TNEF_CORRELATION_KEY\n    {\n        get { return new PropertyTag(0x007F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the message text. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are typically used only in an interpersonal message (IPM).\n    ///     Message stores that support Rich Text Format (RTF) ignore any changes to white space in the message text. When\n    ///     PR_BODY is stored for the first timE, the message store also generates and stores the PR_RTF_COMPRESSED\n    ///     (PidTagRtfCompressed) property, the RTF version of the message text. If the IMAPIProp::SaveChanges method is\n    ///     subsequently called and PR_BODY has been modifieD, the message store calls the RTFSync function to ensure\n    ///     synchronization with the RTF version. If only white space has been changeD, the properties are left unchanged. This\n    ///     preserves any nontrivial RTF formatting when the message travels through non-RTF-aware clients and messaging\n    ///     systems.\n    ///     The value for this property must be expressed in the code page of the operating system that MAPI is running on.\n    /// </remarks>\n    public static PropertyTag PR_BODY_W\n    {\n        get { return new PropertyTag(0x1000, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the message text. Non-UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are typically used only in an interpersonal message (IPM).\n    ///     Message stores that support Rich Text Format (RTF) ignore any changes to white space in the message text. When\n    ///     PR_BODY is stored for the first timE, the message store also generates and stores the PR_RTF_COMPRESSED\n    ///     (PidTagRtfCompressed) property, the RTF version of the message text. If the IMAPIProp::SaveChanges method is\n    ///     subsequently called and PR_BODY has been modifieD, the message store calls the RTFSync function to ensure\n    ///     synchronization with the RTF version. If only white space has been changeD, the properties are left unchanged. This\n    ///     preserves any nontrivial RTF formatting when the message travels through non-RTF-aware clients and messaging\n    ///     systems.\n    ///     The value for this property must be expressed in the code page of the operating system that MAPI is running on.\n    /// </remarks>\n    internal static PropertyTag PR_BODY_A\n    {\n        get { return new PropertyTag(0x1000, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains optional text for a report generated by the messaging system. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_REPORT_TEXT_W\n    {\n        get { return new PropertyTag(0x1001, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains optional text for a report generated by the messaging system. NON-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_REPORT_TEXT_A\n    {\n        get { return new PropertyTag(0x1001, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains information about a message originator and a distribution list expansion history.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY\n    {\n        get { return new PropertyTag(0x1002, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of a distribution list where the messaging system delivers a report.\n    /// </summary>\n    public static PropertyTag PR_REPORTING_DL_NAME\n    {\n        get { return new PropertyTag(0x1003, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an identifier for the message transfer agent that generated a report.\n    /// </summary>\n    public static PropertyTag PR_REPORTING_MTA_CERTIFICATE\n    {\n        get { return new PropertyTag(0x1004, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the cyclical redundancy check (CRC) computed for the message text.\n    /// </summary>\n    public static PropertyTag PR_RTF_SYNC_BODY_CRC\n    {\n        get { return new PropertyTag(0x1006, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a count of the significant characters of the message text.\n    /// </summary>\n    public static PropertyTag PR_RTF_SYNC_BODY_COUNT\n    {\n        get { return new PropertyTag(0x1007, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains significant characters that appear at the beginning of the message text. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RTF_SYNC_BODY_TAG_W\n    {\n        get { return new PropertyTag(0x1008, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains significant characters that appear at the beginning of the message text. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RTF_SYNC_BODY_TAG_A\n    {\n        get { return new PropertyTag(0x1008, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the Rich Text Format (RTF) version of the message text, usually in compressed form.\n    /// </summary>\n    public static PropertyTag PR_RTF_COMPRESSED\n    {\n        get { return new PropertyTag(0x1009, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a count of the ignorable characters that appear before the significant characters of the message.\n    /// </summary>\n    public static PropertyTag PR_RTF_SYNC_PREFIX_COUNT\n    {\n        get { return new PropertyTag(0x1010, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a count of the ignorable characters that appear after the significant characters of the message.\n    /// </summary>\n    public static PropertyTag PR_RTF_SYNC_TRAILING_COUNT\n    {\n        get { return new PropertyTag(0x1011, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the originally intended recipient of an auto-forwarded message.\n    /// </summary>\n    public static PropertyTag PR_ORIGINALLY_INTENDED_RECIP_ENTRYID\n    {\n        get { return new PropertyTag(0x1012, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the Hypertext Markup Language (HTML) version of the message text. \n    /// </summary>\n    /// <remarks>\n    ///     These properties contain the same message text as the <see cref=\"PR_BODY_CONTENT_LOCATION_W\" />\n    ///     (PidTagBodyContentLocation), but in HTML. A message store that supports HTML indicates this by setting the \n    ///     <see cref=\"StoreSupportMask.STORE_HTML_OK\" /> flag in its <see cref=\"PR_STORE_SUPPORT_MASK\" />\n    ///     (PidTagStoreSupportMask). Note <see cref=\"StoreSupportMask.STORE_HTML_OK\" /> is not defined in versions of \n    ///     Mapidefs.h included with Microsoft® Exchange 2000 Server and earlier. If <see cref=\"StoreSupportMask.STORE_HTML_OK\" /> \n    ///     is undefined, use the value 0x00010000 instead.\n    /// </remarks>\n    internal static PropertyTag PR_BODY_HTML_A\n    {\n        get { return new PropertyTag(0x1013, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the message body text in HTML format.\n    /// </summary>\n    public static PropertyTag PR_HTML\n    {\n        get { return new PropertyTag(0x1013, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the value of a MIME Content-Location header field.\n    /// </summary>\n    /// <remarks>\n    ///     To set the value of these properties, MIME clients should write the desired value to a Content-Location header \n    ///     field on a MIME entity that maps to a message body. MIME readers should copy the value of a Content-Location \n    ///     header field on such a MIME entity to the value of these properties\n    /// </remarks>\n    internal static PropertyTag PR_BODY_CONTENT_LOCATION_A\n    {\n        get { return new PropertyTag(0x1014, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the value of a MIME Content-Location header field. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     To set the value of these properties, MIME clients should write the desired value to a Content-Location header \n    ///     field on a MIME entity that maps to a message body. MIME readers should copy the value of a Content-Location \n    ///     header field on such a MIME entity to the value of these properties\n    /// </remarks>\n    public static PropertyTag PR_BODY_CONTENT_LOCATION_W\n    {\n        get { return new PropertyTag(0x1014, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Corresponds to the message ID field as specified in [RFC2822]. \n    /// </summary>\n    /// <remarks>\n    ///     These properties should be present on all e-mail messages.\n    /// </remarks>\n    internal static PropertyTag PR_INTERNET_MESSAGE_ID_A\n    {\n        get { return new PropertyTag(0x1035, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Corresponds to the message ID field as specified in [RFC2822]. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     These properties should be present on all e-mail messages.\n    /// </remarks>\n    public static PropertyTag PR_INTERNET_MESSAGE_ID_W\n    {\n        get { return new PropertyTag(0x1035, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value.\n    /// </summary>\n    /// <remarks>\n    ///     These properties must be set on all message replies.\n    /// </remarks>\n    internal static PropertyTag PR_IN_REPLY_TO_ID_A\n    {\n        get { return new PropertyTag(0x1042, PropertyType.PT_STRING8); }\n    }\n\n\n    /// <summary>\n    ///     Contains the original message's PR_INTERNET_MESSAGE_ID (PidTagInternetMessageId) property value. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     These properties should be present on all e-mail messages.\n    /// </remarks>\n    public static PropertyTag PR_IN_REPLY_TO_ID_W\n    {\n        get { return new PropertyTag(0x1042, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field.\n    /// </summary>\n    /// <remarks>\n    ///     To generate a References header field, clients must set these properties to the desired value. MIME writers must copy \n    ///     the value of these properties to the References header field. To set the value of these properties, MIME clients must \n    ///     write the desired value to a References header field. MIME readers must copy the value of the References header field \n    ///     to these properties. MIME readers may truncate the value of these properties if it exceeds 64KB in length.\n    /// </remarks>\n    internal static PropertyTag PR_INTERNET_REFERENCES_A\n    {\n        get { return new PropertyTag(0x1039, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the value of a Multipurpose Internet Mail Extensions (MIME) message's References header field. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     To generate a References header field, clients must set these properties to the desired value. MIME writers must copy \n    ///     the value of these properties to the References header field. To set the value of these properties, MIME clients must \n    ///     write the desired value to a References header field. MIME readers must copy the value of the References header field \n    ///     to these properties. MIME readers may truncate the value of these properties if it exceeds 64KB in length.\n    /// </remarks>\n    public static PropertyTag PR_INTERNET_REFERENCES_W\n    {\n        get { return new PropertyTag(0x1039, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 content integrity check value that allows a message sender to protect message content from\n    ///     disclosure to unauthorized recipients.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_INTEGRITY_CHECK\n    {\n        get { return new PropertyTag(0x0C00, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Indicates that a message sender has requested a message content conversion for a particular recipient.\n    /// </summary>\n    public static PropertyTag PR_EXPLICIT_CONVERSION\n    {\n        get { return new PropertyTag(0x0C01, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if this message should be returned with a report.\n    /// </summary>\n    public static PropertyTag PR_IPM_RETURN_REQUESTED\n    {\n        get { return new PropertyTag(0x0C02, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 security token for a message.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_TOKEN\n    {\n        get { return new PropertyTag(0x0C03, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a diagnostic code that forms part of a nondelivery report.\n    /// </summary>\n    public static PropertyTag PR_NDR_REASON_CODE\n    {\n        get { return new PropertyTag(0x0C04, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a diagnostic code that forms part of a nondelivery report.\n    /// </summary>\n    public static PropertyTag PR_NDR_DIAG_CODE\n    {\n        get { return new PropertyTag(0x0C05, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static PropertyTag PR_NON_RECEIPT_NOTIFICATION_REQUESTED\n    {\n        get { return new PropertyTag(0x0C06, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender wants notification of non-receipt for a specified recipient.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED\n    {\n        get { return new PropertyTag(0x0C08, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an entry identifier for an alternate recipient designated by the sender.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT\n    {\n        get { return new PropertyTag(0x0C09, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY\n    {\n        get { return new PropertyTag(0x0C0A, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the messaging system should use a fax bureau for physical delivery of this message.\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_DELIVERY_MODE\n    {\n        get { return new PropertyTag(0x0C0B, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the mode of a report to be delivered to a particular message recipient upon completion of physical message\n    ///     delivery or delivery by the message handling system.\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_DELIVERY_REPORT_REQUEST\n    {\n        get { return new PropertyTag(0x0C0C, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_FORWARDING_ADDRESS\n    {\n        get { return new PropertyTag(0x0C0D, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender requests the message transfer agent to attach a physical forwarding address for a\n    ///     message recipient.\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED\n    {\n        get { return new PropertyTag(0x0C0E, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender prohibits physical message forwarding for a specific recipient.\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_FORWARDING_PROHIBITED\n    {\n        get { return new PropertyTag(0x0C0F, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 object identifier that is used for rendering message attachments.\n    /// </summary>\n    public static PropertyTag PR_PHYSICAL_RENDITION_ATTRIBUTES\n    {\n        get { return new PropertyTag(0x0C10, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     This property contains an ASN.1 proof of delivery value.\n    /// </summary>\n    public static PropertyTag PR_PROOF_OF_DELIVERY\n    {\n        get { return new PropertyTag(0x0C11, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     This property contains TRUE if a message sender requests proof of delivery for a particular recipient.\n    /// </summary>\n    public static PropertyTag PR_PROOF_OF_DELIVERY_REQUESTED\n    {\n        get { return new PropertyTag(0x0C12, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a message recipient's ASN.1 certificate for use in a report.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_CERTIFICATE\n    {\n        get { return new PropertyTag(0x0C13, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     This property contains a message recipient's telephone number to call to advise of the physical delivery of a\n    ///     message. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_NUMBER_FOR_ADVICE_W\n    {\n        get { return new PropertyTag(0x0C14, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     This property contains a message recipient's telephone number to call to advise of the physical delivery of a\n    ///     message. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RECIPIENT_NUMBER_FOR_ADVICE_A\n    {\n        get { return new PropertyTag(0x0C14, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient type for a message recipient.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_TYPE\n    {\n        get { return new PropertyTag(0x0C15, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     This property contains the type of registration used for physical delivery of a message.\n    /// </summary>\n    public static PropertyTag PR_REGISTERED_MAIL_TYPE\n    {\n        get { return new PropertyTag(0x0C16, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message sender requests a reply from a recipient.\n    /// </summary>\n    public static PropertyTag PR_REPLY_REQUESTED\n    {\n        get { return new PropertyTag(0x0C17, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     This property contains a binary array of delivery methods (service providers), in the order of a message sender's\n    ///     preference.\n    /// </summary>\n    public static PropertyTag PR_REQUESTED_DELIVERY_METHOD\n    {\n        get { return new PropertyTag(0x0C18, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's entry identifier.\n    /// </summary>\n    public static PropertyTag PR_SENDER_ENTRYID\n    {\n        get { return new PropertyTag(0x0C19, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's display name. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SENDER_NAME_W\n    {\n        get { return new PropertyTag(0x0C1A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's display name. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SENDER_NAME_A\n    {\n        get { return new PropertyTag(0x0C1A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains additional information for use in a report. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SUPPLEMENTARY_INFO_W\n    {\n        get { return new PropertyTag(0x0C1B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains additional information for use in a report. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SUPPLEMENTARY_INFO_A\n    {\n        get { return new PropertyTag(0x0C1B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     This property contains the type of a message recipient for use in a report.\n    /// </summary>\n    public static PropertyTag PR_TYPE_OF_MTS_USER\n    {\n        get { return new PropertyTag(0x0C1C, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's search key.\n    /// </summary>\n    public static PropertyTag PR_SENDER_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x0C1D, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's e-mail address type. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SENDER_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x0C1E, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's e-mail address type. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SENDER_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x0C1E, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's e-mail address, encoded in Unicode standard.\n    /// </summary>\n    public static PropertyTag PR_SENDER_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x0C1F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the message sender's e-mail address, encoded in Non-Unicode standard.\n    /// </summary>\n    internal static PropertyTag PR_SENDER_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x0C1F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the current version of a message store. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_CURRENT_VERSION\n    {\n        get { return new PropertyTag(0x0E00, PropertyType.PT_I8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a client application wants MAPI to delete the associated message after submission.\n    /// </summary>\n    public static PropertyTag PR_DELETE_AFTER_SUBMIT\n    {\n        get { return new PropertyTag(0x0E01, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the display names of any blind carbon copy (BCC) message recipients, separated by\n    ///     semicolons (;). UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_BCC_W\n    {\n        get { return new PropertyTag(0x0E02, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the display names of any blind carbon copy (BCC) message recipients, separated by\n    ///     semicolons (;). Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_DISPLAY_BCC_A\n    {\n        get { return new PropertyTag(0x0E02, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the display names of any carbon copy (CC) message recipients, separated by semicolons\n    ///     (;). UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_CC_W\n    {\n        get { return new PropertyTag(0x0E03, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII list of the display names of any carbon copy (CC) message recipients, separated by semicolons\n    ///     (;). Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_DISPLAY_CC_A\n    {\n        get { return new PropertyTag(0x0E03, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of the display names of the primary (To) message recipients, separated by semicolons (;). UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_TO_W\n    {\n        get { return new PropertyTag(0x0E04, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a list of the display names of the primary (To) message recipients, separated by semicolons (;).\n    ///     Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_DISPLAY_TO_A\n    {\n        get { return new PropertyTag(0x0E04, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the folder in which a message was found during a search. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PARENT_DISPLAY_W\n    {\n        get { return new PropertyTag(0x0E05, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name of the folder in which a message was found during a search. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PARENT_DISPLAY_A\n    {\n        get { return new PropertyTag(0x0E05, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time a message was delivered.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_DELIVERY_TIME\n    {\n        get { return new PropertyTag(0x0E06, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags indicating the origin and current state of a message.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_FLAGS\n    {\n        get { return new PropertyTag(0x0E07, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the sum, in bytes, of the sizes of all properties on a message object.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_SIZE\n    {\n        get { return new PropertyTag(0x0E08, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the folder containing a folder or message.\n    /// </summary>\n    public static PropertyTag PR_PARENT_ENTRYID\n    {\n        get { return new PropertyTag(0x0E09, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the folder where the message should be moved after submission.\n    /// </summary>\n    public static PropertyTag PR_SENTMAIL_ENTRYID\n    {\n        get { return new PropertyTag(0x0E0A, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the sender of a message requests the correlation feature of the messaging system.\n    /// </summary>\n    public static PropertyTag PR_CORRELATE\n    {\n        get { return new PropertyTag(0x0E0C, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the message transfer system (MTS) identifier used in correlating reports with sent messages.\n    /// </summary>\n    public static PropertyTag PR_CORRELATE_MTSID\n    {\n        get { return new PropertyTag(0x0E0D, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a nondelivery report applies only to discrete members of a distribution list rather than the\n    ///     entire list.\n    /// </summary>\n    public static PropertyTag PR_DISCRETE_VALUES\n    {\n        get { return new PropertyTag(0x0E0E, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if some transport provider has already accepted responsibility for delivering the message to this\n    ///     recipient, and FALSE if the MAPI spooler considers that this transport provider should accept responsibility.\n    /// </summary>\n    public static PropertyTag PR_RESPONSIBILITY\n    {\n        get { return new PropertyTag(0x0E0F, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the status of the message based on information available to the MAPI spooler.\n    /// </summary>\n    public static PropertyTag PR_SPOOLER_STATUS\n    {\n        get { return new PropertyTag(0x0E10, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Obsolete MAPI spooler property. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_TRANSPORT_STATUS\n    {\n        get { return new PropertyTag(0x0E11, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a table of restrictions that can be applied to a contents table to find all messages that contain\n    ///     recipient subobjects meeting the restrictions.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_RECIPIENTS\n    {\n        get { return new PropertyTag(0x0E12, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains a table of restrictions that can be applied to a contents table to find all messages that contain\n    ///     attachment subobjects meeting the restrictions.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_ATTACHMENTS\n    {\n        get { return new PropertyTag(0x0E13, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags indicating details about a message submission.\n    /// </summary>\n    public static PropertyTag PR_SUBMIT_FLAGS\n    {\n        get { return new PropertyTag(0x0E14, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a value used by the MAPI spooler in assigning delivery responsibility among transport providers.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_STATUS\n    {\n        get { return new PropertyTag(0x0E15, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a value used by the MAPI spooler to track the progress of an outbound message through the outgoing\n    ///     transport providers.\n    /// </summary>\n    public static PropertyTag PR_TRANSPORT_KEY\n    {\n        get { return new PropertyTag(0x0E16, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    /// </summary>\n    public static PropertyTag PR_MSG_STATUS\n    {\n        get { return new PropertyTag(0x0E17, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of property tags that define the status of a message.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_DOWNLOAD_TIME\n    {\n        get { return new PropertyTag(0x0E18, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the message store version current at the time a message was created. No longer\n    ///     supported.\n    /// </summary>\n    public static PropertyTag PR_CREATION_VERSION\n    {\n        get { return new PropertyTag(0x0E19, PropertyType.PT_I8); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the message store version current at the time the message was last modified. No\n    ///     longer supported.\n    /// </summary>\n    public static PropertyTag PR_MODIFY_VERSION\n    {\n        get { return new PropertyTag(0x0E1A, PropertyType.PT_I8); }\n    }\n\n    /// <summary>\n    ///     When true then the message contains at least one attachment.\n    /// </summary>\n    public static PropertyTag PR_HASATTACH\n    {\n        get { return new PropertyTag(0x0E1B, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a circular redundancy check (CRC) value on the message text.\n    /// </summary>\n    public static PropertyTag PR_BODY_CRC\n    {\n        get { return new PropertyTag(0x0E1C, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the message subject with any prefix removed. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     See https://msdn.microsoft.com/en-us/library/office/cc815282.aspx\n    /// </remarks>\n    public static PropertyTag PR_NORMALIZED_SUBJECT_W\n    {\n        get { return new PropertyTag(0x0E1D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the message subject with any prefix removed. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_NORMALIZED_SUBJECT_A\n    {\n        get { return new PropertyTag(0x0E1D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if PR_RTF_COMPRESSED has the same text content as PR_BODY for this message.\n    /// </summary>\n    public static PropertyTag PR_RTF_IN_SYNC\n    {\n        get { return new PropertyTag(0x0E1F, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the sum, in bytes, of the sizes of all properties on an attachment.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_SIZE\n    {\n        get { return new PropertyTag(0x0E20, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a number that uniquely identifies the attachment within its parent message.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_NUM\n    {\n        get { return new PropertyTag(0x0E21, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags for an attachment.\n    /// </summary>\n    /// <remarks>\n    ///     If the PR_ATTACH_FLAGS property is zero or absent, the attachment is to be processed by all applications.\n    /// </remarks>\n    public static PropertyTag PR_ATTACH_FLAGS\n    {\n        get { return new PropertyTag(0x3714, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the message requires preprocessing.\n    /// </summary>\n    public static PropertyTag PR_PREPROCESS\n    {\n        get { return new PropertyTag(0x0E22, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains an identifier for the message transfer agent (MTA) that originated the message.\n    /// </summary>\n    public static PropertyTag PR_ORIGINATING_MTA_CERTIFICATE\n    {\n        get { return new PropertyTag(0x0E25, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 proof of submission value.\n    /// </summary>\n    public static PropertyTag PR_PROOF_OF_SUBMISSION\n    {\n        get { return new PropertyTag(0x0E26, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     The PR_ENTRYID property contains a MAPI entry identifier used to open and edit properties of a particular MAPI\n    ///     object.\n    /// </summary>\n    public static PropertyTag PR_ENTRYID\n    {\n        get { return new PropertyTag(0x0FFF, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the type of an object\n    /// </summary>\n    public static PropertyTag PR_OBJECT_TYPE\n    {\n        get { return new PropertyTag(0x0FFE, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmap of a full size icon for a form.\n    /// </summary>\n    public static PropertyTag PR_ICON\n    {\n        get { return new PropertyTag(0x0FFD, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmap of a half-size icon for a form.\n    /// </summary>\n    public static PropertyTag PR_MINI_ICON\n    {\n        get { return new PropertyTag(0x0FFC, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Specifies the hexadecimal string representation of the value of the PR_STORE_ENTRYID (PidTagStoreEntryId) property\n    ///     on the shared folder. This is a property of a sharing message.\n    /// </summary>\n    public static PropertyTag PR_STORE_ENTRYID\n    {\n        get { return new PropertyTag(0x0FFB, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the unique binary-comparable identifier (record key) of the message store in which an object resides.\n    /// </summary>\n    public static PropertyTag PR_STORE_RECORD_KEY\n    {\n        get { return new PropertyTag(0x0FFA, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a unique binary-comparable identifier for a specific object.\n    /// </summary>\n    public static PropertyTag PR_RECORD_KEY\n    {\n        get { return new PropertyTag(0x0FF9, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the mapping signature for named properties of a particular MAPI object.\n    /// </summary>\n    public static PropertyTag PR_MAPPING_SIGNATURE\n    {\n        get { return new PropertyTag(0x0FF8, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Indicates the client's access level to the object.\n    /// </summary>\n    public static PropertyTag PR_ACCESS_LEVEL\n    {\n        get { return new PropertyTag(0x0FF7, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a value that uniquely identifies a row in a table.\n    /// </summary>\n    public static PropertyTag PR_INSTANCE_KEY\n    {\n        get { return new PropertyTag(0x0FF6, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a value that indicates the type of a row in a table.\n    /// </summary>\n    public static PropertyTag PR_ROW_TYPE\n    {\n        get { return new PropertyTag(0x0FF5, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags indicating the operations that are available to the client for the object.\n    /// </summary>\n    public static PropertyTag PR_ACCESS\n    {\n        get { return new PropertyTag(0x0FF4, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a number that indicates which icon to use when you display a group of e-mail objects.\n    /// </summary>\n    /// <remarks>\n    ///     This property, if it exists, is a hint to the client. The client may ignore the value of this property. \n    /// </remarks>\n    public static PropertyTag PR_ICON_INDEX\n    {\n        get { return new PropertyTag(0x1080, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Specifies the last verb executed for the message item to which it is related.\n    /// </summary>\n    public static PropertyTag PR_LAST_VERB_EXECUTED\n    {\n        get { return new PropertyTag(0x1081, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the time when the last verb was executed.\n    /// </summary>\n    public static PropertyTag PR_LAST_VERB_EXECUTION_TIME\n    {\n        get { return new PropertyTag(0x1082, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a unique identifier for a recipient in a recipient table or status table.\n    /// </summary>\n    public static PropertyTag PR_ROWID\n    {\n        get { return new PropertyTag(0x3000, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for a given MAPI object. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_NAME_W\n    {\n        get { return new PropertyTag(0x3001, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the value of the <see cref=\"PR_DISPLAY_NAME_W\"/> (PidTagDisplayName) property. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RECIPIENT_DISPLAY_NAME_A\n    {\n        get { return new PropertyTag(0x5FF6, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the value of the <see cref=\"PR_DISPLAY_NAME_W\"/> (PidTagDisplayName) property. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RECIPIENT_DISPLAY_NAME_W\n    {\n        get { return new PropertyTag(0x5FF6, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Specifies a bit field that describes the recipient status.\n    /// </summary>\n    /// <remarks>\n    ///     This property is not required. The following are the individual flags that can be set.\n    /// </remarks>\n    public static PropertyTag PR_RECIPIENT_FLAGS\n    {\n        get { return new PropertyTag(0x5FFD, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for a given MAPI object. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_DISPLAY_NAME_A\n    {\n        get { return new PropertyTag(0x3001, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's e-mail address type, such as SMTP. UNICODE compilation.\n    /// </summary>\n    /// <remarks>\n    ///     These properties are examples of the base address properties common to all messaging users. \n    ///     It specifies which messaging system MAPI uses to handle a given message.\n    ///     This property also determines the format of the address string in the PR_EMAIL_ADRESS(PidTagEmailAddress). \n    ///     The string it provides can contain only the uppercase alphabetic characters from A through Z and the numbers \n    ///     from 0 through 9.\n    /// </remarks>\n    public static PropertyTag PR_ADDRTYPE_W\n    {\n        get { return new PropertyTag(0x3002, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's e-mail address type such as SMTP. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ADDRTYPE_A\n    {\n        get { return new PropertyTag(0x3002, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's e-mail address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_EMAIL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x3003, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's SMTP e-mail address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SMTP_ADDRESS_A\n    {\n        get { return new PropertyTag(0x39FE, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's SMTP e-mail address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SMTP_ADDRESS_W\n    {\n        get { return new PropertyTag(0x39FE, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's 7bit e-mail address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_7BIT_DISPLAY_NAME_A\n    {\n        get { return new PropertyTag(0x39FF, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's SMTP e-mail address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_7BIT_DISPLAY_NAME_W\n    {\n        get { return new PropertyTag(0x39FF, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the messaging user's e-mail address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_EMAIL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x3003, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a comment about the purpose or content of an object. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_COMMENT_W\n    {\n        get { return new PropertyTag(0x3004, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a comment about the purpose or content of an object. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_COMMENT_A\n    {\n        get { return new PropertyTag(0x3004, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an integer that represents the relative level of indentation, or depth, of an object in a hierarchy table.\n    /// </summary>\n    public static PropertyTag PR_DEPTH\n    {\n        get { return new PropertyTag(0x3005, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the vendor-defined display name for a service provider. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PROVIDER_DISPLAY_W\n    {\n        get { return new PropertyTag(0x3006, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the vendor-defined display name for a service provider. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PROVIDER_DISPLAY_A\n    {\n        get { return new PropertyTag(0x3006, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the creation date and time of a message.\n    /// </summary>\n    public static PropertyTag PR_CREATION_TIME\n    {\n        get { return new PropertyTag(0x3007, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the date and time when the object or subobject was last modified.\n    /// </summary>\n    public static PropertyTag PR_LAST_MODIFICATION_TIME\n    {\n        get { return new PropertyTag(0x3008, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags for message services and providers.\n    /// </summary>\n    public static PropertyTag PR_RESOURCE_FLAGS\n    {\n        get { return new PropertyTag(0x3009, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the base file name of the MAPI service provider dynamic-link library (DLL). UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PROVIDER_DLL_NAME_W\n    {\n        get { return new PropertyTag(0x300A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the base file name of the MAPI service provider dynamic-link library (DLL). Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PROVIDER_DLL_NAME_A\n    {\n        get { return new PropertyTag(0x300A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a binary-comparable key that identifies correlated objects for a search.\n    /// </summary>\n    public static PropertyTag PR_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x300B, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a MAPIUID structure of the service provider that is handling a message.\n    /// </summary>\n    public static PropertyTag PR_PROVIDER_UID\n    {\n        get { return new PropertyTag(0x300C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the zero-based index of a service provider's position in the provider table.\n    /// </summary>\n    public static PropertyTag PR_PROVIDER_ORDINAL\n    {\n        get { return new PropertyTag(0x300D, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the version of a form. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_FORM_VERSION_W\n    {\n        get { return new PropertyTag(0x3301, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the version of a form. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_FORM_VERSION_A\n    {\n        get { return new PropertyTag(0x3301, PropertyType.PT_STRING8); }\n    }\n\n    ///// <summary>\n    /////     Contains the 128-bit Object Linking and Embedding (OLE) globally unique identifier (GUID) of a form.\n    ///// </summary>\n    //public static PropertyTag PR_FORM_CLSID\n    //{\n    //    get { return new PropertyTag(0x3302, PropertyType.PT_CLSID); }\n    //}\n\n    /// <summary>\n    ///     Contains the name of a contact for information about a form. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_FORM_CONTACT_NAME_W\n    {\n        get { return new PropertyTag(0x3303, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of a contact for information about a form. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_FORM_CONTACT_NAME_A\n    {\n        get { return new PropertyTag(0x3303, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the category of a form. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_FORM_CATEGORY_W\n    {\n        get { return new PropertyTag(0x3304, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the category of a form. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_FORM_CATEGORY_A\n    {\n        get { return new PropertyTag(0x3304, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the subcategory of a form, as defined by a client application. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_FORM_CATEGORY_SUB_W\n    {\n        get { return new PropertyTag(0x3305, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the subcategory of a form, as defined by a client application. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_FORM_CATEGORY_SUB_A\n    {\n        get { return new PropertyTag(0x3305, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a host map of available forms.\n    /// </summary>\n    public static PropertyTag PR_FORM_HOST_MAP\n    {\n        get { return new PropertyTag(0x3306, PropertyType.PT_MV_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a form is to be suppressed from display by compose menus and dialog boxes.\n    /// </summary>\n    public static PropertyTag PR_FORM_HIDDEN\n    {\n        get { return new PropertyTag(0x3307, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the object that is used to design the form. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_FORM_DESIGNER_NAME_W\n    {\n        get { return new PropertyTag(0x3308, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for the object that is used to design the form. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_FORM_DESIGNER_NAME_A\n    {\n        get { return new PropertyTag(0x3308, PropertyType.PT_STRING8); }\n    }\n\n    ///// <summary>\n    /////     Contains the unique identifier for the object that is used to design a form.\n    ///// </summary>\n    //public static PropertyTag PR_FORM_DESIGNER_GUID\n    //{\n    //    get { return new PropertyTag(0x3309, PropertyType.PT_CLSID); }\n    //}\n\n    /// <summary>\n    ///     Contains TRUE if a message should be composed in the current folder.\n    /// </summary>\n    public static PropertyTag PR_FORM_MESSAGE_BEHAVIOR\n    {\n        get { return new PropertyTag(0x330A, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a message store is the default message store in the message store table.\n    /// </summary>\n    public static PropertyTag PR_DEFAULT_STORE\n    {\n        get { return new PropertyTag(0x3400, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags that client applications query to determine the characteristics of a message store.\n    /// </summary>\n    public static PropertyTag PR_STORE_SUPPORT_MASK\n    {\n        get { return new PropertyTag(0x340D, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a flag that describes the state of the message store.\n    /// </summary>\n    public static PropertyTag PR_STORE_STATE\n    {\n        get { return new PropertyTag(0x340E, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags that client applications should query to determine the characteristics of a message store.\n    /// </summary>\n    public static PropertyTag PR_STORE_UNICODE_MASK\n    {\n        get { return new PropertyTag(0x340F, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the search key of the interpersonal message (IPM) root folder. No longer supported\n    /// </summary>\n    public static PropertyTag PR_IPM_SUBTREE_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3410, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the search key of the standard Outbox folder. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_IPM_OUTBOX_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3411, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the search key of the standard Deleted Items folder. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_IPM_WASTEBASKET_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3412, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the search key of the standard Sent Items folder. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_IPM_SENTMAIL_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3413, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a provider-defined MAPIUID structure that indicates the type of the message store.\n    /// </summary>\n    public static PropertyTag PR_MDB_PROVIDER\n    {\n        get { return new PropertyTag(0x3414, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a table of a message store's receive folder settings.\n    /// </summary>\n    public static PropertyTag PR_RECEIVE_FOLDER_SETTINGS\n    {\n        get { return new PropertyTag(0x3415, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags that indicate the validity of the entry identifiers of the folders in a message store.\n    /// </summary>\n    public static PropertyTag PR_VALID_FOLDER_MASK\n    {\n        get { return new PropertyTag(0x35DF, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the root of the IPM folder subtree in the message store's folder tree.\n    /// </summary>\n    public static PropertyTag PR_IPM_SUBTREE_ENTRYID\n    {\n        get { return new PropertyTag(0x35E0, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the standard interpersonal message (IPM) Outbox folder.\n    /// </summary>\n    public static PropertyTag PR_IPM_OUTBOX_ENTRYID\n    {\n        get { return new PropertyTag(0x35E2, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the standard IPM Deleted Items folder.\n    /// </summary>\n    public static PropertyTag PR_IPM_WASTEBASKET_ENTRYID\n    {\n        get { return new PropertyTag(0x35E3, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the standard IPM Sent Items folder.\n    /// </summary>\n    public static PropertyTag PR_IPM_SENTMAIL_ENTRYID\n    {\n        get { return new PropertyTag(0x35E4, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the user-defined Views folder.\n    /// </summary>\n    public static PropertyTag PR_VIEWS_ENTRYID\n    {\n        get { return new PropertyTag(0x35E5, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the predefined common view folder.\n    /// </summary>\n    public static PropertyTag PR_COMMON_VIEWS_ENTRYID\n    {\n        get { return new PropertyTag(0x35E6, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier for the folder in which search results are typically created.\n    /// </summary>\n    public static PropertyTag PR_FINDER_ENTRYID\n    {\n        get { return new PropertyTag(0x35E7, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     When TRUE, forces the serialization of SMTP and POP3 authentication requests such that the POP3 account is\n    ///     authenticated before the SMTP account.\n    /// </summary>\n    public static PropertyTag PR_CE_RECEIVE_BEFORE_SEND\n    {\n        get { return new PropertyTag(0x812D, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags describing capabilities of an address book container.\n    /// </summary>\n    public static PropertyTag PR_CONTAINER_FLAGS\n    {\n        get { return new PropertyTag(0x3600, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a constant that indicates the folder type.\n    /// </summary>\n    public static PropertyTag PR_FOLDER_TYPE\n    {\n        get { return new PropertyTag(0x3601, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the number of messages in a folder, as computed by the message store.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_COUNT\n    {\n        get { return new PropertyTag(0x3602, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the number of unread messages in a folder, as computed by the message store.\n    /// </summary>\n    public static PropertyTag PR_CONTENT_UNREAD\n    {\n        get { return new PropertyTag(0x3603, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains an embedded table object that contains dialog box template entry identifiers.\n    /// </summary>\n    public static PropertyTag PR_CREATE_TEMPLATES\n    {\n        get { return new PropertyTag(0x3604, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains an embedded display table object.\n    /// </summary>\n    public static PropertyTag PR_DETAILS_TABLE\n    {\n        get { return new PropertyTag(0x3605, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains a container object that is used for advanced searches.\n    /// </summary>\n    public static PropertyTag PR_SEARCH\n    {\n        get { return new PropertyTag(0x3607, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the entry in the one-off table can be selected.\n    /// </summary>\n    public static PropertyTag PR_SELECTABLE\n    {\n        get { return new PropertyTag(0x3609, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a folder contains subfolders.\n    /// </summary>\n    public static PropertyTag PR_SUBFOLDERS\n    {\n        get { return new PropertyTag(0x360A, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a 32-bit bitmask of flags that define folder status.\n    /// </summary>\n    public static PropertyTag PR_STATUS\n    {\n        get { return new PropertyTag(0x360B, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a string value for use in a property restriction on an address book container contents table. UNICODE\n    ///     compilation\n    /// </summary>\n    public static PropertyTag PR_ANR_W\n    {\n        get { return new PropertyTag(0x360C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a string value for use in a property restriction on an address book container contents table. Non-UNICODE\n    ///     compilation\n    /// </summary>\n    internal static PropertyTag PR_ANR_A\n    {\n        get { return new PropertyTag(0x360C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     No longer supported\n    /// </summary>\n    public static PropertyTag PR_CONTENTS_SORT_ORDER\n    {\n        get { return new PropertyTag(0x360D, PropertyType.PT_MV_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains an embedded hierarchy table object that provides information about the child containers.\n    /// </summary>\n    public static PropertyTag PR_CONTAINER_HIERARCHY\n    {\n        get { return new PropertyTag(0x360E, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains an embedded contents table object that provides information about a container.\n    /// </summary>\n    public static PropertyTag PR_CONTAINER_CONTENTS\n    {\n        get { return new PropertyTag(0x360F, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains an embedded contents table object that provides information about a container.\n    /// </summary>\n    public static PropertyTag PR_FOLDER_ASSOCIATED_CONTENTS\n    {\n        get { return new PropertyTag(0x3610, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains the template entry identifier for a default distribution list.\n    /// </summary>\n    public static PropertyTag PR_DEF_CREATE_DL\n    {\n        get { return new PropertyTag(0x3611, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the template entry identifier for a default messaging user object.\n    /// </summary>\n    public static PropertyTag PR_DEF_CREATE_MAILUSER\n    {\n        get { return new PropertyTag(0x3612, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a text string describing the type of a folder. Although this property is generally ignored, versions of\n    ///     Microsoft® Exchange Server prior to Exchange Server 2003 Mailbox Manager expect this property to be present.\n    ///     UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CONTAINER_CLASS_W\n    {\n        get { return new PropertyTag(0x3613, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a text string describing the type of a folder. Although this property is generally ignored, versions of\n    ///     Microsoft® Exchange Server prior to Exchange Server 2003 Mailbox Manager expect this property to be present.\n    ///     Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_CONTAINER_CLASS_A\n    {\n        get { return new PropertyTag(0x3613, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Unknown\n    /// </summary>\n    public static PropertyTag PR_CONTAINER_MODIFY_VERSION\n    {\n        get { return new PropertyTag(0x3614, PropertyType.PT_I8); }\n    }\n\n    /// <summary>\n    ///     Contains an address book provider's MAPIUID structure.\n    /// </summary>\n    public static PropertyTag PR_AB_PROVIDER_ID\n    {\n        get { return new PropertyTag(0x3615, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of a folder's default view.\n    /// </summary>\n    public static PropertyTag PR_DEFAULT_VIEW_ENTRYID\n    {\n        get { return new PropertyTag(0x3616, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the count of items in the associated contents table of the folder.\n    /// </summary>\n    public static PropertyTag PR_ASSOC_CONTENT_COUNT\n    {\n        get { return new PropertyTag(0x3617, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     was originally meant to contain an ASN.1 object identifier specifying how the attachment should be handled during\n    ///     transmission. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_ATTACHMENT_X400_PARAMETERS\n    {\n        get { return new PropertyTag(0x3700, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the content identification header of a MIME message attachment. This property is used for MHTML support.\n    ///     It represents the content identification header for the appropriate MIME body part. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_CONTENT_ID_W\n    {\n        get { return new PropertyTag(0x3712, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the content identification header of a MIME message attachment. This property is used for MHTML support.\n    ///     It represents the content identification header for the appropriate MIME body part. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_CONTENT_ID_A\n    {\n        get { return new PropertyTag(0x3712, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the content location header of a MIME message attachment. This property is used for MHTML support. It\n    ///     represents the content location header for the appropriate MIME body part. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_CONTENT_LOCATION_W\n    {\n        get { return new PropertyTag(0x3713, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the content location header of a MIME message attachment. This property is used for MHTML support. It\n    ///     represents the content location header for the appropriate MIME body part. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_CONTENT_LOCATION_A\n    {\n        get { return new PropertyTag(0x3713, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment object typically accessed through the OLE IStorage:IUnknown interface.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_DATA_OBJ\n    {\n        get { return new PropertyTag(0x3701, PropertyType.PT_OBJECT); }\n    }\n\n    /// <summary>\n    ///     Contains binary attachment data typically accessed through the COM IStream:IUnknown interface.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_DATA_BIN\n    {\n        get { return new PropertyTag(0x3701, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 object identifier specifying the encoding for an attachment.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_ENCODING\n    {\n        get { return new PropertyTag(0x3702, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a filename extension that indicates the document type of an attachment. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_EXTENSION_W\n    {\n        get { return new PropertyTag(0x3703, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a filename extension that indicates the document type of an attachment. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_EXTENSION_A\n    {\n        get { return new PropertyTag(0x3703, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's base filename and extension, excluding path. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_FILENAME_W\n    {\n        get { return new PropertyTag(0x3704, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's base filename and extension, excluding path. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_FILENAME_A\n    {\n        get { return new PropertyTag(0x3704, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a MAPI-defined constant representing the way the contents of an attachment can be accessed.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_METHOD\n    {\n        get { return new PropertyTag(0x3705, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's long filename and extension, excluding path. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_LONG_FILENAME_W\n    {\n        get { return new PropertyTag(0x3707, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's long filename and extension, excluding path. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_LONG_FILENAME_A\n    {\n        get { return new PropertyTag(0x3707, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's fully qualified path and filename. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_PATHNAME_W\n    {\n        get { return new PropertyTag(0x3708, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's fully qualified path and filename. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_PATHNAME_A\n    {\n        get { return new PropertyTag(0x3708, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a Microsoft Windows metafile with rendering information for an attachment.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_RENDERING\n    {\n        get { return new PropertyTag(0x3709, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 object identifier specifying the application that supplied an attachment.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_TAG\n    {\n        get { return new PropertyTag(0x370A, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains an offset, in characters, to use in rendering an attachment within the main message text.\n    /// </summary>\n    public static PropertyTag PR_RENDERING_POSITION\n    {\n        get { return new PropertyTag(0x370B, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the name of an attachment file modified so that it can be correlated with TNEF messages. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_TRANSPORT_NAME_W\n    {\n        get { return new PropertyTag(0x370C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of an attachment file modified so that it can be correlated with TNEF messages. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_TRANSPORT_NAME_A\n    {\n        get { return new PropertyTag(0x370C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's fully qualified long path and filename. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_LONG_PATHNAME_W\n    {\n        get { return new PropertyTag(0x370D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an attachment's fully qualified long path and filename. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_LONG_PATHNAME_A\n    {\n        get { return new PropertyTag(0x370D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains formatting information about a Multipurpose Internet Mail Extensions (MIME) attachment. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_MIME_TAG_W\n    {\n        get { return new PropertyTag(0x370E, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains formatting information about a Multipurpose Internet Mail Extensions (MIME) attachment. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_ATTACH_MIME_TAG_A\n    {\n        get { return new PropertyTag(0x370E, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Provides file type information for a non-Windows attachment.\n    /// </summary>\n    public static PropertyTag PR_ATTACH_ADDITIONAL_INFO\n    {\n        get { return new PropertyTag(0x370F, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a value used to associate an icon with a particular row of a table.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_TYPE\n    {\n        get { return new PropertyTag(0x3900, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the PR_ENTRYID (PidTagEntryId), expressed as a permanent entry ID format.\n    /// </summary>\n    public static PropertyTag PR_TEMPLATEID\n    {\n        get { return new PropertyTag(0x3902, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     These properties appear on address book objects. Obsolete.\n    /// </summary>\n    public static PropertyTag PR_PRIMARY_CAPABILITY\n    {\n        get { return new PropertyTag(0x3904, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the type of an entry, with respect to how the entry should be displayed in a row in a table for the Global\n    ///     Address List.\n    /// </summary>\n    public static PropertyTag PR_DISPLAY_TYPE_EX\n    {\n        get { return new PropertyTag(0x3905, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's account name. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ACCOUNT_W\n    {\n        get { return new PropertyTag(0x3A00, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's account name. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ACCOUNT_A\n    {\n        get { return new PropertyTag(0x3A00, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of entry identifiers for alternate recipients designated by the original recipient.\n    /// </summary>\n    public static PropertyTag PR_ALTERNATE_RECIPIENT\n    {\n        get { return new PropertyTag(0x3A01, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a telephone number that the message recipient can use to reach the sender. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CALLBACK_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A02, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a telephone number that the message recipient can use to reach the sender. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_CALLBACK_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A02, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if message conversions are prohibited by default for the associated messaging user.\n    /// </summary>\n    public static PropertyTag PR_CONVERSION_PROHIBITED\n    {\n        get { return new PropertyTag(0x3A03, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     The DiscloseRecipients field represents a PR_DISCLOSE_RECIPIENTS MAPI property.\n    /// </summary>\n    public static PropertyTag PR_DISCLOSE_RECIPIENTS\n    {\n        get { return new PropertyTag(0x3A04, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a generational abbreviation that follows the full name of the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_GENERATION_W\n    {\n        get { return new PropertyTag(0x3A05, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a generational abbreviation that follows the full name of the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_GENERATION_A\n    {\n        get { return new PropertyTag(0x3A05, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the first or given name of the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_GIVEN_NAME_W\n    {\n        get { return new PropertyTag(0x3A06, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the first or given name of the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_GIVEN_NAME_A\n    {\n        get { return new PropertyTag(0x3A06, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a government identifier for the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_GOVERNMENT_ID_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A07, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a government identifier for the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_GOVERNMENT_ID_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A07, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the primary telephone number of the recipient's place of business. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A08, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the primary telephone number of the recipient's place of business. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A08, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the primary telephone number of the recipient's home. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_HOME_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A09, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the primary telephone number of the recipient's home. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A09, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the initials for parts of the full name of the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_INITIALS_W\n    {\n        get { return new PropertyTag(0x3A0A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the initials for parts of the full name of the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_INITIALS_A\n    {\n        get { return new PropertyTag(0x3A0A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a keyword that identifies the recipient to the recipient's system administrator. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_KEYWORD_W\n    {\n        get { return new PropertyTag(0x3A0B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a keyword that identifies the recipient to the recipient's system administrator. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_KEYWORD_A\n    {\n        get { return new PropertyTag(0x3A0B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a value that indicates the language in which the messaging user is writing messages. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_LANGUAGE_W\n    {\n        get { return new PropertyTag(0x3A0C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a value that indicates the language in which the messaging user is writing messages. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_LANGUAGE_A\n    {\n        get { return new PropertyTag(0x3A0C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the location of the recipient in a format that is useful to the recipient's organization. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_LOCATION_W\n    {\n        get { return new PropertyTag(0x3A0D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the location of the recipient in a format that is useful to the recipient's organization. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_LOCATION_A\n    {\n        get { return new PropertyTag(0x3A0D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the messaging user is allowed to send and receive messages.\n    /// </summary>\n    public static PropertyTag PR_MAIL_PERMISSION\n    {\n        get { return new PropertyTag(0x3A0E, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the common name of the message handling system. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_MHS_COMMON_NAME_W\n    {\n        get { return new PropertyTag(0x3A0F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the common name of the message handling system. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_MHS_COMMON_NAME_A\n    {\n        get { return new PropertyTag(0x3A0F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an organizational ID number for the contact, such as an employee ID number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORGANIZATIONAL_ID_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A10, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an organizational ID number for the contact, such as an employee ID number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORGANIZATIONAL_ID_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A10, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the last or surname of the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_SURNAME_W\n    {\n        get { return new PropertyTag(0x3A11, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the last or surname of the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_SURNAME_A\n    {\n        get { return new PropertyTag(0x3A11, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the original entry identifier for an entry copied from an address book to a personal address book or other\n    ///     writeable address book.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_ENTRYID\n    {\n        get { return new PropertyTag(0x3A12, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the original display name for an entry copied from an address book to a personal address book or other\n    ///     writable address book. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_DISPLAY_NAME_W\n    {\n        get { return new PropertyTag(0x3A13, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the original display name for an entry copied from an address book to a personal address book or other\n    ///     writable address book. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ORIGINAL_DISPLAY_NAME_A\n    {\n        get { return new PropertyTag(0x3A13, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the original search key for an entry copied from an address book to a personal address book or other\n    ///     writeable address book.\n    /// </summary>\n    public static PropertyTag PR_ORIGINAL_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3A14, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's postal address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_POSTAL_ADDRESS_W\n    {\n        get { return new PropertyTag(0x3A15, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's postal address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_POSTAL_ADDRESS_A\n    {\n        get { return new PropertyTag(0x3A15, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's home page. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_HOME_PAGE_W\n    {\n        get { return new PropertyTag(0x3A51, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's home page. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_HOME_PAGE_A\n    {\n        get { return new PropertyTag(0x3A51, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's company name. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_COMPANY_NAME_W\n    {\n        get { return new PropertyTag(0x3A16, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number for the contact's text telephone (TTY) or telecommunication device for the deaf (TDD). UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TTYTDD_PHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A4B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number for the contact's text telephone (TTY) or telecommunication device for the deaf (TDD). Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TTYTDD_PHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A4B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's companys main phone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_COMPANY_MAIN_PHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A57, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's companys main phone number. NON-UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_COMPANY_MAIN_PHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A57, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of names of children. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CHILDRENS_NAMES_W\n    {\n        get { return new PropertyTag(0x3A58, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a list of names of children. NON-UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CHILDRENS_NAMES_A\n    {\n        get { return new PropertyTag(0x3A58, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_CITY_A\n    {\n        get { return new PropertyTag(0x3A59, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_CITY_W\n    {\n        get { return new PropertyTag(0x3A59, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_COUNTRY_A\n    {\n        get { return new PropertyTag(0x3A5A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's country address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_COUNTRY_W\n    {\n        get { return new PropertyTag(0x3A5A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's country address. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_STREET_A\n    {\n        get { return new PropertyTag(0x3A5D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's street address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_STREET_W\n    {\n        get { return new PropertyTag(0x3A5D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_POSTAL_CODE_A\n    {\n        get { return new PropertyTag(0x3A5B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_POSTAL_CODE_W\n    {\n        get { return new PropertyTag(0x3A5B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_STATE_OR_PROVINCE_A\n    {\n        get { return new PropertyTag(0x3A5C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's city address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_ADDRESS_STATE_OR_PROVINCE_W\n    {\n        get { return new PropertyTag(0x3A5C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's company name. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_COMPANY_NAME_A\n    {\n        get { return new PropertyTag(0x3A16, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's job title. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_TITLE_W\n    {\n        get { return new PropertyTag(0x3A17, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's job title. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TITLE_A\n    {\n        get { return new PropertyTag(0x3A17, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a name for the department in which the recipient works. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_DEPARTMENT_NAME_W\n    {\n        get { return new PropertyTag(0x3A18, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a name for the department in which the recipient works. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_DEPARTMENT_NAME_A\n    {\n        get { return new PropertyTag(0x3A18, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's office location. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OFFICE_LOCATION_W\n    {\n        get { return new PropertyTag(0x3A19, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's office location. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OFFICE_LOCATION_A\n    {\n        get { return new PropertyTag(0x3A19, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's primary telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PRIMARY_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's primary telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PRIMARY_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a secondary telephone number at the recipient's place of business. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS2_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a secondary telephone number at the recipient's place of business. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS2_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's cellular telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_MOBILE_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's cellular telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_MOBILE_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's radio telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RADIO_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's radio telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RADIO_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other street. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_ADDRESS_STREET_W\n    {\n        get { return new PropertyTag(0x3A63, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other street. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_ADDRESS_STREET_A\n    {\n        get { return new PropertyTag(0x3A63, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other postal code. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_ADDRESS_POSTAL_CODE_W\n    {\n        get { return new PropertyTag(0x3A61, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other postal code. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_ADDRESS_POSTAL_CODE_A\n    {\n        get { return new PropertyTag(0x3A61, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other city. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_ADDRESS_CITY_W\n    {\n        get { return new PropertyTag(0x3A5F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other city. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_ADDRESS_CITY_A\n    {\n        get { return new PropertyTag(0x3A5F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other country. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_ADDRESS_COUNTRY_W\n    {\n        get { return new PropertyTag(0x3A60, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other country. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_ADDRESS_COUNTRY_A\n    {\n        get { return new PropertyTag(0x3A60, PropertyType.PT_STRING8); }\n    }\n\n\n    /// <summary>\n    ///     Contains the recipient's other state or provence. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W\n    {\n        get { return new PropertyTag(0x3A62, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's other state or provence. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A\n    {\n        get { return new PropertyTag(0x3A62, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's car telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_CAR_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1E, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's car telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_CAR_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1E, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an alternate telephone number for the recipient. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_OTHER_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A1F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an alternate telephone number for the recipient. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_OTHER_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A1F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a recipient's display name in a secure form that cannot be changed. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_TRANSMITABLE_DISPLAY_NAME_W\n    {\n        get { return new PropertyTag(0x3A20, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a recipient's display name in a secure form that cannot be changed. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TRANSMITABLE_DISPLAY_NAME_A\n    {\n        get { return new PropertyTag(0x3A20, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's pager telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PAGER_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A21, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's pager telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PAGER_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A21, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an ASN.1 authentication certificate for a messaging user.\n    /// </summary>\n    public static PropertyTag PR_USER_CERTIFICATE\n    {\n        get { return new PropertyTag(0x3A22, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's primary fax machine. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PRIMARY_FAX_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A23, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's primary fax machine. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PRIMARY_FAX_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A23, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's business fax machine. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_FAX_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A24, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's business fax machine. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_FAX_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A24, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's home fax machine. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_HOME_FAX_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A25, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's home fax machine. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME_FAX_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A25, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's country/region. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_ADDRESS_COUNTRY_W\n    {\n        get { return new PropertyTag(0x3A26, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's country/region. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_ADDRESS_COUNTRY_A\n    {\n        get { return new PropertyTag(0x3A26, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's locality, such as the town or city. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_ADDRESS_CITY_W\n    {\n        get { return new PropertyTag(0x3A27, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's locality, such as the town or city. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_ADDRESS_CITY_A\n    {\n        get { return new PropertyTag(0x3A27, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's state or province. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_W\n    {\n        get { return new PropertyTag(0x3A28, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's state or province. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE_A\n    {\n        get { return new PropertyTag(0x3A28, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's street address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_ADDRESS_STREET_W\n    {\n        get { return new PropertyTag(0x3A29, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's street address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_ADDRESS_STREET_A\n    {\n        get { return new PropertyTag(0x3A29, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the postal code for the recipient's postal address. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_BUSINESS_ADDRESS_POSTAL_CODE_W\n    {\n        get { return new PropertyTag(0x3A2A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the postal code for the recipient's postal address. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_BUSINESS_ADDRESS_POSTAL_CODE_A\n    {\n        get { return new PropertyTag(0x3A2A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the number or identifier of the recipient's post office box. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_POST_OFFICE_BOX_W\n    {\n        get { return new PropertyTag(0x3A2B, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the number or identifier of the recipient's post office box. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_POST_OFFICE_BOX_A\n    {\n        get { return new PropertyTag(0x3A2B, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's telex number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_TELEX_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A2C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's telex number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_TELEX_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A2C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's ISDN-capable telephone number. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ISDN_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A2D, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the recipient's ISDN-capable telephone number. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ISDN_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A2D, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's administrative assistant. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ASSISTANT_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A2E, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the telephone number of the recipient's administrative assistant. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ASSISTANT_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A2E, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a secondary telephone number at the recipient's home. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_HOME2_TELEPHONE_NUMBER_W\n    {\n        get { return new PropertyTag(0x3A2F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a secondary telephone number at the recipient's home. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_HOME2_TELEPHONE_NUMBER_A\n    {\n        get { return new PropertyTag(0x3A2F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's administrative assistant. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_ASSISTANT_W\n    {\n        get { return new PropertyTag(0x3A30, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's administrative assistant. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_ASSISTANT_A\n    {\n        get { return new PropertyTag(0x3A30, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the recipient can receive all message content, including Rich Text Format (RTF) and Object Linking\n    ///     and Embedding (OLE) objects.\n    /// </summary>\n    public static PropertyTag PR_SEND_RICH_INFO\n    {\n        get { return new PropertyTag(0x3A40, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains the date of a user's wedding anniversary\n    /// </summary>\n    public static PropertyTag PR_WEDDING_ANNIVERSARY\n    {\n        get { return new PropertyTag(0x3A41, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the birtday of the contact\n    /// </summary>\n    public static PropertyTag PR_BIRTHDAY\n    {\n        get { return new PropertyTag(0x3A42, PropertyType.PT_SYSTIME); }\n    }\n\n    /// <summary>\n    ///     Contains the middle name of a contact. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_MIDDLE_NAME_W\n    {\n        get { return new PropertyTag(0x3A44, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the middle name of a contact. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_MIDDLE_NAME_A\n    {\n        get { return new PropertyTag(0x3A44, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the profession of the user.\n    /// </summary>\n    public static PropertyTag PR_PROFESSION_W\n    {\n        get { return new PropertyTag(0x3A46, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the profession of the user.\n    /// </summary>\n    internal static PropertyTag PR_PROFESSION_A\n    {\n        get { return new PropertyTag(0x3A46, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the user's spouse name\n    /// </summary>\n    public static PropertyTag PR_SPOUSE_NAME_W\n    {\n        get { return new PropertyTag(0x3A48, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the user's spouse name\n    /// </summary>\n    internal static PropertyTag PR_SPOUSE_NAME_A\n    {\n        get { return new PropertyTag(0x3A48, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's manager. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_MANAGER_NAME_W\n    {\n        get { return new PropertyTag(0x3A4E, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the name of the recipient's manager. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_MANAGER_NAME_A\n    {\n        get { return new PropertyTag(0x3A4E, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the nickname of the contact. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_NICKNAME_W\n    {\n        get { return new PropertyTag(0x3A4F, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the nickname of the contact. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_NICKNAME_A\n    {\n        get { return new PropertyTag(0x3A4F, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the URL of a user's personal home page. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_PERSONAL_HOME_PAGE_W\n    {\n        get { return new PropertyTag(0x3A50, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///    Contains the URL of a user's personal home page. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_PERSONAL_HOME_PAGE_A\n    {\n        get { return new PropertyTag(0x3A50, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of identifiers of message store providers in the current profile.\n    /// </summary>\n    public static PropertyTag PR_STORE_PROVIDERS\n    {\n        get { return new PropertyTag(0x3D00, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of identifiers for address book providers in the current profile.\n    /// </summary>\n    public static PropertyTag PR_AB_PROVIDERS\n    {\n        get { return new PropertyTag(0x3D01, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of identifiers of transport providers in the current profile.\n    /// </summary>\n    public static PropertyTag PR_TRANSPORT_PROVIDERS\n    {\n        get { return new PropertyTag(0x3D02, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if a messaging user profile is the MAPI default profile.\n    /// </summary>\n    public static PropertyTag PR_DEFAULT_PROFILE\n    {\n        get { return new PropertyTag(0x3D04, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a list of entry identifiers for address book containers that are to be searched to resolve names.\n    /// </summary>\n    public static PropertyTag PR_AB_SEARCH_PATH\n    {\n        get { return new PropertyTag(0x3D05, PropertyType.PT_MV_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the address book container to display first.\n    /// </summary>\n    public static PropertyTag PR_AB_DEFAULT_DIR\n    {\n        get { return new PropertyTag(0x3D06, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of the address book container to use as the personal address book (PAB).\n    /// </summary>\n    public static PropertyTag PR_AB_DEFAULT_PAB\n    {\n        get { return new PropertyTag(0x3D07, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     The MAPI property PR_FILTERING_HOOKS.\n    /// </summary>\n    public static PropertyTag PR_FILTERING_HOOKS\n    {\n        get { return new PropertyTag(0x3D08, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the unicode name of a message service as set by the user in the MapiSvc.inf file.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_NAME_W\n    {\n        get { return new PropertyTag(0x3D09, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the ANSI name of a message service as set by the user in the MapiSvc.inf file.\n    /// </summary>\n    internal static PropertyTag PR_SERVICE_NAME_A\n    {\n        get { return new PropertyTag(0x3D09, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the unicode filename of the DLL containing the message service provider entry point function to call for\n    ///     configuration.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_DLL_NAME_W\n    {\n        get { return new PropertyTag(0x3D0A, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the ANSI filename of the DLL containing the message service provider entry point function to call for\n    ///     configuration.\n    /// </summary>\n    internal static PropertyTag PR_SERVICE_DLL_NAME_A\n    {\n        get { return new PropertyTag(0x3D0A, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the MAPIUID structure for a message service.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_UID\n    {\n        get { return new PropertyTag(0x3D0C, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of MAPIUID structures that identify additional profile sections for the message service.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_EXTRA_UIDS\n    {\n        get { return new PropertyTag(0x3D0D, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a list of identifiers of message services in the current profile.\n    /// </summary>\n    public static PropertyTag PR_SERVICES\n    {\n        get { return new PropertyTag(0x3D0E, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a ANSI list of the files that belong to the message service.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_SUPPORT_FILES_W\n    {\n        get { return new PropertyTag(0x3D0F, PropertyType.PT_MV_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a ANSI list of the files that belong to the message service.\n    /// </summary>\n    internal static PropertyTag PR_SERVICE_SUPPORT_FILES_A\n    {\n        get { return new PropertyTag(0x3D0F, PropertyType.PT_MV_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of unicode filenames that are to be deleted when the message service is uninstalled.\n    /// </summary>\n    public static PropertyTag PR_SERVICE_DELETE_FILES_W\n    {\n        get { return new PropertyTag(0x3D10, PropertyType.PT_MV_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a list of filenames that are to be deleted when the message service is uninstalled.\n    /// </summary>\n    internal static PropertyTag PR_SERVICE_DELETE_FILES_A\n    {\n        get { return new PropertyTag(0x3D10, PropertyType.PT_MV_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains a list of entry identifiers for address book containers explicitly configured by the user.\n    /// </summary>\n    public static PropertyTag PR_AB_SEARCH_PATH_UPDATE\n    {\n        get { return new PropertyTag(0x3D11, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the ANSI name of the profile.\n    /// </summary>\n    internal static PropertyTag PR_PROFILE_NAME_A\n    {\n        get { return new PropertyTag(0x3D12, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the unicode name of the profile.\n    /// </summary>\n    public static PropertyTag PR_PROFILE_NAME_W\n    {\n        get { return new PropertyTag(0x3D12, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for a service provider's identity as defined within a messaging system. UNICODE\n    ///     compilation.\n    /// </summary>\n    public static PropertyTag PR_IDENTITY_DISPLAY_W\n    {\n        get { return new PropertyTag(0x3E00, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains the display name for a service provider's identity as defined within a messaging system. Non-UNICODE\n    ///     compilation.\n    /// </summary>\n    internal static PropertyTag PR_IDENTITY_DISPLAY_A\n    {\n        get { return new PropertyTag(0x3E00, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier for a service provider's identity as defined within a messaging system.\n    /// </summary>\n    public static PropertyTag PR_IDENTITY_ENTRYID\n    {\n        get { return new PropertyTag(0x3E01, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags indicating the methods in the IMAPIStatus interface that are supported by the status\n    ///     object.\n    /// </summary>\n    public static PropertyTag PR_RESOURCE_METHODS\n    {\n        get { return new PropertyTag(0x3E02, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a value indicating the service provider type.\n    /// </summary>\n    public static PropertyTag PR_RESOURCE_TYPE\n    {\n        get { return new PropertyTag(0x3E03, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags indicating the current status of a session resource. All service providers set status\n    ///     codes as does MAPI to report on the status of the subsystem, the MAPI spooler, and the integrated address book.\n    /// </summary>\n    public static PropertyTag PR_STATUS_CODE\n    {\n        get { return new PropertyTag(0x3E04, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the search key for a service provider's identity as defined within a messaging system.\n    /// </summary>\n    public static PropertyTag PR_IDENTITY_SEARCH_KEY\n    {\n        get { return new PropertyTag(0x3E05, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains the entry identifier of a transport's tightly coupled message store.\n    /// </summary>\n    public static PropertyTag PR_OWN_STORE_ENTRYID\n    {\n        get { return new PropertyTag(0x3E06, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a path to the service provider's server. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_RESOURCE_PATH_W\n    {\n        get { return new PropertyTag(0x3E07, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains a path to the service provider's server. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_RESOURCE_PATH_A\n    {\n        get { return new PropertyTag(0x3E07, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII message indicating the current status of a session resource. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_STATUS_STRING_W\n    {\n        get { return new PropertyTag(0x3E08, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII message indicating the current status of a session resource. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_STATUS_STRING_A\n    {\n        get { return new PropertyTag(0x3E08, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain TRUE if the message transfer system (MTS) allows X.400 deferred delivery\n    ///     cancellation. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_X400_DEFERRED_DELIVERY_CANCEL\n    {\n        get { return new PropertyTag(0x3E09, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Was originally meant to contain the entry identifier that a remote transport provider furnishes for its header\n    ///     folder. No longer supported.\n    /// </summary>\n    public static PropertyTag PR_HEADER_FOLDER_ENTRYID\n    {\n        get { return new PropertyTag(0x3E0A, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a number indicating the status of a remote transfer.\n    /// </summary>\n    public static PropertyTag PR_REMOTE_PROGRESS\n    {\n        get { return new PropertyTag(0x3E0B, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII string indicating the status of a remote transfer. UNICODE compilation.\n    /// </summary>\n    public static PropertyTag PR_REMOTE_PROGRESS_TEXT_W\n    {\n        get { return new PropertyTag(0x3E0C, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Contains an ASCII string indicating the status of a remote transfer. Non-UNICODE compilation.\n    /// </summary>\n    internal static PropertyTag PR_REMOTE_PROGRESS_TEXT_A\n    {\n        get { return new PropertyTag(0x3E0C, PropertyType.PT_STRING8); }\n    }\n\n    /// <summary>\n    ///     Contains TRUE if the remote viewer is allowed to call the IMAPIStatus::ValidateState method.\n    /// </summary>\n    public static PropertyTag PR_REMOTE_VALIDATE_OK\n    {\n        get { return new PropertyTag(0x3E0D, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Contains a bitmask of flags governing the behavior of a control used in a dialog box built from a display table.\n    /// </summary>\n    public static PropertyTag PR_CONTROL_FLAGS\n    {\n        get { return new PropertyTag(0x3F00, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a pointer to a structure for a control used in a dialog box.\n    /// </summary>\n    public static PropertyTag PR_CONTROL_STRUCTURE\n    {\n        get { return new PropertyTag(0x3F01, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Contains a value indicating a control type for a control used in a dialog box.\n    /// </summary>\n    public static PropertyTag PR_CONTROL_TYPE\n    {\n        get { return new PropertyTag(0x3F02, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the width of a dialog box control in standard Windows dialog units.\n    /// </summary>\n    public static PropertyTag PR_DELTAX\n    {\n        get { return new PropertyTag(0x3F03, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the height of a dialog box control in standard Windows dialog units.\n    /// </summary>\n    public static PropertyTag PR_DELTAY\n    {\n        get { return new PropertyTag(0x3F04, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the x coordinate of the starting position (the upper-left corner) of a dialog box control, in standard\n    ///     Windows dialog units.\n    /// </summary>\n    public static PropertyTag PR_XPOS\n    {\n        get { return new PropertyTag(0x3F05, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the y coordinate of the starting position (the upper-left corner) of a dialog box control, in standard\n    ///     Windows dialog units.\n    /// </summary>\n    public static PropertyTag PR_YPOS\n    {\n        get { return new PropertyTag(0x3F06, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains a unique identifier for a control used in a dialog box.\n    /// </summary>\n    public static PropertyTag PR_CONTROL_ID\n    {\n        get { return new PropertyTag(0x3F07, PropertyType.PT_BINARY); }\n    }\n\n    /// <summary>\n    ///     Indicates the page of a display template to display first.\n    /// </summary>\n    public static PropertyTag PR_INITIAL_DETAILS_PANE\n    {\n        get { return new PropertyTag(0x3F08, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Contains the Windows LCID of the end user who created this message.\n    /// </summary>\n    public static PropertyTag PR_MESSAGE_LOCALE_ID\n    {\n        get { return new PropertyTag(0x3F08, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Indicates the code page used for <see cref=\"PropertyTags.PR_BODY_W\" /> (PidTagBody) or \n    ///     <see cref=\"PropertyTags.PR_HTML\" /> (PidTagBodyHtml) properties.\n    /// </summary>\n    public static PropertyTag PR_INTERNET_CPID\n    {\n        get { return new PropertyTag(0x3FDE, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     The creators address type\n    /// </summary>\n    public static PropertyTag PR_CreatorAddrType_W\n    {\n        get { return new PropertyTag(0x4022, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     The creators e-mail address\n    /// </summary>\n    public static PropertyTag PR_CreatorEmailAddr_W\n    {\n        get { return new PropertyTag(0x4023, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     The creators display name\n    /// </summary>\n    public static PropertyTag PR_CreatorSimpleDispName_W\n    {\n        get { return new PropertyTag(0x4038, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     The senders display name\n    /// </summary>\n    public static PropertyTag PR_SenderSimpleDispName_W\n    {\n        get { return new PropertyTag(0x4030, PropertyType.PT_UNICODE); }\n    }\n\n    /// <summary>\n    ///     Indicates the type of Message object to which this attachment is linked.\n    /// </summary>\n    /// <remarks>\n    ///     Must be 0, unless overridden by other protocols that extend the \n    ///     Message and Attachment Object Protocol as noted in [MS-OXCMSG].\n    /// </remarks>\n    public static PropertyTag PR_ATTACHMENT_LINKID\n    {\n        get { return new PropertyTag(0x7FFA, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Indicates special handling for this Attachment object.\n    /// </summary>\n    /// <remarks>\n    ///     Must be 0x00000000, unless overridden by other protocols that extend the Message \n    ///     and Attachment Object Protocol as noted in [MS-OXCMSG]\n    /// </remarks>\n    public static PropertyTag PR_ATTACHMENT_FLAGS\n    {\n        get { return new PropertyTag(0x7FFD, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Indicates whether an attachment is hidden from the end user.\n    /// </summary>\n    public static PropertyTag PR_ATTACHMENT_HIDDEN\n    {\n        get { return new PropertyTag(0x7FFE, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Specifies the format for an editor to use to display a message.\n    /// </summary>\n    /// <remarks>\n    ///     By default, mail messages (with the message class IPM.Note or with a custom message \n    ///     class derived from IPM.Note) sent from a POP3/SMTP mail account are sent in the Transport \n    ///     Neutral Encapsulation Format (TNEF). The PR_MSG_EDITOR_FORMAT property can be used to enforce \n    ///     only plain text, and not TNEF, when sending a message. If PR_MSG_EDITOR_FORMAT is set to \n    ///     EDITOR_FORMAT_PLAINTEXT, the message is sent as plain text without TNEF. If PR_MSG_EDITOR_FORMAT \n    ///     is set to EDITOR_FORMAT_RTF, TNEF encoding is implicitly enabled, and the message is sent by using \n    ///     the default Internet format that is specified in the Outlook client.\n    /// </remarks>\n    public static PropertyTag PR_MSG_EDITOR_FORMAT\n    {\n        get { return new PropertyTag(0x5909, PropertyType.PT_LONG); }\n    }\n\n    /// <summary>\n    ///     Indicates the existence of a photo attachment for a contact.\n    /// </summary>\n    public static PropertyTag PR_ATTACHMENT_CONTACTPHOTO\n    {\n        get { return new PropertyTag(0x7FFF, PropertyType.PT_BOOLEAN); }\n    }\n\n    /// <summary>\n    ///     Used to hold exactly one property tag\n    /// </summary>\n    public class PropertyTag\n    {\n        #region Properties\n        /// <summary>\n        ///     The 2 byte identifier\n        /// </summary>\n        public ushort Id { get; }\n\n        /// <summary>\n        ///     The 2 byte <see cref=\"PropertyType\" />\n        /// </summary>\n        public PropertyType Type { get; }\n\n        /// <summary>\n        ///     Returns the PropertyTag as a readable string, e.g. __substg1.0_0037001F\n        /// </summary>\n        /// <returns></returns>\n        public string Name\n        {\n            get { return SubStorageStreamPrefix + Id.ToString(\"X4\") + ((ushort)Type).ToString(\"X4\"); }\n        }\n        #endregion\n\n        #region Constructor\n        /// <summary>\n        ///     Creates this object and sets all its properties\n        /// </summary>\n        /// <param name=\"id\">The id</param>\n        /// <param name=\"type\">The <see cref=\"PropertyType\" /></param>\n        internal PropertyTag(ushort id, PropertyType type)\n        {\n            Id = id;\n            Type = type;\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "MsgKit/Receiving.cs",
    "content": "﻿//\n// Receiving.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Enums;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\n\nnamespace MsgKit;\n\n#region Constructor\n/// <summary>\n///     Contains the e-mail address for the messaging user who receives the message.\n/// </summary>\n/// <remarks>\n///     These properties are examples of the address properties for the messaging user who receives the message. They must\n///     be set by the incoming transport provider.\n/// </remarks>\npublic class Receiving : Address\n{\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"Address.AddressType\" /></param>\n    public Receiving(string email, string displayName, AddressType addressType = AddressType.Smtp)\n        : base(email, displayName, addressType)\n    {\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream, this depends on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"propertiesStream\">The <see cref=\"TopLevelProperties\"/></param>\n    internal void WriteProperties(TopLevelProperties propertiesStream)\n    {\n        propertiesStream.AddProperty(PropertyTags.PR_RECEIVED_BY_EMAIL_ADDRESS_W, Email);\n        propertiesStream.AddProperty(PropertyTags.PR_RECEIVED_BY_NAME_W, DisplayName);\n        propertiesStream.AddProperty(PropertyTags.PR_RECEIVED_BY_ADDRTYPE_W, AddressTypeString);\n    }\n    #endregion\n}\n#endregion"
  },
  {
    "path": "MsgKit/ReceivingRepresenting.cs",
    "content": "﻿//\n// ReceivingRepresenting.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Enums;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\n\nnamespace MsgKit;\n\n/// <summary>\n///     Contains the e-mail address for the messaging user who is represented by the receiving user.\n/// </summary>\n/// <remarks>\n///     These properties are examples of the address properties for the messaging user who is being represented by the\n///     receiving user. They must be set by the incoming transport provider, which is also responsible for authorization or\n///     verification of the delegate. If no messaging user is being represented, these properties should be set to the\n///     e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n/// </remarks>\npublic class ReceivingRepresenting : Address\n{\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"Address.AddressType\" /></param>\n    public ReceivingRepresenting(string email, string displayName, AddressType addressType = AddressType.Smtp)\n        : base(email, displayName, addressType)\n    {\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream, this depends on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"propertiesStream\">The <see cref=\"TopLevelProperties\"/></param>\n    internal void WriteProperties(TopLevelProperties propertiesStream)\n    {\n        propertiesStream.AddProperty(PropertyTags.PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W, Email);\n        propertiesStream.AddProperty(PropertyTags.PR_RCVD_REPRESENTING_NAME_W, DisplayName);\n        propertiesStream.AddProperty(PropertyTags.PR_RCVD_REPRESENTING_ADDRTYPE_W, AddressTypeString);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Recipient.cs",
    "content": "﻿//\n// Recipient.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.Collections.Generic;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit;\n\n/// <summary>\n///     Contains a list of <see cref=\"Recipients\"/> objects that are added to a <see cref=\"Message\"/>\n/// </summary>\npublic class Recipients : List<Recipient>\n{\n    #region Add\n    /// <summary>\n    ///     Adds an <see cref=\"RecipientType.To\"/> <see cref=\"Recipient\"/>\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\"/></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\"/></param>\n    /// <param name=\"objectType\"><see cref=\"MapiObjectType\"/></param>\n    /// <param name=\"displayType\"><see cref=\"RecipientRowDisplayType\"/></param>\n    public void AddTo(string email,\n        string displayName = \"\",\n        AddressType addressType = AddressType.Smtp,\n        MapiObjectType objectType = MapiObjectType.MAPI_MAILUSER,\n        RecipientRowDisplayType displayType = RecipientRowDisplayType.MessagingUser)\n    {\n        Add(new Recipient(Count,\n            email,\n            displayName,\n            addressType,\n            RecipientType.To,\n            objectType,\n            displayType\n        ));\n    }\n\n    /// <summary>\n    ///     Adds an <see cref=\"RecipientType.Cc\"/> <see cref=\"Recipient\"/>\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\"/></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\"/></param>\n    /// <param name=\"objectType\"><see cref=\"MapiObjectType\"/></param>\n    /// <param name=\"displayType\"><see cref=\"RecipientRowDisplayType\"/></param>\n    public void AddCc(string email,\n        string displayName = \"\",\n        AddressType addressType = AddressType.Smtp,\n        MapiObjectType objectType = MapiObjectType.MAPI_MAILUSER,\n        RecipientRowDisplayType displayType = RecipientRowDisplayType.MessagingUser)\n    {\n        Add(new Recipient(Count,\n            email,\n            displayName,\n            addressType,\n            RecipientType.Cc,\n            objectType,\n            displayType));\n    }\n\n    /// <summary>\n    ///     Adds an <see cref=\"RecipientType.Bcc\"/> <see cref=\"Recipient\"/>\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\"/></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\"/></param>\n    /// <param name=\"objectType\"><see cref=\"MapiObjectType\"/></param>\n    /// <param name=\"displayType\"><see cref=\"RecipientRowDisplayType\"/></param>\n    public void AddBcc(string email,\n        string displayName = \"\",\n        AddressType addressType = AddressType.Smtp,\n        MapiObjectType objectType = MapiObjectType.MAPI_MAILUSER,\n        RecipientRowDisplayType displayType = RecipientRowDisplayType.MessagingUser)\n    {\n        Add(new Recipient(Count,\n            email,\n            displayName,\n            addressType,\n            RecipientType.Bcc,\n            objectType,\n            displayType));\n    }\n\n    /// <summary>\n    ///     Adds an <see cref=\"Recipient\"/>\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\"/></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\"/></param>\n    /// <param name=\"recipientType\">The <see cref=\"RecipientType\"/></param>\n    /// <param name=\"objectType\"><see cref=\"MapiObjectType\"/></param>\n    /// <param name=\"displayType\"><see cref=\"RecipientRowDisplayType\"/></param>\n    public void AddRecipient(string email,\n        string displayName,\n        AddressType addressType,\n        RecipientType recipientType,\n        MapiObjectType objectType = MapiObjectType.MAPI_MAILUSER,\n        RecipientRowDisplayType displayType = RecipientRowDisplayType.MessagingUser)\n    {\n        Add(new Recipient(Count,\n            email,\n            displayName,\n            addressType,\n            recipientType,\n            objectType,\n            displayType));\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes the <see cref=\"Recipient\"/> objects to the given <paramref name=\"rootStorage\"/>\n    ///     and it will set all the needed properties\n    /// </summary>\n    /// <param name=\"rootStorage\">The root <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Recipient\"/> objects and it's <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteToStorage(Storage rootStorage)\n    {\n        long size = 0;\n\n        for (var index = 0; index < Count; index++)\n        {\n            var recipient = this[index];\n            var storage = rootStorage.CreateStorage(PropertyTags.RecipientStoragePrefix + index.ToString(\"X8\").ToUpper());\n            size += recipient.WriteProperties(storage);\n        }\n\n        return size;\n    }\n    #endregion\n}\n\n/// <summary>\n///     This class represents a recipient\n/// </summary>\npublic class Recipient : Address\n{\n    #region Properties\n    /// <summary>\n    ///     Returns or sets a unique identifier for a recipient in a recipient table or status table.\n    /// </summary>\n    public long RowId { get; }\n\n    /// <summary>\n    ///     The <see cref=\"RecipientType\"/>\n    /// </summary>\n    public RecipientType RecipientType { get; }\n\n    /// <summary>\n    ///     The <see cref=\"RecipientFlags\"/>\n    /// </summary>\n    // ReSharper disable once UnusedAutoPropertyAccessor.Local\n    public RecipientFlags Flags { get; private set; }\n\n    /// <summary>\n    /// Contains the type of email object. \n    /// </summary>\n    public MapiObjectType ObjectType { get; }\n\n    /// <summary>\n    /// Contains the display type. \n    /// </summary>\n    public RecipientRowDisplayType DisplayType { get; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates a new recipient object and sets all its properties\n    /// </summary>\n    /// <param name=\"rowId\">Contains a unique identifier for a recipient in a recipient table or status table.</param>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\"/></param>\n    /// <param name=\"recipientType\">The <see cref=\"RecipientType\"/></param>\n    /// <param name=\"addressType\">The <see cref=\"AddressType\"/></param>\n    /// <param name=\"objectType\"><see cref=\"MapiObjectType\"/></param>\n    /// <param name=\"displayType\"><see cref=\"RecipientRowDisplayType\"/></param>\n    internal Recipient(long rowId,\n        string email,\n        string displayName,\n        AddressType addressType,\n        RecipientType recipientType,\n        MapiObjectType objectType,\n        RecipientRowDisplayType displayType) : base(email, displayName, addressType)\n    {\n        RowId = rowId;\n        Email = email;\n        DisplayName = string.IsNullOrWhiteSpace(displayName) ? email : displayName;\n        AddressType = addressType;\n        RecipientType = recipientType;\n        DisplayType = displayType;\n        ObjectType = objectType;\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given <paramref name=\"storage\"/>, this depends \n    ///     on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Recipient\"/> object and it's <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage)\n    {\n        var propertiesStream = new RecipientProperties();\n        propertiesStream.AddProperty(PropertyTags.PR_ROWID, RowId);\n        propertiesStream.AddProperty(PropertyTags.PR_ENTRYID, Mapi.GenerateEntryId());\n        propertiesStream.AddProperty(PropertyTags.PR_INSTANCE_KEY, Mapi.GenerateInstanceKey());\n        propertiesStream.AddProperty(PropertyTags.PR_RECIPIENT_TYPE, RecipientType);\n        propertiesStream.AddProperty(PropertyTags.PR_ADDRTYPE_W, AddressTypeString);\n        propertiesStream.AddProperty(PropertyTags.PR_EMAIL_ADDRESS_W, Email);\n        propertiesStream.AddProperty(PropertyTags.PR_OBJECT_TYPE, ObjectType);\n        propertiesStream.AddProperty(PropertyTags.PR_DISPLAY_TYPE, DisplayType);\n        propertiesStream.AddProperty(PropertyTags.PR_DISPLAY_NAME_W, DisplayName);\n        propertiesStream.AddProperty(PropertyTags.PR_SEARCH_KEY, Mapi.GenerateSearchKey(AddressTypeString, Email));\n        return propertiesStream.WriteProperties(storage);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Representing.cs",
    "content": "﻿//\n// Represents.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Enums;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\n\nnamespace MsgKit;\n\n/// <summary>\n///     Contains the e-mail address for the messaging user represented by the sender.\n/// </summary>\n/// <remarks>\n///     These properties are examples of the address properties for the messaging user who is being represented by the\n///     <see cref=\"Receiving\" /> user. They must be set by the incoming transport provider, which is also responsible for\n///     authorization or\n///     verification of the delegate. If no messaging user is being represented, these properties should be set to the\n///     e-mail address contained in the PR_RECEIVED_BY_EMAIL_ADDRESS (PidTagReceivedByEmailAddress) property.\n/// </remarks>\npublic class Representing : Address\n{\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"Address.AddressType\" /></param>\n    public Representing(string email, string displayName, AddressType addressType = AddressType.Smtp)\n        : base(email, displayName, addressType)\n    {\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream, this depends on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"propertiesStream\">The <see cref=\"TopLevelProperties\"/></param>\n    internal void WriteProperties(TopLevelProperties propertiesStream)\n    {\n        propertiesStream.AddProperty(PropertyTags.PR_SENT_REPRESENTING_EMAIL_ADDRESS_W, Email);\n        propertiesStream.AddProperty(PropertyTags.PR_SENT_REPRESENTING_NAME_W, DisplayName);\n        propertiesStream.AddProperty(PropertyTags.PR_SENT_REPRESENTING_ADDRTYPE_W, AddressTypeString);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Rtf/Compressor.cs",
    "content": "﻿//\n// RtfCompressor.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing System.Text;\nusing MsgKit.Helpers;\n\nnamespace MsgKit.Rtf;\n\n/// <summary>\n/// Used to compress RTF using LZFu by Microsoft.  Can be viewed in the [MS-OXRTFCP].pdf document. \n/// https://msdn.microsoft.com/en-us/library/cc463890(v=exchg.80).aspx\n/// </summary>\ninternal class Compressor\n{\n    #region CompressionPosition Class\n    /// <summary>\n    /// Holder for compression positions, aren't relevant to other parts of the project thus inside of RTFCompressor class. \n    /// </summary>\n    internal class CompressionPositions\n    {\n        public int DictionaryOffset { get; set; }\n        public int LongestMatchLength;\n        public int WriteOffset { get; set; }\n    }\n    #endregion\n\n    #region Consts\n    private const int InitDictSize = 207;\n    private const int MaxDictSize = 4096;\n    private const string CompType = \"LZFu\";\n    #endregion\n\n    #region Fields\n    private readonly byte[] _initialDictionary;\n    #endregion\n\n    #region Constructor\n    internal Compressor()\n    {\n        var builder = new StringBuilder();\n        builder.Append(@\"{\\rtf1\\ansi\\mac\\deff0\\deftab720{\\fonttbl;}\");\n        builder.Append(@\"{\\f0\\fnil \\froman \\fswiss \\fmodern \\fscript \");\n        builder.Append(@\"\\fdecor MS Sans SerifSymbolArialTimes New RomanCourier{\\colortbl\\red0\\green0\\blue0\");\n        builder.Append(\"\\r\\n\");\n        builder.Append(@\"\\par \\pard\\plain\\f0\\fs20\\b\\i\\u\\tab\\tx\");\n        _initialDictionary = Encoding.UTF8.GetBytes(builder.ToString());\n        Array.Resize(ref _initialDictionary, MaxDictSize);\n    }\n    #endregion\n\n    #region FindLongestMatch\n    /// <summary>\n    /// Helper function\n    /// </summary>\n    /// <param name=\"initialDictionary\">Part of the MS-OXRTFCP spec. </param>\n    /// <param name=\"streamReader\">BinaryReader which is pointing at the input data. </param>\n    /// <param name=\"writeOffset\">Write offset</param>\n    /// <returns> CompressionPositions class containing DictionaryOffset, LongestMatchLength, WriteOffset</returns>\n    internal CompressionPositions FindLongestMatch(byte[] initialDictionary, BinaryReader streamReader,\n        int writeOffset)\n    {\n        var readCharacter = streamReader.Read();\n        var positionData = new CompressionPositions { WriteOffset = writeOffset };\n        if (readCharacter == -1)\n            return positionData;\n\n        var previousWriteOffset = writeOffset;\n        var matchLength = 0;\n        var dictionaryIndex = 0;\n\n        while (true)\n        {\n            if (initialDictionary[dictionaryIndex % MaxDictSize] == readCharacter)\n            {\n                if (++matchLength <= 17 && matchLength > positionData.LongestMatchLength)\n                {\n                    positionData.DictionaryOffset = dictionaryIndex - matchLength + 1;\n                    initialDictionary[positionData.WriteOffset] = Convert.ToByte(readCharacter);\n                    positionData.WriteOffset = (positionData.WriteOffset + 1) % MaxDictSize;\n                    positionData.LongestMatchLength = matchLength;\n                }\n\n                if ((readCharacter = streamReader.Read()) == -1)\n                {\n                    streamReader.BaseStream.Seek(streamReader.BaseStream.Position - matchLength, SeekOrigin.Begin);\n                    return positionData;\n                }\n            }\n            else\n            {\n                streamReader.BaseStream.Seek(streamReader.BaseStream.Position - matchLength - 1, SeekOrigin.Begin);\n                matchLength = 0;\n                if ((readCharacter = streamReader.Read()) == -1)\n                    break;\n            }\n\n            if (++dictionaryIndex >= previousWriteOffset + positionData.LongestMatchLength)\n                break;\n        }\n\n        streamReader.BaseStream.Seek(streamReader.BaseStream.Position - matchLength - 1, 0);\n        return positionData;\n    }\n    #endregion\n\n    #region Compress\n    /// <summary>\n    /// Takes in data, compresses it using LZFu. Returns the data as a byte array. \n    /// </summary>\n    /// <param name=\"data\">Byte array containing data to be compressed.</param>\n    /// <returns>Byte array containing the data that is compressed.</returns>\n    internal byte[] Compress(byte[] data)\n    {\n        using (var inStream = new MemoryStream(data))\n        using (var binaryReader = new BinaryReader(inStream))\n        {\n            var positionData = new CompressionPositions { WriteOffset = InitDictSize };\n            var controlByte = 0;\n            var controlBit = 1;\n            var tokenOffset = 0;\n\n        using (var outStream = new MemoryStream())\n        using (var tokenStream = new MemoryStream())\n        {\n            while (true)\n            {\n                int dictReference;\n                positionData = FindLongestMatch(_initialDictionary, binaryReader, positionData.WriteOffset);\n\n                    if (binaryReader.PeekChar() < 0)\n                    {\n                        controlByte |= 1 << controlBit - 1;\n                        tokenOffset += 2;\n                        dictReference = (positionData.WriteOffset & 0xFFF) << 4;\n                        var bytes = BitConverter.GetBytes((ushort)dictReference);\n                        Array.Reverse(bytes);\n                        tokenStream.Write(bytes, 0, 2);\n                        outStream.WriteByte((byte)controlByte);\n                        outStream.Write(tokenStream.ToArray(), 0, tokenOffset);\n                        break;\n                    }\n\n                    var readChar = binaryReader.ReadBytes(positionData.LongestMatchLength > 1\n                        ? positionData.LongestMatchLength\n                        : 1);\n                    if (positionData.LongestMatchLength > 1)\n                    {\n                        controlByte |= 1 << controlBit - 1;\n                        controlBit++;\n                        tokenOffset += 2;\n                        dictReference = (positionData.DictionaryOffset & 0xFFF) << 4 |\n                                        positionData.LongestMatchLength - 2 & 0xf;\n                        var bytes = BitConverter.GetBytes((ushort)dictReference);\n                        Array.Reverse(bytes);\n                        tokenStream.Write(bytes, 0, 2);\n                    }\n                    else\n                    {\n                        if (positionData.LongestMatchLength == 0)\n                        {\n                            _initialDictionary[positionData.WriteOffset] = Convert.ToByte(readChar[0]);\n                            positionData.WriteOffset = (positionData.WriteOffset + 1) % MaxDictSize;\n                        }\n\n                        // ReSharper disable once ShiftExpressionZeroLeftOperand\n                        controlByte |= 0 << controlBit - 1;\n                        controlBit++;\n                        tokenOffset++;\n                        tokenStream.Write(readChar, 0, readChar.Length);\n                    }\n\n                positionData.LongestMatchLength = 0;\n\n                    if (controlBit > 8)\n                    {\n                        outStream.WriteByte((byte)controlByte);\n                        outStream.Write(tokenStream.ToArray(), 0, tokenOffset);\n                        controlByte = 0;\n                        controlBit = 1;\n                        tokenOffset = 0;\n                        tokenStream.SetLength(0);\n                    }\n                }\n\n                var compSize = (uint)outStream.Length + 12;\n                var rawSize = (uint)data.Length;\n                var crcValue = Crc32Calculator.CalculateCrc32(outStream.ToArray());\n\n            using (var resultStream = new MemoryStream())\n            {\n                resultStream.Write(BitConverter.GetBytes(compSize), 0, BitConverter.GetBytes(compSize).Length);\n                resultStream.Write(BitConverter.GetBytes(rawSize), 0, BitConverter.GetBytes(rawSize).Length);\n                resultStream.Write(Encoding.UTF8.GetBytes(CompType), 0,\n                    Encoding.UTF8.GetBytes(CompType).Length);\n                resultStream.Write(BitConverter.GetBytes(crcValue), 0, BitConverter.GetBytes(crcValue).Length);\n                resultStream.Write(outStream.ToArray(), 0, outStream.ToArray().Length);\n                return resultStream.ToArray();\n            }\n        }\n    }\n}\n#endregion\n}"
  },
  {
    "path": "MsgKit/Rtf/Encapsulator.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text;\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit.Rtf\n{\n    /// <summary>\n    ///     A class used to encapsulate HTML into RTF\n    /// </summary>\n    internal static class Encapsulator\n    {\n        /// <summary>\n        ///     Encapsulates the given <paramref name=\"html\"/> into RTF\n        /// </summary>\n        /// <param name=\"html\"></param>\n        /// <returns></returns>\n        internal static string Encapsulate(string html)\n        {\n            // Convert Unicode string to RTF according to specification\n            var rtf = new StringBuilder();\n\n            rtf.AppendLine($@\"{{\\rtf1\\ANSI\\ansicpg{Encoding.Default.CodePage}\\fromhtml1 \\deff0\");\n            //rtf.AppendLine(@\"{\\fonttbl {\\f0\\fmodern Courier New;}}\");\n            //rtf.AppendLine(@\"{\\colortbl\\red0\\green0\\blue0;\\red0\\green0\\blue255;}\");\n            rtf.AppendLine(@\"{\\*\\htmltag64}\");\n            rtf.Append(@\"{\\*\\htmltag \");\n\n            //var matches = Regex.Matches(html, @\"(?<=\\\\u-?)\\d{5}\\b\", RegexOptions.Compiled);\n            //foreach (var match in matches)\n            //{\n            //    var value = int.Parse(match.ToString());\n            //    html = html.Replace($@\"\\u-{value}\", $\"&#x{value:X4};\")\n            //        .Replace($@\"\\u{value}\", $\"&#x{value:X4};\");\n            //}\n\n            var escapedChars = new int[] { '{', '}', '\\\\' };\n\n            foreach (var chr in html)\n            {\n                var intChar = Convert.ToInt32(chr);\n\n                switch (intChar)\n                {\n                    case 9:\n                        rtf.Append(@\"\\tab \");\n                        continue;\n                    \n                    case 13:\n                        rtf.AppendLine(@\"\\par\");\n                        continue;\n                  \n                    default:\n                    {\n                        if (intChar < 31)\n                            continue;\n\n                        break;\n                    }\n                }\n\n                if (intChar <= 127)\n                {\n                    if (escapedChars.Contains(intChar))\n                        rtf.Append('\\\\');\n\n                    rtf.Append(chr);\n                }\n                else if (intChar <= 255)\n                    rtf.Append(\"\\\\'\" + intChar.ToString(\"X2\"));\n                else\n                {\n                    rtf.Append(\"\\\\u\");\n                    rtf.Append(intChar);\n                    rtf.Append('?');\n                }\n            }\n            \n            rtf.AppendLine(\" }}\");\n            return rtf.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "MsgKit/Sender.cs",
    "content": "﻿//\n// Sender.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing MsgKit.Enums;\nusing MsgKit.Streams;\nusing MsgKit.Structures;\n\nnamespace MsgKit;\n\n/// <summary>\n///     Contains the message sender's e-mail address.\n/// </summary>\n/// <remarks>\n///     These properties are examples of the address properties for the message sender. They must be set by the outgoing\n///     transport provider, which should never propagate any previously existing values.\n/// </remarks>\npublic class Sender : Address\n{\n    #region Fields\n    /// <summary>\n    ///     <see cref=\"MessageFormat\" />\n    /// </summary>\n    private readonly MessageFormat _messageFormat;\n\n    /// <summary>\n    ///     A flag that indicates whether the server can look up an address in the\n    ///     address book\n    /// </summary>\n    private readonly bool _canLookupEmailAddress;\n\n    /// <summary>\n    ///     Set to <c>true</c> when the sender is also the creator of the message (default <c>true</c>)\n    /// </summary>\n    private readonly bool _senderIsCreator;\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"Address.AddressType\" /></param>\n    /// <param name=\"messageFormat\"><see cref=\"MessageFormat\"/></param>\n    /// <param name=\"canLookupEmailAddress\">Indicates that the <paramref name=\"email\"/> address \n    /// can be lookup in the addressbook. This parameter is only usefull when opening E-mails in an Exchange environment</param>\n    /// <param name=\"senderIsCreator\">Set to <c>true</c> when the sender is also the creator of the message (default <c>true</c>)</param>\n    public Sender(string email,\n        string displayName,\n        AddressType addressType = AddressType.Smtp,\n        MessageFormat messageFormat = MessageFormat.TextAndHtml,\n        bool canLookupEmailAddress = false,\n        bool senderIsCreator = true)\n        : base(email, displayName, addressType)\n    {\n        _messageFormat = messageFormat;\n        _canLookupEmailAddress = canLookupEmailAddress;\n        _senderIsCreator = senderIsCreator;\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream, this depends on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"propertiesStream\">The <see cref=\"TopLevelProperties\"/></param>\n    internal void WriteProperties(TopLevelProperties propertiesStream)\n    {\n        if (_senderIsCreator)\n        {\n            propertiesStream.AddProperty(PropertyTags.PR_CreatorEmailAddr_W, Email);\n            propertiesStream.AddProperty(PropertyTags.PR_CreatorSimpleDispName_W, DisplayName);\n            propertiesStream.AddProperty(PropertyTags.PR_CreatorAddrType_W, AddressTypeString);\n        }\n\n        var senderEntryId = new OneOffEntryId(Email,\n            DisplayName,\n            AddressType,\n            _messageFormat,\n            _canLookupEmailAddress);\n\n        propertiesStream.AddProperty(PropertyTags.PR_SENDER_ENTRYID, senderEntryId.ToByteArray());\n\n        propertiesStream.AddProperty(PropertyTags.PR_SENDER_EMAIL_ADDRESS_W, Email);\n        propertiesStream.AddProperty(PropertyTags.PR_SENDER_NAME_W, DisplayName);\n        propertiesStream.AddProperty(PropertyTags.PR_SENDER_ADDRTYPE_W, AddressTypeString);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/AttachmentProperties.cs",
    "content": "﻿//\n// AttachmentProperties.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.IO;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The properties stream contained inside an Attachment storage object\n/// </summary>\ninternal sealed class AttachmentProperties : Properties\n{\n    #region ReadProperties\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal AttachmentProperties()\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and reads all the <see cref=\"Property\">properties</see> from \n    ///     the given <see cref=\"CfbStream\"/>\n    /// </summary>\n    /// <param name=\"stream\">The <see cref=\"CfbStream\"/></param>\n    internal AttachmentProperties(CfbStream stream)\n    {\n        using var binaryReader = new BinaryReader(stream);\n        binaryReader.ReadBytes(8);\n        ReadProperties(binaryReader);\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given storage, this depends \n    ///     on the <see cref=\"Enums.PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage)\n    {\n        using var memoryStream = new MemoryStream();\n        using var binaryWriter = new BinaryWriter(memoryStream);\n        // Reserved (8 bytes): This field MUST be set to zero when writing a .msg file and MUST be ignored when reading a .msg file.\n        binaryWriter.Write(new byte[8]);\n        return WriteProperties(storage, binaryWriter);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/EmbeddedMessageProperties.cs",
    "content": "﻿//\n// EmbeddedMessageProperties.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The properties stream contained inside an Embedded Message storage object\n/// </summary>\ninternal sealed class EmbeddedMessageProperties : Properties\n{\n    #region Properties\n    /// <summary>\n    ///     The ID to use for naming the next Recipient object storage if one is created inside the .msg file\n    /// </summary>\n    internal int NextRecipientId { get; }\n\n    /// <summary>\n    ///     The ID to use for naming the next Attachment object storage if one is created inside the .msg file\n    /// </summary>\n    internal int NextAttachmentId { get; }\n\n    /// <summary>\n    ///     The number of Recipient objects\n    /// </summary>\n    internal int RecipientCount { get; }\n\n    /// <summary>\n    ///     The number of Attachment objects\n    /// </summary>\n    internal int AttachmentCount { get; }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Creates this object and sets all its properties\n    /// </summary>\n    /// <param name=\"nextRecipientId\">\n    ///     The ID to use for naming the next Recipient object storage if one is created inside the\n    ///     .msg file. If no Recipient object storages are contained in the .msg file, this field MUST be set to 0\n    /// </param>\n    /// <param name=\"nextAttachmentId\">\n    ///     The ID to use for naming the next Attachment object storage if one is created inside the\n    ///     .msg file. If no Attachment object storages are contained in the .msg file, this field MUST be set to 0\n    /// </param>\n    /// <param name=\"recipientCount\">The number of Recipient objects</param>\n    /// <param name=\"attachmentCount\">The number of Attachment objects</param>\n    internal EmbeddedMessageProperties(int nextRecipientId,\n        int nextAttachmentId,\n        int recipientCount,\n        int attachmentCount)\n    {\n        NextRecipientId = nextRecipientId;\n        NextAttachmentId = nextAttachmentId;\n        RecipientCount = recipientCount;\n        AttachmentCount = attachmentCount;\n    }\n\n    /// <summary>\n    ///     Create this object and reads all the <see cref=\"Property\">properties</see> from \n    ///     the given <see cref=\"CfbStream\"/>\n    /// </summary>\n    /// <param name=\"stream\">The <see cref=\"CfbStream\"/></param>\n    internal EmbeddedMessageProperties(CfbStream stream)\n    {\n        using var binaryReader = new BinaryReader(stream);\n        binaryReader.ReadBytes(8);\n        NextRecipientId = Convert.ToInt32(binaryReader.ReadUInt32());\n        NextAttachmentId = Convert.ToInt32(binaryReader.ReadUInt32());\n        RecipientCount = Convert.ToInt32(binaryReader.ReadUInt32());\n        AttachmentCount = Convert.ToInt32(binaryReader.ReadUInt32());\n        ReadProperties(binaryReader);\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given <paramref name=\"storage\"/>, this depends \n    ///     on the <see cref=\"Enums.PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage)\n    {\n        using var memoryStream = new MemoryStream();\n        using var binaryWriter = new BinaryWriter(memoryStream);\n        // Reserved(8 bytes): This field MUST be set to zero when writing a .msg file and MUST be \n        // ignored when reading a.msg file.\n        binaryWriter.Write(new byte[8]);\n        // Next Recipient ID(4 bytes): The ID to use for naming the next Recipient object storage \n        // if one is created inside the .msg file. The naming convention to be used is specified in \n        // section 2.2.1.\n        binaryWriter.Write(Convert.ToUInt32(NextRecipientId));\n        // Next Attachment ID (4 bytes): The ID to use for naming the next Attachment object storage \n        // if one is created inside the .msg file. The naming convention to be used is specified in section 2.2.2.\n        binaryWriter.Write(Convert.ToUInt32(NextAttachmentId));\n        // Recipient Count(4 bytes): The number of Recipient objects.\n        binaryWriter.Write(Convert.ToUInt32(RecipientCount));\n        // Attachment Count (4 bytes): The number of Attachment objects.\n        binaryWriter.Write(Convert.ToUInt32(AttachmentCount));\n        return WriteProperties(storage, binaryWriter);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/EntryStream.cs",
    "content": "﻿//\n// Entry.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The entry stream MUST be named \"__substg1.0_00030102\" and consist of 8-byte entries, one for each\n///     named property being stored. The properties are assigned unique numeric IDs (distinct from any property\n///     ID assignment) starting from a base of 0x8000. The IDs MUST be numbered consecutively, like an array.\n///     In this stream, there MUST be exactly one entry for each named property of the Message object or any of\n///     its subobjects. The index of the entry for a particular ID is calculated by subtracting 0x8000 from it.\n///     For example, if the ID is 0x8005, the index for the corresponding 8-byte entry would be 0x8005 – 0x8000 = 5.\n///     The index can then be multiplied by 8 to get the actual byte offset into the stream from where to start\n///     reading the corresponding entry.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee159689(v=exchg.80).aspx\n/// </remarks>\ninternal sealed class EntryStream : List<EntryStreamItem>\n{\n    #region Constructors\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal EntryStream()\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and reads all the <see cref=\"EntryStreamItem\" /> objects from \n    ///     the given <paramref name=\"storage\"/>\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/> that contains the <see cref=\"PropertyTags.EntryStream\"/></param>\n    internal EntryStream(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.EntryStream);\n        using var binaryReader = new BinaryReader(stream);\n        while (!binaryReader.Eos())\n        {\n            var entryStreamItem = new EntryStreamItem(binaryReader);\n            Add(entryStreamItem);\n        }\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the <see cref=\"EntryStreamItem\"/>'s as a <see cref=\"CfbStream\" /> to the\n    ///     given <paramref name=\"storage\" />\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\" /></param>\n    internal void Write(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.EntryStream);\n        using var binaryWriter = new BinaryWriter(stream);\n        foreach (var entryStreamItem in this)\n            entryStreamItem.Write(binaryWriter);\n    }\n\n    internal void Write(Storage storage, string streamName)\n    {\n        using var stream = storage.GetStream(streamName);\n        using var binaryWriter = new BinaryWriter(stream);\n        foreach (var entryStreamItem in this)\n            entryStreamItem.Write(binaryWriter);\n    }\n    #endregion\n}\n\n/// <summary>\n///     Represents one item in the <see cref=\"EntryStream\"/> stream\n/// </summary>\ninternal sealed class EntryStreamItem\n{\n    #region Properties\n    /// <summary>\n    ///     Name Identifier/String Offset (4 bytes): If this property is a numerical-named property (as specified by\n    ///     the Property Kind subfield of the Index and Kind Information field), this value is the LID part of the\n    ///     PropertyName structure, as specified in [MS-OXCDATA] section 2.6.1. If this property is a string named\n    ///     property, this value is the offset in bytes into the strings stream where the value of the Name field of\n    ///     the PropertyName structure is located.\n    /// </summary>\n    public uint NameIdentifierOrStringOffset { get; }\n\n    /// <summary>\n    /// \n    /// </summary>\n    public string NameIdentifierOrStringOffsetHex { get; }\n\n    /// <summary>\n    ///     The following structure specifies the stream indexes and whether the property is a numerical-named\n    ///     property or a string named property\n    /// </summary>\n    public IndexAndKindInformation IndexAndKindInformation { get; }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\"/></param>\n    internal EntryStreamItem(BinaryReader binaryReader)\n    {\n        NameIdentifierOrStringOffset = binaryReader.ReadUInt16();\n        NameIdentifierOrStringOffsetHex = $\"{NameIdentifierOrStringOffset:X}\";\n        IndexAndKindInformation = new IndexAndKindInformation(binaryReader);\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"nameIdentifierOrStringOffset\"><see cref=\"NameIdentifierOrStringOffset\"/></param>\n    /// <param name=\"indexAndKindInformation\"><see cref=\"IndexAndKindInformation\"/></param>\n    internal EntryStreamItem(ushort nameIdentifierOrStringOffset,\n        IndexAndKindInformation indexAndKindInformation)\n    {\n        NameIdentifierOrStringOffset = nameIdentifierOrStringOffset;\n        NameIdentifierOrStringOffsetHex = $\"{nameIdentifierOrStringOffset:X}\";\n        IndexAndKindInformation = indexAndKindInformation;\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n    /// </summary>\n    /// <param name=\"binaryWriter\"></param>\n    internal void Write(BinaryWriter binaryWriter)\n    {\n        binaryWriter.Write(NameIdentifierOrStringOffset);\n        binaryWriter.Write((ushort)((IndexAndKindInformation.GuidIndex << 1) | (ushort)IndexAndKindInformation.PropertyKind));\n        binaryWriter.Write(IndexAndKindInformation.PropertyIndex); //Doesn't seem to be the case in the spec. \n        // Fortunately section 3.2 clears this up. \n    }\n    #endregion\n}\n\n/// <summary>\n///     2.2.3.1.2.1 Index and Kind Information\n///     The following structure specifies the stream indexes and whether the property is a numerical-named\n///     property or a string named property.\n/// </summary>\ninternal sealed class IndexAndKindInformation\n{\n    #region Properties\n    /// <summary>\n    ///     Sequentially increasing, zero-based index. This MUST be 0 for the first\n    ///     named property, 1 for the second, and so on.\n    /// </summary>\n    public ushort PropertyIndex { get; }\n\n    /// <summary>\n    ///     Index into the GUID stream. The possible values are shown in the following table.<br/>\n    ///     - 1 Always use the PS_MAPI property set, as specified in [MS-OXPROPS] section 1.3.2. No GUID is stored in<br/>\n    ///         the GUID stream.<br/>\n    ///     - 2 Always use the PS_PUBLIC_STRINGS property set, as specified in [MS-OXPROPS]<br/>\n    ///         section 1.3.2. No GUID is stored in the GUID stream.<br/>\n    ///     - >= 3 Use Value minus 3 as the index of the GUID into the GUID stream.For example, if the GUID index is 5,<br/>\n    ///         the third GUID(5 minus 3, resulting in a zero-based index of 2) is used as the GUID for the name<br/>\n    ///         property being derived.\n    /// </summary>\n    public ushort GuidIndex { get; }\n\n    /// <summary>\n    ///     Bit indicating the type of the property; zero (0) if numerical named property\n    ///     and 1 if string named property.\n    /// </summary>\n    public PropertyKind PropertyKind { get; }\n    #endregion\n\n    #region GetUIntFromBitArray\n    /// <summary>\n    /// Converts the given <paramref name=\"bitArray\"/> to an unsigned integer\n    /// </summary>\n    /// <param name=\"bitArray\"></param>\n    /// <param name=\"offset\"></param>\n    /// <param name=\"count\"></param>\n    /// <returns></returns>\n    private static uint GetUIntFromBitArray(BitArray bitArray, int offset, int count)\n    {\n        uint value = 0;\n\n        for (var i = offset; i < count + offset; i++)\n        {\n            if (bitArray[i])\n                value += Convert.ToUInt16(Math.Pow(2, i));\n        }\n\n        return value;\n    }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\"/></param>\n    internal IndexAndKindInformation(BinaryReader binaryReader)\n    {\n        PropertyIndex = binaryReader.ReadUInt16();\n        var bits = new BitArray(binaryReader.ReadBytes(2));\n        GuidIndex = (ushort)GetUIntFromBitArray(bits, 1, 15);\n        PropertyKind = (PropertyKind)GetUIntFromBitArray(bits, 0, 1);\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"propertyIndex\"><see cref=\"PropertyIndex\"/></param>\n    /// <param name=\"guidIndex\"><see cref=\"GuidIndex\"/></param>\n    /// <param name=\"propertyKind\"><see cref=\"PropertyKind\"/></param>\n    internal IndexAndKindInformation(ushort propertyIndex, ushort guidIndex, PropertyKind propertyKind)\n    {\n        PropertyIndex = propertyIndex;\n        GuidIndex = guidIndex;\n        PropertyKind = propertyKind;\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n    /// </summary>\n    /// <param name=\"binaryWriter\"></param>\n    internal void Write(BinaryWriter binaryWriter)\n    {\n        binaryWriter.Write(PropertyIndex);\n        binaryWriter.Write(GuidIndex + (uint)PropertyKind);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/GuidStream.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MsgKit.Helpers;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The GUID stream MUST be named \"__substg1.0_00020102\". It MUST store the property set GUID\n///     part of the property name of all named properties in the Message object or any of its subobjects,\n///     except for those named properties that have PS_MAPI or PS_PUBLIC_STRINGS, as described in [MSOXPROPS]\n///     section 1.3.2, as their property set GUID.\n///     The GUIDs are stored in the stream consecutively like an array. If there are multiple named properties\n///     that have the same property set GUID, then the GUID is stored only once and all the named\n///     properties will refer to it by its index\n/// </summary>\ninternal sealed class GuidStream : List<Guid>\n{\n    #region Constructors\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal GuidStream()\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and reads all the <see cref=\"Guid\" /> objects from \n    ///     the given <paramref name=\"storage\"/>\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/> that contains the <see cref=\"PropertyTags.GuidStream\"/></param>\n    internal GuidStream(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.GuidStream);\n        using var binaryReader = new BinaryReader(stream);\n        while (!binaryReader.Eos())\n        {\n            var guid = new Guid(binaryReader.ReadBytes(16));\n            Add(guid);\n        }\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the <see cref=\"Guid\"/>'s as a <see cref=\"CfbStream\" /> to the\n    ///     given <paramref name=\"storage\" />\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\" /></param>\n    internal void Write(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.GuidStream);\n        using var binaryWriter = new BinaryWriter(stream);\n        foreach (var guid in this)\n            binaryWriter.Write(guid.ToByteArray());\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/NamedProperties.cs",
    "content": "﻿//\n// NamedProperties.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\ninternal sealed class NamedProperties : List<NamedProperty>\n{\n    #region Fields\n    /// <summary>\n    ///     <see cref=\"TopLevelProperties\" />\n    /// </summary>\n    private readonly TopLevelProperties _topLevelProperties;\n\n    /// <summary>\n    ///     The offset index for a <see cref=\"NamedProperty\"/>\n    /// </summary>\n    private ushort _namedPropertyIndex;\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    /// <param name=\"topLevelProperties\">\n    ///     <see cref=\"TopLevelProperties\" />\n    /// </param>\n    public NamedProperties(TopLevelProperties topLevelProperties)\n    {\n        _topLevelProperties = topLevelProperties;\n    }\n    #endregion\n\n    #region AddProperty\n    /// <summary>\n    ///     Adds a <see cref=\"NamedPropertyTag\" />\n    /// </summary>\n    /// <remarks>\n    ///     Only support for properties by ID for now.\n    /// </remarks>\n    /// <param name=\"mapiTag\"></param>\n    /// <param name=\"obj\"></param>\n    internal void AddProperty(NamedPropertyTag mapiTag, object obj)\n    {\n        // Named property field 0000. 0x8000 + property offset\n        _topLevelProperties.AddProperty(new PropertyTags.PropertyTag((ushort)(0x8000 + _namedPropertyIndex++), mapiTag.Type), obj);\n\n        Add(new NamedProperty\n        {\n            NameIdentifier = mapiTag.Id,\n            Guid = mapiTag.Guid,\n            Kind = PropertyKind.Lid\n        });\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes the properties to the <see cref=\"OpenMcdf.Storage\" />\n    /// </summary>\n    /// <param name=\"storage\"></param>\n    /// <remarks>\n    ///     Unfortunately this is going to have to be used after we already wrote the top level properties.\n    /// </remarks>\n    internal void WriteProperties(Storage storage)\n    {\n        // Grab the nameIdStorage, 3.1 on the SPEC\n        storage = storage.GetStorage(PropertyTags.NameIdStorage);\n\n        var entryStream = new EntryStream(storage);\n        var stringStream = new StringStream(storage);\n        var guidStream = new GuidStream(storage);\n        var entryStream2 = new EntryStream(storage);\n\n        ushort propertyIndex = 0;\n        var guids = this.Select(x => x.Guid).Distinct().ToList();\n\n        guidStream.AddRange(guids);\n\n        foreach (var namedProperty in this)\n        {\n            var guidIndex = (ushort)(guids.IndexOf(namedProperty.Guid) + 3);\n\n            // Depending on the property type. This is doing name. \n            entryStream.Add(new EntryStreamItem(namedProperty.NameIdentifier, new IndexAndKindInformation(propertyIndex, guidIndex, PropertyKind.Lid))); //+3 as per spec.\n            entryStream2.Add(new EntryStreamItem(namedProperty.NameIdentifier, new IndexAndKindInformation(propertyIndex, guidIndex, PropertyKind.Lid)));\n\n            //3.2.2 of the SPEC [MS-OXMSG]\n            entryStream2.Write(storage,\n                GenerateStreamString(namedProperty.NameIdentifier, guidIndex, namedProperty.Kind));\n\n            // 3.2.2 of the SPEC Needs to be written, because the stream changes as per named object.\n            entryStream2.Clear();\n            propertyIndex++;\n        }\n\n        guidStream.Write(storage);\n        entryStream.Write(storage);\n        stringStream.Write(storage);\n    }\n\n    #region GenerateStreamString\n    /// <summary>\n    ///     Generates the stream strings\n    /// </summary>\n    /// <param name=\"nameIdentifier\"></param>\n    /// <param name=\"guidTarget\"></param>\n    /// <param name=\"propertyKind\"></param>\n    /// <returns></returns>\n    private string GenerateStreamString(uint nameIdentifier, uint guidTarget, PropertyKind propertyKind)\n    {\n        switch (propertyKind)\n        {\n            case PropertyKind.Lid:\n                return \"__substg1.0_\" +\n                       (((4096 + (nameIdentifier ^ (guidTarget << 1)) % 0x1F) << 16) | 0x00000102).ToString(\"X\")\n                       .PadLeft(8, '0');\n            default:\n                throw new NotImplementedException();\n        }\n    }\n    #endregion\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/RecipientProperties.cs",
    "content": "﻿//\n// RecipientProperties.cs\n//\n// Author: RecipientRowDisplayType and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.IO;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The properties stream contained inside a recipient storage object.\n/// </summary>\ninternal sealed class RecipientProperties : Properties\n{\n    #region Constructors\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal RecipientProperties()\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and reads all the <see cref=\"Property\">properties</see> \n    ///     from the given <see cref=\"CfbStream\"/>\n    /// </summary>\n    /// <param name=\"stream\">The <see cref=\"CfbStream\"/></param>\n    internal RecipientProperties(CfbStream stream)\n    {\n        using var binaryReader = new BinaryReader(stream);\n        binaryReader.ReadBytes(8);\n        ReadProperties(binaryReader);\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given storage, this depends \n    ///     on the <see cref=\"Enums.PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage)\n    {\n        using var memoryStream = new MemoryStream();\n        using var binaryWriter = new BinaryWriter(memoryStream);\n        // Reserved (8 bytes): This field MUST be set to zero when writing a .msg file and MUST be ignored when reading a .msg file.\n        binaryWriter.Write(new byte[8]);\n        return WriteProperties(storage, binaryWriter);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/StringStream.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing MsgKit.Helpers;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The string stream MUST be named \"__substg1.0_00040102\". It MUST consist of one entry for each\n///     string named property, and all entries MUST be arranged consecutively, like in an array.\n///     As specified in section 2.2.3.1.2, the offset, in bytes, to use for a particular property is stored in the\n///     corresponding entry in the entry stream.That is a byte offset into the string stream from where the\n///     entry for the property can be read.The strings MUST NOT be null-terminated. Implementers can add a\n///     terminating null character to the string\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee124409(v=exchg.80).aspx\n/// </remarks>\ninternal sealed class StringStream : List<StringStreamItem>\n{\n    #region Constructors\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal StringStream()\n    {\n    }\n\n    /// <summary>\n    ///     Creates this object and reads all the <see cref=\"StringStreamItem\" /> objects \n    ///     from the given <paramref name=\"storage\"/>\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/> that contains the <see cref=\"PropertyTags.EntryStream\"/></param>\n    internal StringStream(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.StringStream);\n        using var binaryReader = new BinaryReader(stream);\n        while (!binaryReader.Eos())\n        {\n            var stringStreamItem = new StringStreamItem(binaryReader);\n            Add(stringStreamItem);\n        }\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the <see cref=\"StringStream\"/>'s as a <see cref=\"CfbStream\" /> to the\n    ///     given <paramref name=\"storage\" />\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\" /></param>\n    internal void Write(Storage storage)\n    {\n        using var stream = storage.GetStream(PropertyTags.StringStream);\n        using var binaryWriter = new BinaryWriter(stream);\n        foreach (var stringStreamItem in this)\n            stringStreamItem.Write(binaryWriter);\n    }\n    #endregion\n}\n\n/// <summary>\n///     Represents one item in the <see cref=\"StringStream\"/> stream\n/// </summary>\ninternal sealed class StringStreamItem\n{\n    #region Properties\n    /// <summary>\n    ///     The length of the following <see cref=\"Name\"/> field in bytes.\n    /// </summary>\n    public uint Length { get; }\n\n    /// <summary>\n    ///     A Unicode string that is the name of the property. A new entry MUST always start\n    ///     on a 4 byte boundary; therefore, if the size of the Name field is not an exact multiple of 4, and\n    ///     another Name field entry occurs after it, null characters MUST be appended to the stream after it\n    ///     until the 4-byte boundary is reached.The Name Length field for the next entry will then start at\n    ///     the beginning of the next 4-byte boundary\n    /// </summary>\n    public string Name { get; }\n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Creates this object and reads all the properties from the given <paramref name=\"binaryReader\" />\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\"/></param>\n    internal StringStreamItem(BinaryReader binaryReader)\n    {\n        Length = binaryReader.ReadUInt32();\n        Name = Encoding.Unicode.GetString(binaryReader.ReadBytes((int)Length)).Trim('\\0');\n        var boundary = Get4BytesBoundary(Length);\n        binaryReader.ReadBytes((int)boundary);\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"name\"><see cref=\"Name\"/></param>\n    internal StringStreamItem(string name)\n    {\n        Length = (uint)name.Length;\n        Name = name;\n    }\n    #endregion\n\n    #region Write\n    /// <summary>\n    ///     Writes all the internal properties to the given <paramref name=\"binaryWriter\" />\n    /// </summary>\n    /// <param name=\"binaryWriter\"></param>\n    internal void Write(BinaryWriter binaryWriter)\n    {\n        binaryWriter.Write(Length);\n        binaryWriter.Write(Name);\n        var boundary = Get4BytesBoundary(Length);\n        var bytes = new byte[boundary];\n        binaryWriter.Write(bytes);\n    }\n    #endregion\n\n    #region Get4BytesBoundry\n    /// <summary>\n    ///     Extract 4 from the given <paramref name=\"length\"/> until the result is smaller than\n    ///      4 and then returns this result;\n    /// </summary>\n    /// <param name=\"length\"></param>\n    /// <returns></returns>\n    private static uint Get4BytesBoundary(uint length)\n    {\n        if (length == 0) return 4;\n\n        while (length >= 4)\n            length -= 4;\n\n        return length;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Streams/TopLevelProperties.cs",
    "content": "﻿//\n// TopLevelProperties.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.IO;\nusing MsgKit.Structures;\nusing OpenMcdf;\n\nnamespace MsgKit.Streams;\n\n/// <summary>\n///     The properties stream contained inside the top level of the .msg file, which represents the Message object itself.\n/// </summary>\ninternal sealed class TopLevelProperties : Properties\n{\n    #region Properties\n    /// <summary>\n    ///     The ID to use for naming the next Recipient object storage if one is created inside the .msg file\n    /// </summary>\n    internal int NextRecipientId { get; set; }\n\n    /// <summary>\n    ///     The ID to use for naming the next Attachment object storage if one is created inside the .msg file\n    /// </summary>\n    internal int NextAttachmentId { get; set; }\n\n    /// <summary>\n    ///     The number of Recipient objects\n    /// </summary>\n    internal int RecipientCount { get; set; }\n\n    /// <summary>\n    ///     The number of Attachment objects\n    /// </summary>\n    internal int AttachmentCount { get; set; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Create this object and reads all the <see cref=\"Property\">properties</see> from \n    ///     the given <see cref=\"CfbStream\"/>\n    /// </summary>\n    /// <param name=\"stream\">The <see cref=\"CfbStream\"/></param>\n    internal TopLevelProperties(CfbStream stream)\n    {\n        using var binaryReader = new BinaryReader(stream);\n        binaryReader.ReadBytes(8); // Reserved\n        NextRecipientId = Convert.ToInt32(binaryReader.ReadUInt32());\n        NextAttachmentId = Convert.ToInt32(binaryReader.ReadUInt32());\n        RecipientCount = Convert.ToInt32(binaryReader.ReadUInt32());\n        AttachmentCount = Convert.ToInt32(binaryReader.ReadUInt32());\n        binaryReader.ReadBytes(8); // Reserved\n        ReadProperties(binaryReader);\n    }\n\n    /// <summary>\n    ///     Creates this object\n    /// </summary>\n    internal TopLevelProperties()\n    {\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given <paramref name=\"storage\"/>, this depends \n    ///     on the <see cref=\"Enums.PropertyType\"/>\n    /// </summary>\n    /// <remarks>\n    ///     See the <see cref=\"Properties\"/> class it's <see cref=\"Properties.WriteProperties\"/> method for the logic\n    ///     that is used to determine this\n    /// </remarks>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <param name=\"messageSize\">Used to calculate the exact size of the <see cref=\"Message\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(Storage storage, long? messageSize = null)\n    {\n        using var memoryStream = new MemoryStream();\n        using var binaryWriter = new BinaryWriter(memoryStream);\n        // Reserved(8 bytes): This field MUST be set to zero when writing a .msg file and MUST be ignored \n        // when reading a.msg file. \n        binaryWriter.Write(new byte[8]);\n        // Next Recipient ID(4 bytes): The ID to use for naming the next Recipient object storage if one is \n        // created inside the .msg file. The naming convention to be used is specified in section 2.2.1.If \n        // no Recipient object storages are contained in the.msg file, this field MUST be set to 0.\n        binaryWriter.Write(Convert.ToUInt32(NextRecipientId));\n        // Next Attachment ID (4 bytes): The ID to use for naming the next Attachment object storage if one \n        // is created inside the .msg file. The naming convention to be used is specified in section 2.2.2.\n        // If no Attachment object storages are contained in the.msg file, this field MUST be set to 0.\n        binaryWriter.Write(Convert.ToUInt32(NextAttachmentId));\n        // Recipient Count(4 bytes): The number of Recipient objects.\n        binaryWriter.Write(Convert.ToUInt32(RecipientCount));\n        // Attachment Count (4 bytes): The number of Attachment objects.\n        binaryWriter.Write(Convert.ToUInt32(AttachmentCount));\n        // Reserved(8 bytes): This field MUST be set to 0 when writing a msg file and MUST be ignored when \n        // reading a msg file.\n        binaryWriter.Write(new byte[8]);\n        return WriteProperties(storage, binaryWriter, messageSize);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/AddressBookEntryId.cs",
    "content": "﻿//\n// AddressBookEntryId.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.IO;\nusing MsgKit.Helpers;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     An Address Book EntryID structure specifies several types of Address Book objects, including\n///     individual users, distribution lists, containers, and templates.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee160588(v=exchg.80).aspx\n/// </remarks>\npublic class AddressBookEntryId\n{\n    #region Properties\n    // what circumstances a short-term EntryID is valid. However, in any EntryID stored in a \n    // property value, these 4 bytes MUST be zero, indicating a long-term EntryID.\n    /// <summary>\n    ///     Flags (4 bytes): This value MUST be set to 0x00000000. Bits in this field indicate under\n    /// </summary>\n    public byte[] Flags { get; }\n\n    /// <summary>\n    ///     The X500 DN of the Address Book object.\n    /// </summary>\n    /// <remarks>\n    ///     A distinguished name (DN), in Teletex form, of an object that is in an address book. An X500 DN can be more limited\n    ///     in the size and number of relative distinguished names (RDNs) than a full DN.\n    /// </remarks>\n    public string X500Dn { get; }\n    #endregion\n\n    #region Constructor\n    internal AddressBookEntryId(BinaryReader binaryReader)\n    {\n        Flags = binaryReader.ReadBytes(4);\n        X500Dn = Strings.ReadNullTerminatedString(binaryReader, false);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/CLSID.cs",
    "content": "﻿//\n// CSLID.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The packet version of the CLSID structure represents a class identifier (CLSID) in a serialized manner.\n/// </summary>\n// ReSharper disable once InconsistentNaming\ninternal class CLSID\n{\n    #region Properties\n    /// <summary>\n    ///     Data1 (4 bytes): This MUST be identical in meaning to the Data1 field specified in [MS-DTYP] section 2.3.4.\n    /// </summary>\n    public byte[] Data1 { get; }\n\n    /// <summary>\n    ///     Data2 (2 bytes): This MUST be identical in meaning to the Data2 field specified in [MS-DTYP] section 2.3.4.\n    /// </summary>\n    public byte[] Data2 { get; }\n\n    /// <summary>\n    ///     Data3 (2 bytes): This MUST be identical in meaning to the Data3 field specified in [MS-DTYP] section 2.3.4.\n    /// </summary>\n    public byte[] Data3 { get; }\n\n    /// <summary>\n    ///     Data4 (8 bytes): This MUST be identical in meaning to the Data4 field specified in [MS-DTYP] section 2.3.4.\n    /// </summary>\n    public byte[] Data4 { get; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it properties\n    /// </summary>\n    /// <param name=\"binaryReader\"></param>\n    internal CLSID(BinaryReader binaryReader)\n    {\n        Data1 = ((IEnumerable<byte>)binaryReader.ReadBytes(4)).Reverse().ToArray();\n        Data2 = ((IEnumerable<byte>)binaryReader.ReadBytes(2)).Reverse().ToArray();\n        Data3 = ((IEnumerable<byte>)binaryReader.ReadBytes(2)).Reverse().ToArray();\n        Data4 = ((IEnumerable<byte>)binaryReader.ReadBytes(8)).Reverse().ToArray();\n    }\n    #endregion\n\n    #region ToGuid\n    /// <summary>\n    ///     Returns <see cref=\"Data1\" />, <see cref=\"Data2\" />, <see cref=\"Data3\" />, <see cref=\"Data4\" /> as\n    ///     a <see cref=\"Guid\" />\n    /// </summary>\n    public Guid ToGuid()\n    {\n        return new Guid(Data1.Concat(Data2).Concat(Data3).Concat(Data4).ToArray());\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/NamedProperty.cs",
    "content": "﻿//\n// NamedProperty.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com> and Travis Semple\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing MsgKit.Enums;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The PropertyName Structure\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee158295(v=exchg.80).aspx\n/// </remarks>\ninternal class NamedProperty\n{\n    #region Properties\n    /// <summary>\n    ///     This should be the ID of the built in property name we are attaching to.\n    /// </summary>\n    public ushort NameIdentifier { get; internal set; }\n\n    /// <summary>\n    ///     The possible values for the Kind field are in the following table.\n    /// </summary>\n    public PropertyKind Kind { get; internal set; }\n\n    /// <summary>\n    ///     The value of this field is equal to the number of bytes in the Name string that follows it. This field is present\n    ///     only if the value of the <see cref=\"Kind\" /> field is equal to <see cref=\"PropertyKind.Name\" />\n    /// </summary>\n    /// <remarks>\n    ///     Optional\n    /// </remarks>\n    public uint NameSize { get; internal set; }\n\n    /// <summary>\n    ///     This field is present only if <see cref=\"Kind\" /> is equal to <see cref=\"PropertyKind.Name\" />. The value is a\n    ///     Unicode (UTF-16 format) string, followed by two zero bytes as terminating null characters, that identifies the\n    ///     property within its property set.\n    /// </summary>\n    /// <remarks>\n    ///     Optional\n    /// </remarks>\n    public string Name { get; internal set; }\n\n    /// <summary>\n    ///     A <see cref=\"Guid\" />\n    /// </summary>\n    public Guid Guid { get; internal set; }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/OneOffEntryId.cs",
    "content": "﻿//\n// OneOffEntryId.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     A One-Off EntryID structure specifies a set of data representing recipients\n///     that do not exist in the directory. All information about a one-off recipient\n///     is contained in the EntryID.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee202811(v=exchg.80).aspx\n/// </remarks>\ninternal class OneOffEntryId : Address\n{\n    #region Fields\n    /// <summary>\n    ///     <see cref=\"MessageFormat\" />\n    /// </summary>\n    private readonly MessageFormat _messageFormat;\n\n    /// <summary>\n    ///     A flag that indicates whether the server can look up an address in the\n    ///     address book\n    /// </summary>\n    private readonly bool _canLookupEmailAddress;\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's needed properties\n    /// </summary>\n    /// <param name=\"email\">The full E-mail address</param>\n    /// <param name=\"displayName\">The displayname for the <paramref name=\"email\" /></param>\n    /// <param name=\"addressType\">The <see cref=\"Address.AddressType\" /></param>\n    /// <param name=\"messageFormat\"><see cref=\"MessageFormat\"/></param>\n    /// <param name=\"canLookupEmailAddress\"></param>\n    public OneOffEntryId(string email,\n        string displayName,\n        AddressType addressType = AddressType.Smtp,\n        MessageFormat messageFormat = MessageFormat.TextAndHtml,\n        bool canLookupEmailAddress = false) : base(email, displayName, addressType)\n    {\n        _messageFormat = messageFormat;\n        _canLookupEmailAddress = canLookupEmailAddress;\n    }\n    #endregion\n\n    #region ToByteArray\n    /// <summary>\n    ///     Returns this class as a byte array\n    /// </summary>\n    internal byte[] ToByteArray()\n    {\n        using (var memoryStream = new MemoryStream())\n        {\n            var binaryWriter = new BinaryWriter(memoryStream);\n\n            // Flags (4 bytes): This value is set to 0x00000000. Bits in this field indicate under what circumstances \n            // a short-term EntryID is valid. However, in any EntryID stored in a property value, these 4 bytes are \n            // zero, indicating a long-term EntryID.\n            binaryWriter.Write(new byte[4]);\n\n            // ProviderUID (16 bytes): The identifier of the provider that created the EntryID. This value is used to \n            // route EntryIDs to the correct provider and MUST be set to %x81.2B.1F.A4.BE.A3.10.19.9D.6E.00.DD.01.0F.54.02.\n            binaryWriter.Write(new byte[]\n                { 0x81, 0x2B, 0x1F, 0xA4, 0xBE, 0xA3, 0x10, 0x19, 0x9D, 0x6E, 0x00, 0xDD, 0x01, 0x0F, 0x54, 0x02 });\n\n            // Version (2 bytes): This value is set to 0x0000.\n            binaryWriter.Write(new byte[2]);\n\n            var bitArray = new BitArray(new byte[2]);\n\n            // Pad(1 bit): (mask 0x8000) Reserved.This value is set to '0'.\n            bitArray.Set(0, false);\n\n            // MAE (2 bits): (mask 0x0C00) The encoding used for Macintosh-specific data attachments, as specified in \n            // [MS-OXCMAIL] section 2.1.3.4.3. The values for this field are specified in the following table.\n            // Name        | Word value | Field value | Description \n            // BinHex        0x0000       b'00'         BinHex encoded.\n            // UUENCODE      0x0020       b'01'         UUENCODED.Not valid if the message is in Multipurpose Internet Mail \n            //                                          Extensions(MIME) format, in which case the flag will be ignored and \n            //                                          BinHex used instead.\n            // AppleSingle   0x0040      b'10'          Apple Single encoded.Allowed only when the message format is MIME.\n            // AppleDouble   0x0060      b'11'          Apple Double encoded.Allowed only when the message format is MIME.\n            bitArray.Set(1, false);\n            bitArray.Set(2, false);\n\n            // Format (4 bits): (enumeration, mask 0x1E00) The message format desired for this recipient (1), as specified \n            // in the following table.\n            // Name        | Word value | Field value | Description \n            // TextOnly      0x0006       b'0011'       Send a plain text message body.\n            // HtmlOnly      0x000E       b'0111'       Send an HTML message body.\n            // TextAndHtml   0x0016       b'1011'       Send a multipart / alternative body with both plain text and HTML.\n            switch (_messageFormat)\n            {\n                case MessageFormat.TextOnly:\n                    bitArray.Set(3, false);\n                    bitArray.Set(4, false);\n                    bitArray.Set(5, true);\n                    bitArray.Set(6, true);\n                    break;\n\n                case MessageFormat.HtmlOnly:\n                    bitArray.Set(3, false);\n                    bitArray.Set(4, true);\n                    bitArray.Set(5, true);\n                    bitArray.Set(6, true);\n                    break;\n\n                case MessageFormat.TextAndHtml:\n                    bitArray.Set(3, true);\n                    bitArray.Set(4, false);\n                    bitArray.Set(5, true);\n                    bitArray.Set(6, true);\n                    break;\n            }\n\n            // M (1 bit): (mask 0x0100) A flag that indicates how messages are to be sent. If b'0', indicates messages are \n            // to be sent to the recipient (1) in Transport Neutral Encapsulation Format (TNEF) format; if b'1', messages \n            // are sent to the recipient (1) in pure MIME format.\n            bitArray.Set(7, true);\n\n            // U (1 bit): (mask 0x0080) A flag that indicates the format of the string fields that follow. If b'1', the \n            // string fields following are in Unicode (UTF-16 form) with 2-byte terminating null characters; if b'0', the \n            // string fields following are multibyte character set (MBCS) characters terminated by a single 0 byte.\n            bitArray.Set(8, true);\n\n            // R (2 bits): (mask 0x0060) Reserved. This value is set to b'00'.\n            bitArray.Set(9, false);\n            bitArray.Set(10, false);\n\n            // L (1 bit): (mask 0x0010) A flag that indicates whether the server can look up an address in the address \n            // book. If b'1', server cannot look up this user's email address in the address book. If b'0', server can \n            // look up this user's email address in the address book.\n            bitArray.Set(11, _canLookupEmailAddress);\n\n            // Pad (4 bits): (mask 0x000F) Reserved. This value is set to b'0000'.\n            bitArray.Set(12, false);\n            bitArray.Set(13, false);\n            bitArray.Set(14, false);\n            bitArray.Set(15, false);\n\n            var bits = new byte[2];\n            bitArray.CopyTo(bits, 0);\n\n            if (BitConverter.IsLittleEndian)\n            {\n                bits = ((IEnumerable<byte>)bits).Reverse().ToArray();\n                binaryWriter.Write(bits);\n            }\n            else\n                binaryWriter.Write(bits);\n\n            Strings.WriteNullTerminatedUnicodeString(binaryWriter, DisplayName);\n            Strings.WriteNullTerminatedUnicodeString(binaryWriter, AddressTypeString);\n            Strings.WriteNullTerminatedUnicodeString(binaryWriter, Email);\n\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/Properties.cs",
    "content": "﻿//\n// Properties.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The properties inside a msg file\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee178759%28v=exchg.80%29.aspx\n/// </remarks>\ninternal class Properties : List<Property>\n{\n    #region ReadProperties\n    /// <summary>\n    ///     Reads all the <see cref=\"Property\" /> objects from the given <paramref name=\"binaryReader\" />\n    /// </summary>\n    /// <param name=\"binaryReader\"></param>\n    internal void ReadProperties(BinaryReader binaryReader)\n    {\n        // The data inside the property stream (1) MUST be an array of 16-byte entries. The number of properties, \n        // each represented by one entry, can be determined by first measuring the size of the property stream (1), \n        // then subtracting the size of the header from it, and then dividing the result by the size of one entry.\n        // The structure of each entry, representing one property, depends on whether the property is a fixed length \n        // property or not.\n\n        while (!binaryReader.Eos())\n        {\n            // property tag: A 32-bit value that contains a property type and a property ID. The low-order 16 bits \n            // represent the property type. The high-order 16 bits represent the property ID.\n            var type = (PropertyType)binaryReader.ReadUInt16();\n            var id = binaryReader.ReadUInt16();\n            var flags = binaryReader.ReadUInt32();\n            // 8 bytes for the data\n            var data = binaryReader.ReadBytes(8);\n\n            Add(new Property(id, type, flags, data));\n        }\n    }\n    #endregion\n\n    #region WriteProperties\n    /// <summary>\n    ///     Writes all <see cref=\"Property\">properties</see> either as a <see cref=\"OpenMcdf.CfbStream\"/> or as a collection in\n    ///     a <see cref=\"PropertyTags.PropertiesStreamName\"/> stream to the given <paramref name=\"storage\"/>, this depends \n    ///     on the <see cref=\"PropertyType\"/>\n    /// </summary>\n    /// <param name=\"storage\">The <see cref=\"OpenMcdf.Storage\"/></param>\n    /// <param name=\"binaryWriter\">The <see cref=\"BinaryWriter\" /></param>\n    /// <param name=\"messageSize\">Used to calculate the exact size of the <see cref=\"Message\"/></param>\n    /// <returns>\n    ///     Total size of the written <see cref=\"Properties\"/>\n    /// </returns>\n    internal long WriteProperties(OpenMcdf.Storage storage, BinaryWriter binaryWriter, long? messageSize = null)\n    {\n        long size = 0;\n\n        // The data inside the property stream (1) MUST be an array of 16-byte entries. The number of properties, \n        // each represented by one entry, can be determined by first measuring the size of the property stream (1), \n        // then subtracting the size of the header from it, and then dividing the result by the size of one entry.\n        // The structure of each entry, representing one property, depends on whether the property is a fixed length \n        // property or not.\n        foreach (var property in this)\n        {\n            // property tag: A 32-bit value that contains a property type and a property ID. The low-order 16 bits \n            // represent the property type. The high-order 16 bits represent the property ID.\n            binaryWriter.Write(Convert.ToUInt16(property.Type)); // 2 bytes\n            binaryWriter.Write(Convert.ToUInt16(property.Id)); // 2 bytes\n            binaryWriter.Write(Convert.ToUInt32(property.Flags)); // 4 bytes\n\n            switch (property.Type)\n            {\n                //case PropertyType.PT_ACTIONS:\n                //    break;\n\n                case PropertyType.PT_APPTIME:\n                case PropertyType.PT_SYSTIME:\n                case PropertyType.PT_DOUBLE:\n                case PropertyType.PT_I8:\n                    binaryWriter.Write(property.Data);\n                    break;\n\n                case PropertyType.PT_ERROR:\n                case PropertyType.PT_LONG:\n                case PropertyType.PT_FLOAT:\n                    binaryWriter.Write(property.Data);\n                    binaryWriter.Write(new byte[4]);\n                    break;\n\n                case PropertyType.PT_SHORT:\n                    binaryWriter.Write(property.Data);\n                    binaryWriter.Write(new byte[6]);\n                    break;\n\n                case PropertyType.PT_BOOLEAN:\n                    binaryWriter.Write(property.Data);\n                    binaryWriter.Write(new byte[7]);\n                    break;\n\n                //case PropertyType.PT_CURRENCY:\n                //    binaryWriter.Write(property.Data);\n                //    break;\n\n                case PropertyType.PT_UNICODE:\n                {\n                    // Write the length of the property to the properties stream\n                    binaryWriter.Write(property.Data.Length + 2);\n                    binaryWriter.Write(new byte[4]);\n                    using var stream = storage.CreateStream(property.Name);\n                    stream.Write(property.Data, 0, property.Data.Length);\n                    size += property.Data.LongLength;\n                    break;\n                }\n\n                case PropertyType.PT_STRING8:\n                {\n                    // Write the length of the property to the properties stream\n                    binaryWriter.Write(property.Data.Length + 1);\n                    binaryWriter.Write(new byte[4]);\n                    using var stream = storage.CreateStream(property.Name);\n                    stream.Write(property.Data, 0, property.Data.Length);\n                    size += property.Data.LongLength;\n                    break;\n                }\n\n                case PropertyType.PT_MV_UNICODE:\n                case PropertyType.PT_MV_STRING8:\n                case PropertyType.PT_MV_LONG:\n                case PropertyType.PT_MV_DOUBLE:\n                case PropertyType.PT_MV_SHORT:\n                case PropertyType.PT_MV_FLOAT:\n                {\n                    if (!property.IsMultiValueData)\n                    {\n                        binaryWriter.Write(property.Data.Length);\n                        binaryWriter.Write(new byte[4]);\n                        size += property.Data.LongLength;\n                    }\n\n                    using var stream = storage.CreateStream(property.Name);\n                    stream.Write(property.Data, 0, property.Data.Length);\n                    break;\n                }\n\n                case PropertyType.PT_CLSID:\n                    binaryWriter.Write(property.Data);\n                    break;\n\n                //case PropertyType.PT_SVREID:\n                //    break;\n\n                //case PropertyType.PT_SRESTRICT:\n                //    storage.AddStream(property.Name).SetData(property.Data);\n                //    break;\n\n                case PropertyType.PT_BINARY:\n                {\n                    // Write the length of the property to the propertiesstream\n                    binaryWriter.Write(property.Data.Length);\n                    binaryWriter.Write(new byte[4]);\n                    using var stream = storage.CreateStream(property.Name);\n                    stream.Write(property.Data, 0, property.Data.Length);\n                    size += property.Data.LongLength;\n                    break;\n                }\n\n                case PropertyType.PT_MV_APPTIME:\n                    break;\n\n                case PropertyType.PT_MV_LONGLONG:\n                    break;\n\n                case PropertyType.PT_MV_SYSTIME:\n                    break;\n\n                //case PropertyType.PT_MV_CLSID:\n                //    break;\n\n                case PropertyType.PT_MV_BINARY:\n                    break;\n\n                case PropertyType.PT_UNSPECIFIED:\n                    break;\n\n                case PropertyType.PT_NULL:\n                    break;\n\n                case PropertyType.PT_OBJECT:\n                    // TODO: Adding new MSG file\n                    break;\n            }\n        }\n\n        if (messageSize.HasValue)\n        {\n            binaryWriter.Write(Convert.ToUInt16(PropertyTags.PR_MESSAGE_SIZE.Type));  // 2 bytes\n            binaryWriter.Write(Convert.ToUInt16(PropertyTags.PR_MESSAGE_SIZE.Id));    // 2 bytes\n            binaryWriter.Write(Convert.ToUInt32(PropertyFlags.PROPATTR_READABLE | PropertyFlags.PROPATTR_WRITABLE)); // 4 bytes\n            var totalSize = messageSize.Value + size + 8;\n            var bytes = BitConverter.GetBytes(totalSize);\n            binaryWriter.Write(bytes);\n            // Issue #101\n            //binaryWriter.Write(new byte[4]);\n        }\n        \n        // Make the properties stream\n        binaryWriter.BaseStream.Position = 0;\n        using var propertiesStream = storage.GetStream(PropertyTags.PropertiesStreamName);\n        var array = binaryWriter.BaseStream.ToByteArray();\n        propertiesStream.Write(array, (int) propertiesStream.Position, array.Length);\n        return size + binaryWriter.BaseStream.Length;\n    }\n    #endregion\n\n    #region AddProperty\n    /// <summary>\n    ///     Adds a property\n    /// </summary>\n    /// <param name=\"mapiTag\">The <see cref=\"PropertyTags.PropertyTag\" /></param>\n    /// <param name=\"obj\">The value for the mapi tag</param>\n    /// <param name=\"flags\">\n    ///     the flags to set on the property, default <see cref=\"PropertyFlags.PROPATTR_READABLE\" />\n    ///     and <see cref=\"PropertyFlags.PROPATTR_WRITABLE\" />\n    /// </param>\n    /// <exception cref=\"ArgumentNullException\">Raised when <paramref name=\"obj\" /> is <c>null</c></exception>\n    internal void AddProperty(PropertyTags.PropertyTag mapiTag,\n        object obj,\n        PropertyFlags flags = PropertyFlags.PROPATTR_READABLE | PropertyFlags.PROPATTR_WRITABLE)\n    {\n        if (obj == null)\n            return;\n\n        var data = AsBytes(mapiTag.Type, obj);\n\n        var existingProp = this.FirstOrDefault(p => p.Id == mapiTag.Id && p.Type == mapiTag.Type);\n        if (existingProp != null)\n            Remove(existingProp);\n\n        Add(new Property(mapiTag.Id, mapiTag.Type, flags, data));\n\n        switch (mapiTag.Type)\n        {\n            case PropertyType.PT_MV_UNICODE:\n            case PropertyType.PT_MV_STRING8:\n                AddMultiValueStreams<string>(mapiTag, obj, flags);\n                break;\n        }\n    }\n    #endregion\n\n    #region AddOrReplaceProperty\n    /// <summary>\n    ///     Adds a property when it not exists, otherwise it is replaced\n    /// </summary>\n    /// <param name=\"mapiTag\">The <see cref=\"PropertyTags.PropertyTag\" /></param>\n    /// <param name=\"obj\">The value for the mapi tag</param>\n    /// <param name=\"flags\">\n    ///     the flags to set on the property, default <see cref=\"PropertyFlags.PROPATTR_READABLE\" />\n    ///     and <see cref=\"PropertyFlags.PROPATTR_WRITABLE\" />\n    /// </param>\n    /// <exception cref=\"ArgumentNullException\">Raised when <paramref name=\"obj\" /> is <c>null</c></exception>\n    internal void AddOrReplaceProperty(PropertyTags.PropertyTag mapiTag,\n        object obj,\n        PropertyFlags flags = PropertyFlags.PROPATTR_READABLE | PropertyFlags.PROPATTR_WRITABLE)\n    {\n        var index = FindIndex(m => m.Id == mapiTag.Id);\n        if (index >= 0)\n            RemoveAt(index);\n\n        AddProperty(mapiTag, obj, flags);\n    }\n    #endregion\n\n    #region MultiValue\n    /// <summary>\n    ///     Returns the given <paramref name=\"obj\"/> as a byte array\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    /// <param name=\"type\"><see cref=\"PropertyType\"/></param>\n    /// <param name=\"obj\"></param>\n    /// <returns></returns>\n    private byte[] MultiValue<T>(PropertyType type, object obj)\n    {\n        var values = (T[])obj;\n        if (!values.Any())\n            return null;\n\n        var nullTerminator = NullTerminator(type);\n\n        switch (type)\n        {\n            case PropertyType.PT_UNICODE:\n            case PropertyType.PT_STRING8:\n            {\n                var byteCount = 4 * values.Length;\n                var result = new byte[byteCount];\n                var currentIndex = 0;\n\n                foreach (var value in values)\n                {\n                    var bytes = AsBytes(type, value);\n                    var lengthInBytes = BitConverter.GetBytes((uint)(bytes.Length + nullTerminator.Length));\n                    // ReSharper disable once AssignNullToNotNullAttribute\n                    Array.Copy(lengthInBytes, 0, result, currentIndex, lengthInBytes.Length);\n                    currentIndex += lengthInBytes.Length;\n                }\n\n                return result;\n            }\n\n            case PropertyType.PT_LONG:\n                using (var memoryStream = new MemoryStream())\n                using (var binaryWriter = new BinaryWriter(memoryStream))\n                {\n                    foreach (var value in values)\n                    {\n                        var bytes = AsBytes(type, value);\n                        binaryWriter.Write(bytes);\n                    }\n\n                    return memoryStream.ToArray();\n                }\n\n            default:\n                throw new System.Exception(\n                    $\"The property type '{type}' is not yet supported in the MultiValue method\");\n        }\n    }\n    #endregion\n\n    #region AddMultiValueStreams\n    private void AddMultiValueStreams<T>(PropertyTags.PropertyTag mapiTag, object obj, PropertyFlags flags)\n    {\n        var values = (T[])obj;\n        var singleValueType = GetSingleTypeFromMultiValueType(mapiTag.Type);\n        var index = 0;\n\n        foreach (var val in values)\n        {\n            var nullTerminator = NullTerminator(singleValueType);\n\n            Add(new Property(\n                mapiTag.Id,\n                mapiTag.Type,\n                flags,\n                AsBytes(singleValueType, val).Concat(nullTerminator).ToArray(),\n                index));\n            index++;\n        }\n    }\n    #endregion\n\n    #region AsBytes\n    /// <summary>\n    ///     Returns the given <paramref name=\"obj\"/> as a byte array\n    /// </summary>\n    /// <param name=\"type\"><see cref=\"PropertyType\"/></param>\n    /// <param name=\"obj\"></param>\n    /// <returns></returns>\n    private byte[] AsBytes(PropertyType type, object obj)\n    {\n        var data = new byte[] { };\n\n        switch (type)\n        {\n            case PropertyType.PT_APPTIME:\n                var oaDate = ((DateTime)obj).ToOADate();\n                data = BitConverter.GetBytes(oaDate);\n                break;\n\n            case PropertyType.PT_SYSTIME:\n                var fileTime = ((DateTime)obj).ToFileTimeUtc();\n                data = BitConverter.GetBytes(fileTime);\n                break;\n\n            case PropertyType.PT_SHORT:\n                data = BitConverter.GetBytes(Convert.ToInt16(obj));\n                break;\n\n            case PropertyType.PT_ERROR:\n            case PropertyType.PT_LONG:\n                data = BitConverter.GetBytes(Convert.ToInt32(obj));\n                break;\n\n            case PropertyType.PT_FLOAT:\n                data = BitConverter.GetBytes((float)(int)obj);\n                break;\n\n            case PropertyType.PT_DOUBLE:\n                data = BitConverter.GetBytes((double)obj);\n                break;\n\n            //case PropertyType.PT_CURRENCY:\n            //    data = (byte[]) obj;\n            //    break;\n\n            case PropertyType.PT_BOOLEAN:\n                data = BitConverter.GetBytes((bool)obj);\n                break;\n\n            case PropertyType.PT_I8:\n                data = BitConverter.GetBytes((long)obj);\n                break;\n\n            case PropertyType.PT_UNICODE:\n                data = Encoding.Unicode.GetBytes((string)obj);\n                break;\n            case PropertyType.PT_MV_UNICODE:\n                data = MultiValue<string>(PropertyType.PT_UNICODE, obj);\n                break;\n\n            case PropertyType.PT_STRING8:\n                data = Encoding.Default.GetBytes((string)obj);\n                break;\n\n            case PropertyType.PT_MV_STRING8:\n                data = MultiValue<string>(PropertyType.PT_STRING8, obj);\n                break;\n\n            case PropertyType.PT_MV_LONG:\n                data = MultiValue<long>(PropertyType.PT_LONG, obj);\n                break;\n\n            case PropertyType.PT_MV_DOUBLE:\n                data = MultiValue<double>(PropertyType.PT_DOUBLE, obj);\n                break;\n\n            case PropertyType.PT_MV_SHORT:\n                data = MultiValue<short>(PropertyType.PT_SHORT, obj);\n                break;\n\n            case PropertyType.PT_MV_FLOAT:\n                data = MultiValue<float>(PropertyType.PT_FLOAT, obj);\n                break;\n\n            case PropertyType.PT_CLSID:\n                data = ((Guid)obj).ToByteArray();\n                break;\n\n            case PropertyType.PT_BINARY:\n\n                switch (Type.GetTypeCode(obj.GetType()))\n                {\n                    case TypeCode.Boolean:\n                        data = BitConverter.GetBytes((bool)obj);\n                        break;\n\n                    case TypeCode.Char:\n                        data = BitConverter.GetBytes((char)obj);\n                        break;\n\n                    case TypeCode.SByte:\n                        data = BitConverter.GetBytes((sbyte)obj);\n                        break;\n\n                    case TypeCode.Byte:\n                        data = BitConverter.GetBytes((byte)obj);\n                        break;\n                    case TypeCode.Int16:\n                        data = BitConverter.GetBytes((short)obj);\n                        break;\n\n                    case TypeCode.UInt16:\n                        data = BitConverter.GetBytes((uint)obj);\n                        break;\n\n                    case TypeCode.Int32:\n                        data = BitConverter.GetBytes((int)obj);\n                        break;\n\n                    case TypeCode.UInt32:\n                        data = BitConverter.GetBytes((uint)obj);\n                        break;\n\n                    case TypeCode.Int64:\n                        data = BitConverter.GetBytes((long)obj);\n                        break;\n\n                    case TypeCode.UInt64:\n                        data = BitConverter.GetBytes((ulong)obj);\n                        break;\n\n                    case TypeCode.Single:\n                        data = BitConverter.GetBytes((float)obj);\n                        break;\n\n                    case TypeCode.Double:\n                        data = BitConverter.GetBytes((double)obj);\n                        break;\n\n                    case TypeCode.DateTime:\n                        data = BitConverter.GetBytes(((DateTime)obj).Ticks);\n                        break;\n\n                    case TypeCode.String:\n                        data = Encoding.UTF8.GetBytes((string)obj);\n                        break;\n\n                    case TypeCode.Object:\n                        data = (byte[])obj;\n                        break;\n\n                    default:\n                        throw new ArgumentOutOfRangeException();\n                }\n\n                break;\n\n            case PropertyType.PT_NULL:\n                break;\n\n            case PropertyType.PT_ACTIONS:\n                throw new NotSupportedException(\"PT_ACTIONS property type is not supported\");\n\n            case PropertyType.PT_UNSPECIFIED:\n                throw new NotSupportedException(\"PT_UNSPECIFIED property type is not supported\");\n\n            case PropertyType.PT_OBJECT:\n                // TODO: Add support for MSG\n                break;\n\n            case PropertyType.PT_SVREID:\n                throw new NotSupportedException(\"PT_SVREID property type is not supported\");\n\n            case PropertyType.PT_SRESTRICT:\n                throw new NotSupportedException(\"PT_SRESTRICT property type is not supported\");\n\n            default:\n                throw new ArgumentOutOfRangeException();\n        }\n\n        return data;\n    }\n    #endregion\n\n    #region GetSingleTypeFromMultiValueType\n    /// <summary>\n    ///     Returns a single value type from a multi value type\n    /// </summary>\n    /// <param name=\"multiValueType\"></param>\n    /// <returns></returns>\n    private PropertyType GetSingleTypeFromMultiValueType(PropertyType multiValueType)\n    {\n        if (multiValueType == PropertyType.PT_MV_TSTRING)\n            return PropertyType.PT_UNICODE;\n\n        return (PropertyType)Enum.Parse(typeof(PropertyType), multiValueType.ToString().Replace(\"_MV\", \"\"));\n    }\n    #endregion\n\n    #region NullTerminator\n        /// <summary>\n        ///     Returns a correct null terminator according to the given <paramref name=\"type\"/>\n        /// </summary>\n        /// <param name=\"type\"><see cref=\"PropertyType\"/></param>\n        /// <returns></returns>\n        private byte[] NullTerminator(PropertyType type)\n        {\n            if (StoreSupportMaskConst.StoreSupportMask.HasFlag(StoreSupportMask.STORE_UNICODE_OK))\n                return new byte[] { 0, 0 };\n\n        switch (type)\n        {\n            case PropertyType.PT_UNICODE:\n                return new byte[] { 0, 0 };\n\n            case PropertyType.PT_STRING8:\n                return new byte[] { 0 };\n\n                default:\n                    return Array.Empty<byte>();\n            }\n        }\n        #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/Property.cs",
    "content": "﻿//\n// Property.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.IO;\nusing System.Text;\nusing MsgKit.Enums;\nusing MsgKit.Exceptions;\n\n// ReSharper disable InconsistentNaming\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     A property inside the MSG file\n/// </summary>\npublic class Property\n{\n    #region Properties\n    /// <summary>\n    ///     The id of the property\n    /// </summary>\n    internal ushort Id { get; }\n\n    /// <summary>\n    ///     Returns the Property as a readable string\n    /// </summary>\n    /// <returns></returns>\n    public string Name => PropertyTags.SubStorageStreamPrefix + GetPropertyId(Id, Type, MultiValueIndex);\n\n    /// <summary>\n    ///     Returns the Property as a readable string without the streamprefix and type\n    /// </summary>\n    /// <returns></returns>\n    public string ShortName => Id.ToString(\"X4\");\n\n    /// <summary>\n    ///     The <see cref=\"PropertyType\" />\n    /// </summary>\n    internal PropertyType Type { get; }\n\n    /// <summary>\n    ///     The <see cref=\"PropertyFlags\">property flags</see> that have been set\n    ///     in its <see cref=\"uint\" /> raw form\n    /// </summary>\n    internal uint Flags { get; }\n\n    /// <summary>\n    ///     The index position of the multi value property\n    /// </summary>\n    private int MultiValueIndex { get; }\n\n    /// <summary>\n    ///     returns true if this represents a single data entry, belonging to a multi valu property\n    /// </summary>\n    internal bool IsMultiValueData => MultiValueIndex >= 0;\n\n    /// <summary>\n    ///     The <see cref=\"PropertyFlags\">property flags</see> that have been set\n    ///     as a readonly collection\n    /// </summary>\n    internal ReadOnlyCollection<PropertyFlags> FlagsCollection\n    {\n        get\n        {\n            var result = new List<PropertyFlags>();\n\n            if ((Flags & Convert.ToUInt32(PropertyFlags.PROPATTR_MANDATORY)) != 0)\n                result.Add(PropertyFlags.PROPATTR_MANDATORY);\n\n            if ((Flags & Convert.ToUInt32(PropertyFlags.PROPATTR_READABLE)) != 0)\n                result.Add(PropertyFlags.PROPATTR_READABLE);\n\n            if ((Flags & Convert.ToUInt32(PropertyFlags.PROPATTR_WRITABLE)) != 0)\n                result.Add(PropertyFlags.PROPATTR_WRITABLE);\n\n            return result.AsReadOnly();\n        }\n    }\n\n    /// <summary>\n    ///     The property data\n    /// </summary>\n    internal byte[] Data { get; }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an integer when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_SHORT\" />,\n    ///     <see cref=\"PropertyType.PT_LONG\" /> or <see cref=\"PropertyType.PT_ERROR\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not <see cref=\"PropertyType.PT_SHORT\"/> or\n    /// <see cref=\"PropertyType.PT_LONG\"/></exception>\n    internal int ToInt\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_SHORT:\n                    return BitConverter.ToInt16(Data, 0);\n\n                case PropertyType.PT_LONG:\n                    return BitConverter.ToInt32(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_SHORT or PT_LONG\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a single when <see cref=\"Type\" /> is set to \n    ///     <see cref=\"PropertyType.PT_FLOAT\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not <see cref=\"PropertyType.PT_FLOAT\"/></exception>\n    internal float ToSingle\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_FLOAT:\n                    return BitConverter.ToSingle(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_FLOAT\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a single when <see cref=\"Type\" /> is set to \n    ///     <see cref=\"PropertyType.PT_DOUBLE\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not <see cref=\"PropertyType.PT_DOUBLE\"/></exception>\n    internal double ToDouble\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_DOUBLE:\n                    return BitConverter.ToDouble(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_DOUBLE\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a decimal when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_FLOAT\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not <see cref=\"PropertyType.PT_FLOAT\"/></exception>\n    internal decimal ToDecimal\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_FLOAT:\n                    return ByteArrayToDecimal(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_FLOAT\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a datetime when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_APPTIME\" />\n    ///     or <see cref=\"PropertyType.PT_SYSTIME\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_APPTIME\"/> or\n    /// <see cref=\"PropertyType.PT_SYSTIME\"/></exception>\n    internal DateTime ToDateTime\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_APPTIME:\n                    var oaDate = BitConverter.ToDouble(Data, 0);\n                    return DateTime.FromOADate(oaDate);\n\n                case PropertyType.PT_SYSTIME:\n                    var fileTime = BitConverter.ToInt64(Data, 0);\n                    return DateTime.FromFileTime(fileTime);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_APPTIME or PT_SYSTIME\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a boolean when <see cref=\"Type\" /> is set to <see cref=\"PropertyType.PT_BOOLEAN\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_BOOLEAN\"/></exception>\n    internal bool ToBool\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_BOOLEAN:\n                    return BitConverter.ToBoolean(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_BOOLEAN\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a boolean when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_LONGLONG\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_LONGLONG\"/></exception>\n    internal long ToLong\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_LONG:\n                case PropertyType.PT_LONGLONG:\n                    return BitConverter.ToInt64(Data, 0);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_LONGLONG\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a string when <see cref=\"Type\" /> is set to <see cref=\"PropertyType.PT_UNICODE\" />\n    ///     or <see cref=\"PropertyType.PT_STRING8\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_UNICODE\"/> or <see cref=\"PropertyType.PT_STRING8\" /></exception>\n    public new string ToString\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_UNICODE:\n                case PropertyType.PT_STRING8:\n                    var encoding = Type == PropertyType.PT_STRING8 ? Encoding.Default : Encoding.Unicode;\n                    using (var memoryStream = new MemoryStream(Data))\n                    using (var streamReader = new StreamReader(memoryStream, encoding))\n                    {\n                        var streamContent = streamReader.ReadToEnd();\n                        return streamContent.TrimEnd('\\0');\n                    }\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_UNICODE or PT_STRING8\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a Guid when <see cref=\"Type\" /> is set to <see cref=\"PropertyType.PT_CLSID\" />\n    ///     <see cref=\"PropertyType.PT_OBJECT\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_BINARY\"/></exception>\n    public Guid ToGuid\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_CLSID:\n                    return new Guid(Data);\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_CLSID\");\n            }\n        }\n    }\n\n    /*\n    /// <summary>\n    ///     Variable size; a 16-bit COUNT field followed by a structure as specified in section 2.11.1.4. (PT_SVREID)\n    /// </summary>\n    PtypServerId = 0x00FB,\n\n    /// <summary>\n    ///     Variable size; a byte array representing one or more Restriction structures as specified in section 2.12.\n    ///     (PT_SRESTRICT)\n    /// </summary>\n    PtypRestriction = 0x00FD,\n\n    /// <summary>\n    ///     Variable size; a 16-bit COUNT field followed by that many rule (4) action (3) structures, as specified in\n    ///     [MS-OXORULE] section 2.2.5. (PT_ACTIONS)\n    /// </summary>\n    PtypRuleAction = 0x00FE,\n    */\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as a byte[] when <see cref=\"Type\" /> is set to <see cref=\"PropertyType.PT_BINARY\" />\n    ///     <see cref=\"PropertyType.PT_OBJECT\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_BINARY\"/></exception>\n    public byte[] ToBinary\n    {\n        get\n        {\n            switch (Type)\n            {\n                case PropertyType.PT_BINARY:\n                    return Data;\n\n                default:\n                    throw new MKInvalidProperty(\"Type is not PT_BINARY\");\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of integers when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_SHORT\" /> or <see cref=\"PropertyType.PT_MV_LONG\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_FLOAT\"/></exception>\n    internal ReadOnlyCollection<int> ToIntCollection\n    {\n        get { throw new NotImplementedException(); }\n    }\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of floats when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_FLOAT\" /> or <see cref=\"PropertyType.PT_MV_DOUBLE\" />\n    /// </summary>\n    /// <exception cref=\"MKInvalidProperty\">Raised when the <see cref=\"Type\"/> is not set to <see cref=\"PropertyType.PT_FLOAT\"/></exception>\n    internal ReadOnlyCollection<float> ToFloatCollection => throw new NotImplementedException();\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of decimals when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_CURRENCY\" />\n    /// </summary>\n    internal ReadOnlyCollection<decimal> ToDecimalCollection => throw new NotImplementedException();\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of datetime when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_APPTIME\" /> or <see cref=\"PropertyType.PT_MV_SYSTIME\" />\n    /// </summary>\n    internal ReadOnlyCollection<DateTime> ToDateTimeCollection => throw new NotImplementedException();\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of datetime when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_LONGLONG\" />\n    /// </summary>\n    internal ReadOnlyCollection<long> ToLongCollection => throw new NotImplementedException();\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of strings when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_STRING8\" />\n    /// </summary>\n    internal ReadOnlyCollection<long> ToStringCollection => throw new NotImplementedException();\n\n    ///// <summary>\n    /////     Returns <see cref=\"Data\" /> as an readonly collection of guids when <see cref=\"Type\" /> is set to\n    /////     <see cref=\"PropertyType.PT_MV_CLSID\" />\n    ///// </summary>\n    //internal ReadOnlyCollection<Guid> ToGuidCollection\n    //{\n    //    get { throw new NotImplementedException(); }\n    //}\n\n    /// <summary>\n    ///     Returns <see cref=\"Data\" /> as an readonly collection of byte arrays when <see cref=\"Type\" /> is set to\n    ///     <see cref=\"PropertyType.PT_MV_BINARY\" />\n    /// </summary>\n    internal ReadOnlyCollection<byte[]> ToBinaryCollection => throw new NotImplementedException();\n\n    /*\n    /// <summary>\n    ///     Any: this property type value matches any type; a server MUST return the actual type in its response. Servers\n    ///     MUST NOT return this type in response to a client request other than NspiGetIDsFromNames or the\n    ///     RopGetPropertyIdsFromNamesROP request ([MS-OXCROPS] section 2.2.8.1). (PT_UNSPECIFIED)\n    /// </summary>\n    PtypUnspecified = 0x0000,\n\n    /// <summary>\n    ///     None: This property is a placeholder. (PT_NULL)\n    /// </summary>\n    PtypNull = 0x0001,\n    */\n    #endregion\n\n    #region GetPropertyId\n    /// <summary>\n    ///     Returns the property name, excluding the substorage prefix\n    /// </summary>\n    private static string GetPropertyId(ushort id, PropertyType type, int multiValueIndex = -1) =>\n        id.ToString(\"X4\")\n        + ((ushort)type).ToString(\"X4\")\n        + (multiValueIndex >= 0 ? \"-\" + ((uint)multiValueIndex).ToString(\"X8\") : \"\");\n    #endregion\n\n    #region ByteArrayToDecimal\n    /// <summary>\n    ///     Converts a byte array to a decimal\n    /// </summary>\n    /// <param name=\"source\">The byte array</param>\n    /// <param name=\"offset\">The offset to start reading</param>\n    /// <returns></returns>\n    private static decimal ByteArrayToDecimal(byte[] source, int offset)\n    {\n        var i1 = BitConverter.ToInt32(source, offset);\n        var i2 = BitConverter.ToInt32(source, offset + 4);\n        var i3 = BitConverter.ToInt32(source, offset + 8);\n        var i4 = BitConverter.ToInt32(source, offset + 12);\n\n        return new decimal(new[] { i1, i2, i3, i4 });\n    }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all its propertues\n    /// </summary>\n    /// <param name=\"id\">The id of the property</param>\n    /// <param name=\"type\">The <see cref=\"PropertyType\" /></param>\n    /// <param name=\"data\">The property data</param>\n    /// <param name=\"multiValueIndex\">If part of a multivalue property, this is the index of the value</param>\n    internal Property(ushort id, PropertyType type, byte[] data, int multiValueIndex = -1)\n    {\n        Id = id;\n        Type = type;\n        Data = data;\n        MultiValueIndex = multiValueIndex;\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all its propertues\n    /// </summary>\n    /// <param name=\"id\">The id of the property</param>\n    /// <param name=\"type\">The <see cref=\"PropertyType\" /></param>\n    /// <param name=\"flags\">The <see cref=\"PropertyFlags\" /></param>\n    /// <param name=\"data\">The property data</param>\n    /// <param name=\"multiValueIndex\">If part of a multivalue property, this is the index of the value</param>\n    internal Property(ushort id, PropertyType type, PropertyFlags flags, byte[] data, int multiValueIndex = -1)\n    {\n        Id = id;\n        Type = type;\n        Flags = Convert.ToUInt32(flags);\n        Data = data;\n        MultiValueIndex = multiValueIndex;\n    }\n\n    /// <summary>\n    ///     Creates this object and sets all its propertues\n    /// </summary>\n    /// <param name=\"id\">The id of the property</param>\n    /// <param name=\"type\">The <see cref=\"PropertyType\" /></param>\n    /// <param name=\"flags\">The <see cref=\"PropertyFlags\" /></param>\n    /// <param name=\"data\">The property data</param>\n    /// <param name=\"multiValueIndex\">If part of a multivalue property, this is the index of the value</param>\n    internal Property(ushort id, PropertyType type, uint flags, byte[] data, int multiValueIndex = -1)\n    {\n        Id = id;\n        Type = type;\n        Flags = flags;\n        Data = data;\n        MultiValueIndex = multiValueIndex;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/RecipientRow.cs",
    "content": "//\n// RecipientRow.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\n\n// ReSharper disable UnusedAutoPropertyAccessor.Global\n// ReSharper disable MemberCanBePrivate.Global\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     An array of RecipientRow structures, as specified in [MS-OXCDATA] section 2.8.3.\n///     Each structure specifies an unsendable attendee. The RowCount field specifies the\n///     number of structures contained in this field. For details about properties that can\n///     be set on RecipientRow structures for Calendar objects and meeting-related objects,\n///     see section 2.2.4.10.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee179606(v=exchg.80).aspx\n/// </remarks>\npublic class RecipientRow\n{\n    #region Properties\n    /// <summary>\n    /// The <see cref=\"RecipientType\"/> or null when not available\n    /// </summary>\n    public RecipientType RecipientType { get; }\n\n    /// <summary>\n    ///     The <see cref=\"RecipientRowAddressType\" />\n    /// </summary>\n    public RecipientRowAddressType RecipientRowAddressType { get; }\n\n    /// <summary>\n    ///     The address prefix used\n    /// </summary>\n    public uint AddressPrefixUsed { get; }\n\n    /// <summary>\n    ///     The <see cref=\"RecipientRowDisplayType\" />\n    /// </summary>\n    public RecipientRowDisplayType RecipientRowDisplayType { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the <see cref=\"RecipientRowAddressType\" /> field of the RecipientFlags\n    ///     field is set to X500DN (0x1) and MUST NOT be present otherwise. This value specifies the X500 DN of\n    ///     this recipient (1).\n    /// </summary>\n    /// <remarks>\n    ///     A distinguished name (DN), in Teletex form, of an object that is in an address book. An X500 DN can be more limited\n    ///     in the size and number of relative distinguished names (RDNs) than a full DN.\n    /// </remarks>\n    public string X500Dn { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the <see cref=\"RecipientRowAddressType\" /> field of the RecipientFlags field is set to\n    ///     PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n    ///     NOT be present otherwise. This value specifies the size of the EntryID field.\n    /// </summary>\n    public uint EntryIdSize { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the <see cref=\"RecipientRowAddressType\" /> field of the RecipientFlags field is set to\n    ///     PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST NOT be present otherwise. The\n    ///     number of bytes in this field MUST be the same as specified in the EntryIdSize field. This array specifies the\n    ///     address book EntryID structure, as specified in section 2.2.5.2, of the distribution list.\n    /// </summary>\n    public AddressBookEntryId EntryId { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the <see cref=\"RecipientRowAddressType\" /> field of the RecipientFlags field is set to\n    ///     PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n    ///     NOT be present otherwise. This value specifies the size of the SearchKey field.\n    /// </summary>\n    public uint SearchKeySize { get; }\n\n    /// <summary>\n    ///     This field is used when the <see cref=\"RecipientRowAddressType\" /> field of the RecipientFlags field is set to\n    ///     PersonalDistributionList1 (0x6) or PersonalDistributionList2 (0x7). This field MUST\n    ///     NOT be present otherwise. The number of bytes in this field MUST be the same as what\n    ///     is specified in the SearchKeySize field and can be 0. This array specifies the search\n    ///     key of the distribution list.\n    /// </summary>\n    public byte[] SearchKey { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the <see cref=\"RecipientRowAddressType\" /> field of the\n    ///     RecipientsFlags field is set to NoType (0x0) and the O flag of the RecipientsFlags field\n    ///     is set. This field MUST NOT be present otherwise. This string specifies the address type\n    ///     of the recipient (1).\n    /// </summary>\n    public string AddresType { get; }\n\n    /// <summary>\n    ///     A null-terminated string. This field MUST be present when the E flag of the RecipientsFlags\n    ///     field is set and MUST NOT be present otherwise. This field MUST be specified in Unicode\n    ///     characters if the U flag of the RecipientsFlags field is set and in the 8-bit character set\n    ///     otherwise. This string specifies the email address of the recipient (1).\n    /// </summary>\n    public string EmailAddress { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the D flag of the RecipientsFlags\n    ///     field is set and MUST NOT be present otherwise. This field MUST be specified in Unicode characters if the U flag of\n    ///     the RecipientsFlags field is set and in the 8-bit character set otherwise. This string specifies the email address\n    ///     of the recipient (1).\n    /// </summary>\n    public string DisplayName { get; }\n\n    /// <summary>\n    ///     A null-terminated string. This field MUST be present when the I flag of the RecipientsFlags field is set and MUST\n    ///     NOT be present otherwise. This field MUST be specified in Unicode characters if the U flag of the RecipientsFlags\n    ///     field is set and in the 8-bit character set otherwise. This string specifies the email address of the recipient\n    ///     (1).\n    /// </summary>\n    public string SimpleDisplayName { get; }\n\n    /// <summary>\n    ///     This field MUST be present when the T flag of the RecipientsFlags field is set and MUST NOT be present otherwise.\n    ///     This field MUST be specified in Unicode characters if the U flag of the RecipientsFlags field is set and in the\n    ///     8-bit character set otherwise. This string specifies the email address of the recipient (1).\n    /// </summary>\n    public string TransmittableDisplayName { get; }\n\n    /// <summary>\n    ///     PropertyRow structures, as specified in section 2.8.1. The columns used for this row are those specified in\n    ///     RecipientProperties.\n    /// </summary>\n    public List<Property> RecipientProperties { get; }\n\n    /// <summary>\n    ///     Specifies that the recipient does support receiving rich text messages.\n    /// </summary>\n    public bool SupportsRtf { get; }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's properties\n    /// </summary>\n    /// <param name=\"binaryReader\">The <see cref=\"BinaryReader\" /></param>\n    /// <param name=\"recipientRowAddressType\">The <see cref=\"RecipientRowAddressType\" /></param>\n    /// <param name=\"supportsRtf\">\n    ///     Set to <c>true</c> when the recipient in the <see cref=\"RecipientRow\" />\n    ///     supports RTF\n    /// </param>\n    /// <param name=\"displayNameIncluded\">If this flag is b'1', the DisplayName (section 2.8.3.2) field is included</param>\n    /// <param name=\"emailAddressIncluded\">If this flag is b'1', the EmailAddress (section 2.8.3.2) field is included.</param>\n    /// <param name=\"addressTypeIncluded\">\n    ///     If this flag is b'1', this recipient (1) has a non-standard address type and the\n    ///     AddressType field is included.\n    /// </param>\n    /// <param name=\"simpleDisplayNameIncluded\">If this flag is b'1', the SimpleDisplayName field is included.</param>\n    /// <param name=\"transmittableDisplayNameSameAsDisplayName\">\n    ///     If this flag is b'1', the value of the TransmittableDisplayName\n    ///     field is the same as the value of the DisplayName field.\n    /// </param>\n    /// <param name=\"transmittableDisplayNameIncluded\">\n    ///     If this flag is b'1', the TransmittableDisplayName (section 2.8.3.2)\n    ///     field is included.\n    /// </param>\n    /// <param name=\"stringsInUnicode\">\n    ///     If this flag is b'1', the associated string properties are in Unicode with a 2-\n    ///     byte terminating null character; if this flag is b'0', string properties are MBCS with a single\n    ///     terminating null character, in the code page sent to the server in the EcDoConnectEx method,\n    ///     as specified in [MS-OXCRPC] section 3.1.4.1, or the Connect request type 6, as specified in\n    ///     [MS-OXCMAPIHTTP] section 2.2.4.1.\n    /// </param>\n    internal RecipientRow(BinaryReader binaryReader,\n        RecipientRowAddressType recipientRowAddressType,\n        bool supportsRtf,\n        bool displayNameIncluded,\n        bool emailAddressIncluded,\n        bool addressTypeIncluded,\n        bool simpleDisplayNameIncluded,\n        bool transmittableDisplayNameSameAsDisplayName,\n        bool transmittableDisplayNameIncluded,\n        bool stringsInUnicode)\n    {\n        RecipientRowAddressType = recipientRowAddressType;\n        SupportsRtf = supportsRtf;\n\n        switch (RecipientRowAddressType)\n        {\n            case RecipientRowAddressType.X500Dn:\n                AddressPrefixUsed = binaryReader.ReadByte();\n                RecipientRowDisplayType = (RecipientRowDisplayType)binaryReader.ReadByte();\n                X500Dn = Strings.ReadNullTerminatedAsciiString(binaryReader);\n                break;\n\n            case RecipientRowAddressType.PersonalDistributionList1:\n            case RecipientRowAddressType.PersonalDistributionList2:\n                EntryIdSize = binaryReader.ReadUInt16();\n                EntryId = new AddressBookEntryId(binaryReader);\n                SearchKeySize = binaryReader.ReadUInt16();\n                if (SearchKeySize > 0)\n                    SearchKey = binaryReader.ReadBytes((int)SearchKeySize);\n                break;\n\n            case RecipientRowAddressType.NoType:\n                if (addressTypeIncluded) AddresType = Strings.ReadNullTerminatedAsciiString(binaryReader);\n                break;\n        }\n\n        // MUST be specified in Unicode characters if the U flag of the RecipientsFlags field is set\n        if (emailAddressIncluded) EmailAddress = Strings.ReadNullTerminatedString(binaryReader, stringsInUnicode);\n        if (displayNameIncluded) DisplayName = Strings.ReadNullTerminatedString(binaryReader, stringsInUnicode);\n        if (simpleDisplayNameIncluded)\n            SimpleDisplayName = Strings.ReadNullTerminatedString(binaryReader, stringsInUnicode);\n        if (transmittableDisplayNameSameAsDisplayName) TransmittableDisplayName = DisplayName;\n        else if (transmittableDisplayNameIncluded)\n            TransmittableDisplayName = Strings.ReadNullTerminatedString(binaryReader, stringsInUnicode);\n\n        // This value specifies the number of columns from the RecipientColumns field that are included in \n        // the RecipientProperties field. \n        var columns = binaryReader.ReadInt16();\n\n        // Skip the next 6 bytes\n        binaryReader.ReadBytes(6);\n\n        RecipientProperties = new List<Property>();\n        for (var column = 0; column < columns; column++)\n        {\n            var type = (PropertyType)binaryReader.ReadUInt16();\n            var id = binaryReader.ReadUInt16();\n            byte[] data;\n\n            switch (type)\n            {\n                case PropertyType.PT_NULL:\n                {\n                    data = new byte[0];\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_BOOLEAN:\n                {\n                    data = binaryReader.ReadBytes(1);\n                    binaryReader.ReadByte();\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_SHORT:\n                {\n                    data = binaryReader.ReadBytes(2);\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_LONG:\n                case PropertyType.PT_FLOAT:\n                case PropertyType.PT_ERROR:\n                {\n                    data = binaryReader.ReadBytes(4);\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_DOUBLE:\n                case PropertyType.PT_APPTIME:\n                case PropertyType.PT_I8:\n                case PropertyType.PT_SYSTIME:\n                {\n                    data = binaryReader.ReadBytes(8);\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_CLSID:\n                {\n                    data = binaryReader.ReadBytes(16);\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_OBJECT:\n                    throw new NotSupportedException(\"The PT_OBJECT type is not supported\");\n\n                case PropertyType.PT_STRING8:\n                case PropertyType.PT_UNICODE:\n                case PropertyType.PT_BINARY:\n                {\n                    var length = binaryReader.ReadInt16();\n                    data = binaryReader.ReadBytes(length);\n                    RecipientProperties.Add(new Property(id, type, data));\n                    break;\n                }\n\n                case PropertyType.PT_MV_SHORT:\n                {\n                    var count = binaryReader.ReadInt16();\n                    for (var i = 0; i < count; i++)\n                    {\n                        data = binaryReader.ReadBytes(2);\n                        RecipientProperties.Add(new Property(id, type, data, i));\n                    }\n\n                    break;\n                }\n\n                case PropertyType.PT_MV_LONG:\n                case PropertyType.PT_MV_FLOAT:\n                {\n                    var count = binaryReader.ReadInt16();\n                    for (var i = 0; i < count; i++)\n                    {\n                        data = binaryReader.ReadBytes(4);\n                        RecipientProperties.Add(new Property(id, type, data, i));\n                    }\n\n                    break;\n                }\n\n                case PropertyType.PT_MV_DOUBLE:\n                case PropertyType.PT_MV_APPTIME:\n                case PropertyType.PT_MV_LONGLONG:\n                case PropertyType.PT_MV_SYSTIME:\n                {\n                    var count = binaryReader.ReadInt16();\n                    for (var i = 0; i < count; i++)\n                    {\n                        data = binaryReader.ReadBytes(8);\n                        RecipientProperties.Add(new Property(id, type, data, i));\n                    }\n\n                    break;\n                }\n\n                case PropertyType.PT_MV_TSTRING:\n                case PropertyType.PT_MV_STRING8:\n                case PropertyType.PT_MV_BINARY:\n                {\n                    var count = binaryReader.ReadInt16();\n                    for (var i = 0; i < count; i++)\n                    {\n                        var length = binaryReader.ReadInt16();\n                        data = binaryReader.ReadBytes(length);\n                        RecipientProperties.Add(new Property(id, type, data, i));\n                    }\n\n                    break;\n                }\n\n                case PropertyType.PT_MV_CLSID:\n                {\n                    var count = binaryReader.ReadInt16();\n                    for (var j = 0; j < count; j++)\n                    {\n                        data = binaryReader.ReadBytes(16);\n                        RecipientProperties.Add(new Property(id, type, data));\n                    }\n\n                    break;\n                }\n\n                default:\n                    throw new ArgumentOutOfRangeException();\n            }\n        }\n\n        if (string.IsNullOrWhiteSpace(EmailAddress))\n        {\n            var addressTypeProperty = RecipientProperties.Find(m => m.Id == PropertyTags.PR_ADDRTYPE_W.Id);\n            var emailAddressProperty = RecipientProperties.Find(m => m.Id == PropertyTags.PR_EMAIL_ADDRESS_W.Id);\n            var smtpAddressProperty = RecipientProperties.Find(m => m.Id == PropertyTags.PR_SMTP_ADDRESS_W.Id);\n\n            if (addressTypeProperty != null &&\n                addressTypeProperty.ToString == \"EX\" &&\n                smtpAddressProperty != null)\n            {\n                EmailAddress = Helpers.EmailAddress.RemoveSingleQuotes(smtpAddressProperty.ToString);\n            }\n            else if (emailAddressProperty != null)\n                EmailAddress = Helpers.EmailAddress.RemoveSingleQuotes(emailAddressProperty.ToString);\n        }\n\n        if (string.IsNullOrWhiteSpace(DisplayName))\n        {\n            var value = RecipientProperties.Find(m => m.Id == PropertyTags.PR_DISPLAY_NAME_W.Id);\n            if (value != null)\n                DisplayName = value.ToString;\n        }\n\n        if (string.IsNullOrWhiteSpace(SimpleDisplayName))\n        {\n            var value = RecipientProperties.Find(m => m.Id == PropertyTags.PR_7BIT_DISPLAY_NAME_W.Id);\n            if (value != null)\n                SimpleDisplayName = value.ToString;\n        }\n\n        if (string.IsNullOrWhiteSpace(TransmittableDisplayName))\n        {\n            var value = RecipientProperties.Find(m => m.Id == PropertyTags.PR_TRANSMITABLE_DISPLAY_NAME_W.Id);\n            if (value != null)\n                TransmittableDisplayName = value.ToString;\n        }\n\n        if (transmittableDisplayNameSameAsDisplayName) TransmittableDisplayName = DisplayName;\n\n        var recipientTypeProperty = RecipientProperties.Find(m => m.Id == PropertyTags.PR_RECIPIENT_TYPE.Id);\n        if (recipientTypeProperty != null)\n            RecipientType = (RecipientType)recipientTypeProperty.ToInt;\n\n        var displayTypeProperty = RecipientProperties.Find(m => m.Id == PropertyTags.PR_RECIPIENT_TYPE.Id);\n        if (displayTypeProperty != null)\n            RecipientRowDisplayType = (RecipientRowDisplayType)displayTypeProperty.ToInt;\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/RecurrencePattern.cs",
    "content": "﻿//\n// RecurrencePattern.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n// ReSharper disable InconsistentNaming\n\nusing System;\nusing System.IO;\nusing MsgKit.Enums;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The RecurrencePattern structure specifies a recurrence pattern. The fields of this structure are stored in\n///     little-endian byte order.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n/// </remarks>\npublic class RecurrencePattern\n{\n    #region Properties\n    /// <summary>\n    ///     <see cref=\"RecurrencePatternFrequency\" />\n    /// </summary>\n    public RecurrencePatternFrequency RecurFrequency { get; set; }\n\n    /// <summary>\n    ///     <see cref=\"RecurrencePatternPatternType\" />\n    /// </summary>\n    public RecurrencePatternPatternType PatternType { get; set; }\n\n    /// <summary>\n    ///     <see cref=\"RecurrencePatternCalendarType\" />\n    /// </summary>\n    public RecurrencePatternCalendarType CalendarType { get; set; }\n\n    /// <summary>\n    ///     An integer that specifies the first ever day, week, or month of a recurring series, dating back to a reference date, which is January 1, 1601, for a Gregorian calendar. The value and its meaning depend on the value of the RecurFrequency field. The value of the FirstDateTime field is used to determine the valid dates of a recurring series, as specified in section 2.2.1.44.1.2.\n    /// </summary>\n    public DateTime FirstDateTime { get; set; }\n\n    /// <summary>\n    ///     An integer that specifies the interval at which the meeting pattern specified in PatternTypeSpecific field repeats.\n    ///     The Period value MUST be between 1 and the maximum recurrence interval, which is 999 days for daily recurrences, 99\n    ///     weeks for weekly recurrences, and 99 months for monthly recurrences. The following table lists the values for this\n    ///     field based on the recurrence frequency, which is specified in the RecurFrequency field.\n    /// </summary>\n    public int Period { get; set; }\n\n    /// <summary>\n    ///     TODO: Make structure\n    ///     PatternTypeSpecific (variable):  A structure that specifies the details of the recurrence pattern. The structure\n    ///     varies according to the value of the PatternType field, as specified in sections 2.2.1.44.1.3, 2.2.1.44.1.4,\n    ///     2.2.1.44.1.5, and 2.2.1.44.1.6.\n    /// </summary>\n    public string PatternTypeSpecific { get; set; }\n\n    /// <summary>\n    ///     <see cref=\"RecurrencePatternRecurrenceRangeType\" />\n    /// </summary>\n    public RecurrencePatternRecurrenceRangeType EndType { get; set; }\n\n    /// <summary>\n    ///     An integer that specifies the number of occurrences in a recurrence.\n    /// </summary>\n    /// <remarks>\n    ///     When the EndType of the pattern is \"End after date\", this value always has to be computed. Although the value of\n    ///     this field is always set, its value has no meaning on a recurring series that has no end date. This value can be\n    ///     set to 0x0000000A for a recurring series with no end date\n    /// </remarks>\n    public int OccurenceCount { get; set; }\n\n    /// <summary>\n    ///     <see cref=\"RecurrencePatternFirstDOWDay\" />\n    /// </summary>\n    public RecurrencePatternFirstDOWDay FirstDOW { get; set; }\n\n    /// <summary>\n    ///     An integer that specifies the date of the first occurrence. The value is the number of minutes between midnight,\n    ///     January 1, 1601, and midnight of the date of the first occurrence.\n    /// </summary>\n    public DateTime StartDate { get; set; }\n\n    /// <summary>\n    ///     An integer that specifies the ending date for the recurrence. The value is the number of minutes between midnight,\n    ///     January 1, 1601, and midnight of the date of the last occurrence. When the value of the EndType field is 0x00002022\n    ///     (end after n occurrences), this value is calculated based on the number of occurrences If the recurrence does not\n    ///     have an end date, the value of the EndDate field MUST be set to 0x5AE980DF.\n    /// </summary>\n    public DateTime EndDate { get; set; }\n    #endregion\n\n    #region ToByteArray\n    /// <summary>\n    ///     Returns this class as a byte array\n    /// </summary>\n    internal byte[] ToByteArray()\n    {\n        using (var memoryStream = new MemoryStream())\n        {\n            var binaryWriter = new BinaryWriter(memoryStream);\n            // ReaderVersion (2 bytes):  This field MUST be set to 0x3004.\n            binaryWriter.Write((ushort)0x3004);\n            // WriterVersion (2 bytes):  This field MUST be set to 0x3004.\n            binaryWriter.Write(0x3004);\n            // RecurFrequency (2 bytes):  An integer that specifies the frequency of the recurring series\n            binaryWriter.Write((ushort)RecurFrequency);\n            // PatternType (2 bytes): An integer that specifies the type of recurrence pattern\n            binaryWriter.Write((ushort)PatternType);\n            //CalendarType (2 bytes): An integer that specifies the type of calendar that is used\n            binaryWriter.Write((ushort)CalendarType);\n            // FirstDateTime (4 bytes):  An integer that specifies the first ever day, week, or month of a recurring series, dating back to a reference date, which is January 1, 1601, for a Gregorian calendar. The value and its meaning depend on the value of the RecurFrequency field. The value of the FirstDateTime field is used to determine the valid dates of a recurring series, as specified in section 2.2.1.44.1.2.\n            binaryWriter.Write((int)FirstDateTime.ToFileTime());\n\n            // TODO : Write the rest of the properties https://msdn.microsoft.com/en-us/library/ee203303(v=exchg.80).aspx\n\n            //if (BitConverter.IsLittleEndian)\n            //{\n            //    bits = bits.Reverse().ToArray();\n            //    binaryWriter.Write(bits);\n            //}\n            //else\n            //    binaryWriter.Write(bits);\n\n            //Strings.WriteNullTerminatedUnicodeString(binaryWriter, DisplayName);\n            //Strings.WriteNullTerminatedUnicodeString(binaryWriter, AddressTypeString);\n            //Strings.WriteNullTerminatedUnicodeString(binaryWriter, Email);\n\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/ReportTag.cs",
    "content": "﻿//\n// ReportTag.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.IO;\n\n// ReSharper disable InconsistentNaming\n// ReSharper disable UnassignedGetOnlyAutoProperty\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The PidTagReportTag property ([MS-OXPROPS] section 2.917) contains the data that is used to correlate the report\n///     and the original message. The property can be absent if the sender does not request a reply or response to the\n///     original e-mail message. If the original E-mail object has either the PidTagResponseRequested property (section\n///     2.2.1.46) set to 0x01 or the PidTagReplyRequested property (section 2.2.1.45) set to 0x01, then the property is set\n///     on the original E-mail object by using the following format.\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/ee160822(v=exchg.80).aspx\n/// </remarks>\ninternal class ReportTag\n{\n    #region Properties\n    /// <summary>\n    ///     (9 bytes): A null-terminated string of nine characters used for validation; set to \"PCDFEB09\".\n    /// </summary>\n    public string Cookie => \"PCDFEB09\\0\";\n\n    /// <summary>\n    ///     (4 bytes): This field specifies the version. If the SearchFolderEntryId field is present, this field MUST be set to\n    ///     0x00020001; otherwise, this field MUST be set to 0x00010001.\n    /// </summary>\n    public int Version => 0x00010001;\n\n    /// <summary>\n    ///     (4 bytes): Size of the StoreEntryId field.\n    /// </summary>\n    public int StoreEntryIdSize => 0x00000000;\n\n    /// <summary>\n    ///     (Variable length of bytes): This field specifies the entry ID of the mailbox that contains the original message. If\n    ///     the value of the\n    ///     StoreEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, this field is filled with\n    ///     the number of bytes specified by the StoreEntryIdSize field.\n    /// </summary>\n    public byte[] StoreEntryId { get; }\n\n    /// <summary>\n    ///     (4 bytes): Size of the FolderEntryId field.\n    /// </summary>\n    public int FolderEntryIdSize => 0x00000000;\n\n    /// <summary>\n    ///     (Variable): This field specifies the entry ID of the folder that contains the original message. If the value of the\n    ///     FolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the field is filled with\n    ///     the number of bytes specified by the FolderEntryIdSize field.\n    /// </summary>\n    public int FolderEntryId { get; }\n\n    /// <summary>\n    ///     (4 bytes): Size of the MessageEntryId field.\n    /// </summary>\n    public int MessageEntryIdSize => 0x00000000;\n\n    /// <summary>\n    ///     (Variable): This field specifies the entry ID of the original message. If the value of the MessageEntryIdSize field\n    ///     is 0x00000000, this field is omitted. If the value is not zero, the field is filled with the number of bytes\n    ///     specified by the MessageEntryIdSize field.\n    /// </summary>\n    public int MessageEntryId { get; }\n\n    /// <summary>\n    ///     (4 bytes): Size of the SearchFolderEntryId field.\n    /// </summary>\n    public int SearchFolderEntryIdSize => 0x00000000;\n\n    /// <summary>\n    ///     (Variable): This field specifies the entry ID of an alternate folder that contains the original message. If the\n    ///     value of the SearchFolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the\n    ///     field is filled with the number of bytes specified by the SearchFolderEntryIdSize field.\n    /// </summary>\n    public byte[] SearchFolderEntryId { get; }\n\n    /// <summary>\n    ///     (4 bytes): Size of the MessageSearchKey field.\n    /// </summary>\n    public int MessageSearchKeySize => 0x00000000;\n\n    /// <summary>\n    ///     (variable): This field specifies the search key of the original message. If the value of the MessageSearchKeySize\n    ///     field is 0x00000000, this field is omitted. If the value is not zero, the MessageSearchKey field is filled with the\n    ///     number of bytes specified by the MessageSearchKeySize field.\n    /// </summary>\n    public byte[] MessageSearchKey { get; }\n\n    /// <summary>\n    ///     (4 bytes): Number of characters in the ANSI Text field.\n    /// </summary>\n    public int ANSITextSize => ANSIText.Length;\n\n    /// <summary>\n    ///     (Variable): The subject of the original message. If the value of the ANSITextSize field is 0x00000000, this field\n    ///     is omitted. If the value is not zero, the field is filled with the number of bytes specified by the ANSITextSize\n    ///     field.\n    /// </summary>\n    public string ANSIText { get; internal set; }\n    #endregion\n\n    #region ToByteArray\n    /// <summary>\n    ///     Returns this class as a byte array\n    /// </summary>\n    internal byte[] ToByteArray()\n    {\n        using (var memoryStream = new MemoryStream())\n        {\n            var binaryWriter = new BinaryWriter(memoryStream);\n            // Cookie (9 bytes): A null-terminated string of nine characters used for validation; set to \"PCDFEB09\".\n            binaryWriter.Write(Cookie);\n\n            // Version (4 bytes): This field specifies the version. If the SearchFolderEntryId field is present,\n            // this field MUST be set to 0x00020001; otherwise, this field MUST be set to 0x00010001.\n            binaryWriter.Write(Version);\n\n            // (4 bytes): Size of the StoreEntryId field.\n            binaryWriter.Write(StoreEntryIdSize);\n\n            // (Variable length of bytes): This field specifies the entry ID of the mailbox that contains the original message. If\n            // the value of the StoreEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, this field\n            // is filled with the number of bytes specified by the StoreEntryIdSize field.\n            //binaryWriter.Write(StoreEntryId);\n\n            // (4 bytes): Size of the FolderEntryId field.\n            binaryWriter.Write(FolderEntryIdSize);\n\n            // (Variable): This field specifies the entry ID of the folder that contains the original message. If the value of the\n            // FolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the field is filled with\n            // the number of bytes specified by the FolderEntryIdSize field.\n            //binaryWriter.Write(FolderEntryId);\n\n            // (4 bytes): Size of the MessageEntryId field.\n            binaryWriter.Write(MessageEntryIdSize);\n\n            // (Variable): This field specifies the entry ID of the original message. If the value of the MessageEntryIdSize field\n            // is 0x00000000, this field is omitted. If the value is not zero, the field is filled with the number of bytes\n            // specified by the MessageEntryIdSize field.\n            //binaryWriter.Write(MessageEntryId);\n\n            // (4 bytes): Size of the SearchFolderEntryId field.\n            binaryWriter.Write(SearchFolderEntryIdSize);\n\n            // (Variable): This field specifies the entry ID of an alternate folder that contains the original message. If the\n            // value of the SearchFolderEntryIdSize field is 0x00000000, this field is omitted. If the value is not zero, the\n            // field is filled with the number of bytes specified by the SearchFolderEntryIdSize field.\n            //binaryWriter.Write(SearchFolderEntryId);\n\n            // (4 bytes): Size of the MessageSearchKey field.\n            binaryWriter.Write(MessageSearchKeySize);\n\n            // (variable): This field specifies the search key of the original message. If the value of the MessageSearchKeySize\n            // field is 0x00000000, this field is omitted. If the value is not zero, the MessageSearchKey field is filled with the\n            // number of bytes specified by the MessageSearchKeySize field.\n            //binaryWriter.Write(MessageSearchKey);\n\n            // (4 bytes): Number of characters in the ANSI Text field.\n            binaryWriter.Write(ANSITextSize);\n\n            // (Variable): The subject of the original message. If the value of the ANSITextSize field is 0x00000000, this field\n            // is omitted. If the value is not zero, the field is filled with the number of bytes specified by the ANSITextSize\n            // field.\n            binaryWriter.Write(ANSIText);\n\n            return memoryStream.ToArray();\n        }\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Structures/UnsendableRecipients.cs",
    "content": "﻿//\n// UnsendableRecipients.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing MsgKit.Enums;\nusing MsgKit.Helpers;\n\nnamespace MsgKit.Structures;\n\n/// <summary>\n///     The PidLidAppointmentUnsendableRecipients property ([MS-OXPROPS] section 2.35) contains a list of\n///     unsendable attendees. This property is not required but SHOULD be set\n/// </summary>\npublic class UnsendableRecipients : List<RecipientRow>\n{\n    #region Properties\n    /// <summary>\n    ///     An integer that specifies the number of structures in the RecipientRow field\n    /// </summary>\n    public uint RowCount { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', a different transport is responsible for delivery to this recipient(1).\n    /// </summary>\n    public bool DifferentTransportDelivery { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', the DisplayName (section 2.8.3.2) field is included\n    /// </summary>\n    public bool DisplayNameIncluded { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', the EmailAddress (section 2.8.3.2) field is included.\n    /// </summary>\n    public bool EmailAddressIncluded { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', this recipient (1) has a non-standard address type and the AddressType field is included.\n    /// </summary>\n    public bool AddressTypeIncluded { get; }\n\n    /// <summary>\n    ///     If this flag is b'1', the SimpleDisplayName field is included.\n    /// </summary>\n    public bool SimpleDisplayNameIncluded { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', the value of the TransmittableDisplayName field is the same as the value of the DisplayName\n    ///     field.\n    /// </summary>\n    public bool TransmittableDisplayNameSameAsDisplayName { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', the TransmittableDisplayName (section 2.8.3.2) field is included.\n    /// </summary>\n    public bool TransmittableDisplayNameIncluded { get; internal set; }\n\n    /// <summary>\n    ///     If this flag is b'1', the associated string properties are in Unicode with a 2-\n    ///     byte terminating null character; if this flag is b'0', string properties are MBCS with a single\n    ///     terminating null character, in the code page sent to the server in the EcDoConnectEx method,\n    ///     as specified in [MS-OXCRPC] section 3.1.4.1, or the Connect request type 6, as specified in\n    ///     [MS-OXCMAPIHTTP] section 2.2.4.1.\n    /// </summary>\n    public bool StringsInUnicode { get; internal set; }\n    #endregion\n\n    #region Constructor\n    internal UnsendableRecipients(byte[] data)\n    {\n        var binaryReader = new BinaryReader(new MemoryStream(data));\n        RowCount = binaryReader.ReadUInt32();\n\n        // RecipientFlags https://msdn.microsoft.com/en-us/library/ee201786(v=exchg.80).aspx\n        var b = new BitArray(binaryReader.ReadBytes(4));\n        DifferentTransportDelivery = b[0];\n        TransmittableDisplayNameSameAsDisplayName = b[1];\n        TransmittableDisplayNameIncluded = b[2];\n        DisplayNameIncluded = b[3];\n        EmailAddressIncluded = b[4];\n        // This enumeration specifies the type of address.\n        var bt = new BitArray(3);\n        bt.Set(0, b[5]);\n        bt.Set(1, b[6]);\n        bt.Set(2, b[7]);\n        var array = new int[1];\n        bt.CopyTo(array, 0);\n        var recipientType = (RecipientRowAddressType)array[0];\n        AddressTypeIncluded = b[8];\n        SimpleDisplayNameIncluded = b[13];\n        StringsInUnicode = b[14];\n        var supportsRtf = !b[15];\n\n        while (!binaryReader.Eos())\n            Add(new RecipientRow(binaryReader,\n                recipientType,\n                supportsRtf,\n                DisplayNameIncluded,\n                EmailAddressIncluded,\n                AddressTypeIncluded,\n                SimpleDisplayNameIncluded,\n                TransmittableDisplayNameSameAsDisplayName,\n                TransmittableDisplayNameIncluded, StringsInUnicode));\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/Task.cs",
    "content": "﻿//\n// Task.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing MsgKit.Enums;\nusing Stream = System.IO.Stream;\n\nnamespace MsgKit;\n\n/// <summary>\n///     A class to make a Task\n/// </summary>\n/// <remarks>\n///     Inherits from <see cref=\"Email\"/>>, because it has quite a few of the same fields\n/// </remarks>\n\npublic class Task : Email\n{\n    #region Properties\n    /// <summary>\n    ///     Specifies the <see cref=\"TaskStatus\"/>> of the user's progress on the task\n    /// </summary>\n    public TaskStatus Status { get; set; }\n\n    /// <summary>\n    ///     Percentage complete or <c>null</c>\n    /// </summary>\n    public double? PercentageComplete { get; set; }\n\n    /// <summary>\n    ///     Represents the date when the user expects to complete the task\n    /// </summary>\n    /// <remarks>\n    ///     The task has no due date if this property is unset or set to 0x5AE980E0\n    ///     (1,525,252,320). However, a due date is optional only if no start date is indicated in\n    ///     the dispidTaskStartDate (PidLidTaskStartDate) property. If the task has a due date, the\n    ///     value must have a time component of midnight, and the dispidCommonEnd (PidLidCommonEnd)\n    ///     property must also be set. If dispidTaskStartDate has a start date, then the value of the\n    ///     dispidTaskDueDate property must be greater than or equal to the value of dispidTaskStartDate.\n    /// </remarks>\n    public DateTime? DueDate { get; set; }\n\n    /// <summary>\n    ///     The date when the user expects to begin the task.\n    /// </summary>\n    /// <remarks>\n    ///     If this property value is left unset, the task does not have a start date. A value of\n    ///     \"0x5AE980E0\" (1,525,252,320) also means that the task does not have a start date.\n    ///     If the task has a start date, the value must have a time component of midnight, and the\n    ///     dispidTaskDueDate (PidLidTaskDueDate) and dispidCommonStart (PidLidCommonStart) properties\n    ///     must also be set.\n    /// </remarks>\n    public DateTime? StartDate { get; set; }\n\n    /// <summary>\n    ///     Indicates the number of minutes that the user performed a task.\n    /// </summary>\n    /// <remarks>\n    ///     The value must be greater than or equal to 0 and less than 0x5AE980DF (1,525,252,319),\n    ///     where 480 minutes equal one day and 2400 minutes equal one week (eight hours in a work\n    ///     day and five days in a work week).\n    /// </remarks>\n    public TimeSpan? ActualEffort { get; set; }\n\n    /// <summary>\n    ///     Indicates the amount of time, in minutes, that the user expects to perform a task.\n    /// </summary>\n    /// <remarks>\n    ///     The value must be greater than or equal to 0 and less than 0x5AE980DF (1,525,252,319), where 480 minutes equal\n    ///     one day and 2400 minutes equal one week (eight hours in a work day and five days in a work week).\n    /// </remarks>\n    public TimeSpan? EstimatedEffort { get; set; }\n    \n    /// <summary>\n    ///     Indicates whether the task assignee has been requested to send a task update when the assigned task changes.\n    /// </summary>\n    public bool Updates { get; set; }\n\n    /// <summary>\n    ///     Indicates whether the task assignee has been requested to send an email message update when they complete\n    ///     the assigned task.\n    /// </summary>\n    public bool StatusOnComplete { get; set; }\n\n    /// <summary>\n    ///     Indicates the task is complete.\n    /// </summary>\n    public bool Complete { get; set; }\n\n    /// <summary>\n    ///     Contains the name of the task owner.\n    /// </summary>\n    public string Owner { get; set; }\n\n    /// <summary>\n    ///     Indicates the role of the current user relative to the task.\n    /// </summary>\n    public TaskOwnership Ownership { get; set; }\n    \n    /// <summary>\n    ///     Indicates the acceptance state of the task.\n    /// </summary>\n    public TaskAcceptanceState AcceptanceState { get; set; }\n\n    /// <summary>\n    ///     Indicates which copy is the latest update of a task.\n    /// </summary>\n    /// <remarks>\n    ///     Updates with lower versions than the task are ignored.\n    ///     When embedding a task in a task communication, the client sets the current version of the embedded task\n    ///     on the task communication as well.\n    /// </remarks>\n    public long Version { get; set; } = 1;\n\n    /// <summary>\n    ///     Indicates the current assignment state of the task.\n    /// </summary>\n    public TaskState State { get; set; }\n\n    /// <summary>\n    ///     Names the user who was last assigned the task.\n    /// </summary>\n    /// <remarks>\n    ///     If the task has not been assigned, this property is left unset. Because the client sets this property after\n    ///     the task assignee receives a task request, the property will not be set on the task assigner's copy of the task.\n    ///     When the client adds or removes a task assigner from the task assigner list in the dispidTaskMyDelegators\n    ///     (PidLidTaskAssigners) property, the dispidTaskDelegator (PidLidTaskAssigner) property must be set to the added\n    ///     or removed task assigner.\n    /// </remarks>\n    public string Assigner { get; set; }\n\n    /// <summary>\n    ///     <c>true</c> when it is a team task\n    /// </summary>\n    public bool TeamTask { get; set; }\n\n    /// <summary>\n    ///     Provides an aid to custom sorting tasks.\n    /// </summary>\n    /// <remarks>\n    ///     This property may be left unset. If set, its value must be greater than \"0x800186A0\" (-2,147,383,648) and less than\n    ///     \"0x7FFE7960\" (2,147,383,648) and must be unique among tasks in the same folder.\n    ///     Whenever the client sets this property to a number less than the negative of the current value of the PR_ORDINAL_MOST\n    ///     (PidTagOrdinalMost) property of the folder, the client must also update PR_ORDINAL_MOST on the folder.\n    ///     The PR_ORDINAL_MOST property of the folder provides an efficient way to determine a unique value among tasks in the same folder.\n    /// </remarks>\n    public long? Ordinal { get; set; }\n\n    /// <summary>\n    ///     <c>true</c> when the task is recurring\n    /// </summary>\n    public bool Recurring { get; set; }\n\n    // PidLidTaskRecurrence Canonical Property\n\n    /// <summary>\n    ///     Specifies the interval, in minutes, between the time at which the reminder first becomes overdue and the start time of\n    ///     the Calendar object.\n    /// </summary>\n    public long? ReminderDelta { get; set; }\n\n    /// <summary>\n    ///     Specifies the initial signal time for objects that are not Calendar objects.\n    /// </summary>\n    public DateTime? ReminderTime { get; set; }\n\n    /// <summary>\n    ///     Specifies the point in time when a reminder transitions from pending to overdue.\n    /// </summary>\n    public DateTime? ReminderSignalTime { get; set; }\n\n    /// <summary>\n    ///      Indicates the start time for the Message object.\n    /// </summary>\n    public DateTime? CommonStart { get; set; }\n\n    /// <summary>\n    ///      Indicates the end time for the Message object.\n    /// </summary>\n    public DateTime? CommonEnd { get; set;}\n\n    ///// <summary>\n    /////     Specifies whether a reminder is set on the object.\n    ///// </summary>\n    //public bool ReminderSet { get; set; }\n\n    /// <summary>\n    ///     Specifies the assignment status of the task.\n    /// </summary>\n    public TaskMode Mode { get; set; }\n\n    /// <summary>\n    ///     Determines the sort order of objects in a consolidated to-do list.\n    /// </summary>\n    /// <remarks>\n    ///     When an object is flagged, this property should be set to the current time in Coordinated Universal Time (UTC).\n    ///     If the client allows a user to reorder tasks within the consolidated task list via dragging or other mechanisms,\n    ///     they can use any suitable algorithm to determine the new value of this property so that the task appears in the\n    ///     correct place when this property is used as a sorting field.\n    ///     When this property is used to sort objects and the sort results in a tie, the dispidToDoSubOrdinal (PidLidToDoSubOrdinal)\n    ///     property is used as a tiebreaker.\n    /// </remarks>\n    public DateTime? ToDoOrdinalDate { get; set; }\n\n    /// <summary>\n    ///     Acts as a tiebreaker when the dispidToDoOrdinalDate (PidLidToDoOrdinalDate) property sorts objects and the result in a tie.   \n    /// </summary>\n    /// <remarks>\n    ///     If used, this property must be sorted lexicographically. The component characters of the string must consist of only the numerals\n    ///     zero through nine. This property should be initially set to \"5555555\". The length of this property must not exceed 254 characters\n    ///     (excluding the terminating null character).\n    /// </remarks>\n    public string ToDoSubOrdinal { get; set; }\n    \n    #endregion\n\n    #region Constructors\n    /// <summary>\n    ///     Sends a task with sender, representing, subject, draft.\n    /// </summary>\n    /// <param name=\"sender\"> Contains sender name and email. </param>\n    /// <param name=\"representing\">Contains who this appointment is representing. </param>\n    /// <param name=\"subject\"> Contains the subject for this appointment. </param>\n    /// <param name=\"draft\"> Is this a draft?</param>\n    public Task(Sender sender,\n        Representing representing,\n        string subject,\n        bool draft = false) : base(sender, representing, subject, draft)\n    {\n    }\n\n    /// <summary>\n    ///     Used to send without the representing structure.\n    /// </summary>\n    /// <param name=\"sender\"></param>\n    /// <param name=\"subject\"></param>\n    /// <param name=\"draft\"></param>\n    public Task(Sender sender,\n        string subject,\n        bool draft = false) : base(sender, subject, draft)\n    {\n    }\n    #endregion\n\n    #region WriteToStorage\n    /// <summary>\n    ///     Writes all the properties that are part of the <see cref=\"Task\"/> object either as <see cref=\"OpenMcdf.Storage\"/>'s\n    ///     or <see cref=\"OpenMcdf.CfbStream\"/>'s to the <see cref=\"OpenMcdf.RootStorage\"/>\n    /// </summary>\n    private new void WriteToStorage()\n    {\n        Class = MessageClass.IPM_Task;\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskStatus, Status);\n\n        if (PercentageComplete.HasValue)\n        {\n            if (PercentageComplete is < 0 or > 100)\n                throw new ArgumentOutOfRangeException(nameof(PercentageComplete), \"PercentageComplete must be between 0 and 100\");\n\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidPercentComplete, PercentageComplete.Value);\n        }\n\n        if (DueDate.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskDueDate, DueDate.Value);\n\n        if (StartDate.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskStartDate, StartDate.Value);\n\n        if (ActualEffort.HasValue)\n        {\n            if (ActualEffort.Value.TotalMinutes is < 0 or > 1525252319)\n                throw new ArgumentOutOfRangeException(nameof(ActualEffort), \"ActualEffort must be between 0 and 1525252319\");\n\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskActualEffort, ActualEffort.Value);\n        }\n\n        if (EstimatedEffort.HasValue)\n        {\n            if (EstimatedEffort.Value.TotalMinutes is < 0 or > 1525252319)\n                throw new ArgumentOutOfRangeException(nameof(EstimatedEffort), \"EstimatedEffort must be between 0 and 1525252319\");\n\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskEstimatedEffort, EstimatedEffort.Value);\n        }\n\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskUpdates, Updates);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskStatusOnComplete, StatusOnComplete);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskComplete, Complete);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskOwner, Owner);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskOwnership, Ownership);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidAcceptanceState, AcceptanceState);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskVersion, Version);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskState, State);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskAssigner, Assigner);\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTeamTask, TeamTask);\n        \n        if (Ordinal.HasValue)\n        {\n            if (Ordinal.Value is < -2147383648 or > 2147383648)\n                throw new ArgumentOutOfRangeException(nameof(Ordinal), \"Ordinal must be between -2147383648 and 2147383648\");\n\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskOrdinal, Ordinal.Value);\n        }\n\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidRecurring, Recurring);\n\n        if (ReminderDelta.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidReminderDelta, ReminderDelta);\n\n        if (ReminderTime.HasValue)\n        {\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidReminderTime, ReminderTime);\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidReminderSet, true);\n        }\n        else\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidReminderSet, false);\n\n        if (ReminderSignalTime.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidReminderSignalTime, ReminderSignalTime);\n\n        if (CommonStart.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidCommonStart, CommonStart.Value);\n\n        if (CommonEnd.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidCommonEnd, CommonEnd.Value);\n\n        NamedProperties.AddProperty(NamedPropertyTags.PidLidTaskMode, Mode);\n\n        if (ToDoOrdinalDate.HasValue)\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidToDoOrdinalDate, ToDoOrdinalDate.Value);\n\n        if (!string.IsNullOrWhiteSpace(ToDoSubOrdinal))\n            NamedProperties.AddProperty(NamedPropertyTags.PidLidToDoSubOrdinal, ToDoSubOrdinal);\n    }\n    #endregion\n\n    #region Save\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"stream\" />\n    /// </summary>\n    /// <param name=\"stream\"></param>\n    public new void Save(Stream stream)\n    {\n        WriteToStorage();\n        base.Save(stream);\n    }\n\n    /// <summary>\n    ///     Saves the message to the given <paramref name=\"fileName\" />\n    /// </summary>\n    /// <param name=\"fileName\"></param>\n    public new void Save(string fileName)\n    {\n        WriteToStorage();\n        base.Save(fileName);\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/ThreadIndex.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace MsgKit;\n\n/// <summary>\n///     Identifies a particular conversation thread; computed from message references.\n/// </summary>\npublic class ThreadIndex\n{\n    #region Properties\n    /// <summary>\n    ///     The date and time\n    /// </summary>\n    public DateTime Date { get; }\n\n    /// <summary>\n    ///     The unique GUID for this thread\n    /// </summary>\n    public Guid Id { get; }\n\n    /// <summary>\n    ///     The RAW base64 encoded thread index\n    /// </summary>\n    public string Raw { get; }\n\n    /// <summary>\n    ///     Returns <c>true</c> when the thread index is valid\n    /// </summary>\n    public bool IsValid\n    {\n        get { return Date != default(DateTime) && Id != default(Guid); }\n    }\n    #endregion\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and parses the given <paramref name=\"threadIndex\" />\n    /// </summary>\n    /// <param name=\"threadIndex\"></param>\n    public ThreadIndex(string threadIndex)\n    {\n        Raw = threadIndex;\n\n        var bytes = Convert.FromBase64String(threadIndex);\n\n        // Thread index length should be 22 plus extra 5 bytes per reply\n        if (bytes.Length < 22 || (bytes.Length - 22) % 5 != 0)\n            return;\n\n        Id = new Guid(bytes.Skip(6).Take(16).ToArray());\n\n        var headerTicks = bytes\n                              .Take(6)\n                              .Select(b => (long)b)\n                              .Aggregate((l1, l2) => (l1 << 8) + l2)\n                          << 16;\n\n        Date = new DateTime(headerTicks, DateTimeKind.Utc).AddYears(1600);\n\n        var childBlockCount = (bytes.Length - 22) / 5;\n\n        for (var i = 0; i < childBlockCount; i++)\n        {\n            var childTicks = bytes\n                                 .Skip(22 + i * 5).Take(4)\n                                 .Select(b => (long)b)\n                                 .Aggregate((l1, l2) => (l1 << 8) + l2)\n                             << 18;\n\n            childTicks &= ~((long)1 << 50);\n            Date = Date.AddTicks(childTicks);\n        }\n    }\n    #endregion\n\n    #region ToString\n    /// <summary>\n    ///     Returns the information about this thread index as a string\n    /// </summary>\n    /// <returns></returns>\n    public override string ToString()\n    {\n        return $\"Id: {Id}, Date: {Date.ToLocalTime()}\";\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/TranslateTags.cs",
    "content": "﻿//\n// TranslateTags.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\n// ReSharper disable StringLiteralTypo\n// ReSharper disable UnusedMember.Global\n\nnamespace MsgKit;\n\n/// <summary>\n///     This class maps each MAPI property to the corresponding canonical property name (and the other way around).\n/// </summary>\n/// <remarks>\n///     See https://msdn.microsoft.com/en-us/library/office/cc815492.aspx\n/// </remarks>\ninternal static class TranslateTags\n{\n    private static readonly Dictionary<string, string> Properties = new(StringComparer.InvariantCultureIgnoreCase);\n\n    #region Constructor\n    /// <summary>\n    ///     Creates this object and sets all it's properties\n    /// </summary>\n    static TranslateTags()\n    {\n        Properties.Add(\"dispidABPArrayType\", \"PidLidAddressBookProviderArrayType\");\n        Properties.Add(\"dispidABPEmailList\", \"PidLidAddressBookProviderEmailList\");\n        Properties.Add(\"dispidAddressCountryCode\", \"PidLidAddressCountryCode\");\n        Properties.Add(\"dispidAgingDontAgeMe\", \"PidLidAgingDontAgeMe\");\n        Properties.Add(\"dispidAllAttendeesString\", \"PidLidAllAttendeesString\");\n        Properties.Add(\"dispidAnniversaryEventEID\", \"PidLidAnniversaryEventEntryId\");\n        Properties.Add(\"dispidApptAuxFlags\", \"PidLidAppointmentAuxiliaryFlags\");\n        Properties.Add(\"dispidApptColor\", \"PidLidAppointmentColor\");\n        Properties.Add(\"dispidApptCounterProposal\", \"PidLidAppointmentCounterProposal\");\n        Properties.Add(\"dispidApptDuration\", \"PidLidAppointmentDuration\");\n        Properties.Add(\"dispidApptEndWhole\", \"PidLidAppointmentEndWhole\");\n        Properties.Add(\"dispidApptLastSequence\", \"PidLidAppointmentLastSequence\");\n        Properties.Add(\"dispidApptMessageClass\", \"PidLidAppointmentMessageClass\");\n        Properties.Add(\"dispidApptNotAllowPropose\", \"PidLidAppointmentNotAllowPropose\");\n        Properties.Add(\"dispidApptProposalNum\", \"PidLidAppointmentProposalNumber\");\n        Properties.Add(\"dispidApptProposedDuration\", \"PidLidAppointmentProposedDuration\");\n        Properties.Add(\"dispidApptProposedEndWhole\", \"PidLidAppointmentProposedEndWhole\");\n        Properties.Add(\"dispidApptProposedStartWhole\", \"PidLidAppointmentProposedStartWhole\");\n        Properties.Add(\"dispidApptRecur\", \"PidLidAppointmentRecur\");\n        Properties.Add(\"dispidApptReplyName\", \"PidLidAppointmentReplyName\");\n        Properties.Add(\"dispidApptReplyTime\", \"PidLidAppointmentReplyTime\");\n        Properties.Add(\"dispidApptSeqTime\", \"PidLidAppointmentSequenceTime\");\n        Properties.Add(\"dispidApptSequence\", \"PidLidAppointmentSequence\");\n        Properties.Add(\"dispidApptStartWhole\", \"PidLidAppointmentStartWhole\");\n        Properties.Add(\"dispidApptStateFlags\", \"PidLidAppointmentStateFlags\");\n        Properties.Add(\"dispidApptSubType\", \"PidLidAppointmentSubType\");\n        Properties.Add(\"dispidApptTZDefEndDisplay\", \"PidLidAppointmentTimeZoneDefinitionEndDisplay\");\n        Properties.Add(\"dispidApptTZDefRecur\", \"PidLidAppointmentTimeZoneDefinitionRecur\");\n        Properties.Add(\"dispidApptTZDefStartDisplay\", \"PidLidAppointmentTimeZoneDefinitionStartDisplay\");\n        Properties.Add(\"dispidApptUnsendableRecips\", \"PidLidAppointmentUnsendableRecipients\");\n        Properties.Add(\"dispidAutoFillLocation\", \"PidLidAutoFillLocation\");\n        Properties.Add(\"dispidAutoLog\", \"PidLidAutoLog\");\n        Properties.Add(\"dispidBCCardPicture\", \"PidLidBusinessCardCardPicture\");\n        Properties.Add(\"dispidBCDisplayDefinition\", \"PidLidBusinessCardDisplayDefinition\");\n        Properties.Add(\"dispidBilling\", \"PidLidBilling\");\n        Properties.Add(\"dispidBirthdayEventEID\", \"PidLidBirthdayEventEntryId\");\n        Properties.Add(\"dispidBusyStatus\", \"PidLidBusyStatus\");\n        Properties.Add(\"dispidCategories\", \"PidLidCategories\");\n        Properties.Add(\"dispidCCAttendeesString\", \"PidLidCcAttendeesString\");\n        Properties.Add(\"dispidChangeHighlight\", \"PidLidChangeHighlight\");\n        Properties.Add(\"dispidClassDesc\", \"PidLidClassificationDescription\");\n        Properties.Add(\"dispidClassGuid\", \"PidLidClassificationGuid\");\n        Properties.Add(\"dispidClassification\", \"PidLidClassification\");\n        Properties.Add(\"dispidClassified\", \"PidLidClassified\");\n        Properties.Add(\"dispidClassKeep\", \"PidLidClassificationKeep\");\n        Properties.Add(\"dispidCleanGlobalObjId\", \"PidLidCleanGlobalObjectId\");\n        Properties.Add(\"dispidClipEnd\", \"PidLidClipEnd\");\n        Properties.Add(\"dispidClipStart\", \"PidLidClipStart\");\n        Properties.Add(\"dispidCommonEnd\", \"PidLidCommonEnd\");\n        Properties.Add(\"dispidCommonStart\", \"PidLidCommonStart\");\n        Properties.Add(\"dispidCompanies\", \"PidLidCompanies\");\n        Properties.Add(\"dispidContactCharSet\", \"PidLidContactCharacterSet\");\n        Properties.Add(\"dispidContactItemData\", \"PidLidContactItemData\");\n        Properties.Add(\"dispidContactLinkEntry\", \"PidLidContactLinkEntry\");\n        Properties.Add(\"dispidContactLinkName\", \"PidLidContactLinkName\");\n        Properties.Add(\"dispidContactLinkSearchKey\", \"PidLidContactLinkSearchKey\");\n        Properties.Add(\"dispidContacts\", \"PidLidContacts\");\n        Properties.Add(\"dispidContactUserField1\", \"PidLidContactUserField1\");\n        Properties.Add(\"dispidContactUserField2\", \"PidLidContactUserField2\");\n        Properties.Add(\"dispidContactUserField3\", \"PidLidContactUserField3\");\n        Properties.Add(\"dispidContactUserField4\", \"PidLidContactUserField4\");\n        Properties.Add(\"dispidCurrentVersion\", \"PidLidCurrentVersion\");\n        Properties.Add(\"dispidCurrentVersionName\", \"PidLidCurrentVersionName\");\n        Properties.Add(\"dispidCustomFlag\", \"PidLidCustomFlag\");\n        Properties.Add(\"dispidDLChecksum\", \"PidLidDistributionListChecksum\");\n        Properties.Add(\"dispidDLMembers\", \"PidLidDistributionListMembers\");\n        Properties.Add(\"dispidDLName\", \"PidLidDistributionListName\");\n        Properties.Add(\"dispidDLOneOffMembers\", \"PidLidDistributionListOneOffMembers\");\n        Properties.Add(\"dispidEmail1AddrType\", \"PidLidEmail1AddressType\");\n        Properties.Add(\"dispidEmail1DisplayName\", \"PidLidEmail1DisplayName\");\n        Properties.Add(\"dispidEmail1EmailAddress\", \"PidLidEmail1EmailAddress\");\n        Properties.Add(\"dispidEmail1OriginalDisplayName\", \"PidLidEmail1OriginalDisplayName\");\n        Properties.Add(\"dispidEmail1OriginalEntryID\", \"PidLidEmail1OriginalEntryId\");\n        Properties.Add(\"dispidEmail2AddrType\", \"PidLidEmail2AddressType\");\n        Properties.Add(\"dispidEmail2DisplayName\", \"PidLidEmail2DisplayName\");\n        Properties.Add(\"dispidEmail2EmailAddress\", \"PidLidEmail2EmailAddress\");\n        Properties.Add(\"dispidEmail2OriginalDisplayName\", \"PidLidEmail2OriginalDisplayName\");\n        Properties.Add(\"dispidEmail2OriginalEntryID\", \"PidLidEmail2OriginalEntryId\");\n        Properties.Add(\"dispidEmail3AddrType\", \"PidLidEmail3AddressType\");\n        Properties.Add(\"dispidEmail3DisplayName\", \"PidLidEmail3DisplayName\");\n        Properties.Add(\"dispidEmail3EmailAddress\", \"PidLidEmail3EmailAddress\");\n        Properties.Add(\"dispidEmail3OriginalDisplayName\", \"PidLidEmail3OriginalDisplayName\");\n        Properties.Add(\"dispidEmail3OriginalEntryID\", \"PidLidEmail3OriginalEntryId\");\n        Properties.Add(\"dispidEMSAbX509Cert\", \"PidLidUserX509Certificate\");\n        Properties.Add(\"dispidExceptionReplaceTime\", \"PidLidExceptionReplaceTime\");\n        Properties.Add(\"dispidFax1AddrType\", \"PidLidFax1AddressType\");\n        Properties.Add(\"dispidFax1DisplayName\", \"PidLidFax1DisplayName\");\n        Properties.Add(\"dispidFax1EmailAddress\", \"PidLidFax1EmailAddress\");\n        Properties.Add(\"dispidFax1EmailType\", \"PidLidFax1EmailType\");\n        Properties.Add(\"dispidFax1EntryID\", \"PidLidFax1EntryId\");\n        Properties.Add(\"dispidFax1OriginalDisplayName\", \"PidLidFax1OriginalDisplayName\");\n        Properties.Add(\"dispidFax1OriginalEntryID\", \"PidLidFax1OriginalEntryId\");\n        Properties.Add(\"dispidFax1RTF\", \"PidLidFax1RichTextFormat\");\n        Properties.Add(\"dispidFax2AddrType\", \"PidLidFax2AddressType\");\n        Properties.Add(\"dispidFax2DisplayName\", \"PidLidFax2DisplayName\");\n        Properties.Add(\"dispidFax2EmailAddress\", \"PidLidFax2EmailAddress\");\n        Properties.Add(\"dispidFax2EmailType\", \"PidLidFax2EmailType\");\n        Properties.Add(\"dispidFax2EntryID\", \"PidLidFax2EntryId\");\n        Properties.Add(\"dispidFax2OriginalDisplayName\", \"PidLidFax2OriginalDisplayName\");\n        Properties.Add(\"dispidFax2OriginalEntryID\", \"PidLidFax2OriginalEntryId\");\n        Properties.Add(\"dispidFax2RTF\", \"PidLidFax2RichTextFormat\");\n        Properties.Add(\"dispidFax3AddrType\", \"PidLidFax3AddressType\");\n        Properties.Add(\"dispidFax3DisplayName\", \"PidLidFax3DisplayName\");\n        Properties.Add(\"dispidFax3EmailAddress\", \"PidLidFax3EmailAddress\");\n        Properties.Add(\"dispidFax3EmailType\", \"PidLidFax3EmailType\");\n        Properties.Add(\"dispidFax3EntryID\", \"PidLidFax3EntryId\");\n        Properties.Add(\"dispidFax3OriginalDisplayName\", \"PidLidFax3OriginalDisplayName\");\n        Properties.Add(\"dispidFax3OriginalEntryID\", \"PidLidFax3OriginalEntryId\");\n        Properties.Add(\"dispidFax3RTF\", \"PidLidFax3RichTextFormat\");\n        Properties.Add(\"dispidFExceptionalAttendees\", \"PidLidFExceptionalAttendees\");\n        Properties.Add(\"dispidFExceptionalBody\", \"PidLidFExceptionalBody\");\n        Properties.Add(\"dispidFileUnder\", \"PidLidFileUnder\");\n        Properties.Add(\"dispidFileUnderId\", \"PidLidFileUnderId\");\n        Properties.Add(\"dispidFileUnderList\", \"PidLidFileUnderList\");\n        Properties.Add(\"dispidFInvited\", \"PidLidFInvited\");\n        Properties.Add(\"dispidFlagStringEnum\", \"PidLidFlagString\");\n        Properties.Add(\"dispidFreeBusyLocation\", \"PidLidFreeBusyLocation\");\n        Properties.Add(\"dispidFShouldTNEF\", \"PidLidFShouldTNEF\");\n        Properties.Add(\"dispidFwrdInstance\", \"PidLidForwardInstance\");\n        Properties.Add(\"dispidHasPicture\", \"PidLidHasPicture\");\n        Properties.Add(\"dispidHeaderItem\", \"PidLidHeaderItem\");\n        Properties.Add(\"dispidHomeAddress\", \"PidLidHomeAddress\");\n        Properties.Add(\"dispidHomeAddressCountryCode\", \"PidLidHomeAddressCountryCode\");\n        Properties.Add(\"dispidHTML\", \"PidLidHtml\");\n        Properties.Add(\"dispidImapDeleted\", \"PidLidImapDeleted\");\n        Properties.Add(\"dispidImgAttchmtsCompressLevel\", \"PidLidImageAttachmentsCompressionLevel\");\n        Properties.Add(\"dispidInetAcctName\", \"PidLidInternetAccountName\");\n        Properties.Add(\"dispidInetAcctStamp\", \"PidLidInternetAccountStamp\");\n        Properties.Add(\"dispidInstMsg\", \"PidLidInstantMessagingAddress\");\n        Properties.Add(\"dispidIntendedBusyStatus\", \"PidLidIntendedBusyStatus\");\n        Properties.Add(\"dispidIsIPFax\", \"PidLidIsInterpersonalFax\");\n        Properties.Add(\"dispidLinkedTaskItems\", \"PidLidLinkedTaskItems\");\n        Properties.Add(\"dispidLocation\", \"PidLidLocation\");\n        Properties.Add(\"dispidLogDocPosted\", \"PidLidLogDocumentPosted\");\n        Properties.Add(\"dispidLogDocPrinted\", \"PidLidLogDocumentPrinted\");\n        Properties.Add(\"dispidLogDocRouted\", \"PidLidLogDocumentRouted\");\n        Properties.Add(\"dispidLogDocSaved\", \"PidLidLogDocumentSaved\");\n        Properties.Add(\"dispidLogDuration\", \"PidLidLogDuration\");\n        Properties.Add(\"dispidLogEnd\", \"PidLidLogEnd\");\n        Properties.Add(\"dispidLogFlags\", \"PidLidLogFlags\");\n        Properties.Add(\"dispidLogStart\", \"PidLidLogStart\");\n        Properties.Add(\"dispidLogType\", \"PidLidLogType\");\n        Properties.Add(\"dispidLogTypeDesc\", \"PidLidLogTypeDesc\");\n        Properties.Add(\"dispidMeetingType\", \"PidLidMeetingType\");\n        Properties.Add(\"dispidMileage\", \"PidLidMileage\");\n        Properties.Add(\"dispidMWSURL\", \"PidLidMeetingWorkspaceUrl\");\n        Properties.Add(\"dispidNonSendableBCC\", \"PidLidNonSendableBcc\");\n        Properties.Add(\"dispidNonSendableCC\", \"PidLidNonSendableCc\");\n        Properties.Add(\"dispidNonSendableTo\", \"PidLidNonSendableTo\");\n        Properties.Add(\"dispidNonSendBccTrackStatus\", \"PidLidNonSendBccTrackStatus\");\n        Properties.Add(\"dispidNonSendCcTrackStatus\", \"PidLidNonSendCcTrackStatus\");\n        Properties.Add(\"dispidNonSendToTrackStatus\", \"PidLidNonSendToTrackStatus\");\n        Properties.Add(\"dispidNoteColor\", \"PidLidNoteColor\");\n        Properties.Add(\"dispidNoteHeight\", \"PidLidNoteHeight\");\n        Properties.Add(\"dispidNoteWidth\", \"PidLidNoteWidth\");\n        Properties.Add(\"dispidNoteX\", \"PidLidNoteX\");\n        Properties.Add(\"dispidNoteY\", \"PidLidNoteY\");\n        Properties.Add(\"dispidOfflineStatus\", \"PidLidOfflineStatus\");\n        Properties.Add(\"dispidOldLocation\", \"PidLidOldLocation\");\n        Properties.Add(\"dispidOldWhenEndWhole\", \"PidLidOldWhenEndWhole\");\n        Properties.Add(\"dispidOldWhenStartWhole\", \"PidLidOldWhenStartWhole\");\n        Properties.Add(\"dispidOrigStoreEid\", \"PidLidOriginalStoreEntryId\");\n        Properties.Add(\"dispidOtherAddress\", \"PidLidOtherAddress\");\n        Properties.Add(\"dispidOtherAddressCountryCode\", \"PidLidOtherAddressCountryCode\");\n        Properties.Add(\"dispidPercentComplete\", \"PidLidPercentComplete\");\n        Properties.Add(\"dispidPostalAddressId\", \"PidLidPostalAddressId\");\n        Properties.Add(\"dispidPostRssChannel\", \"PidLidPostRssChannel\");\n        Properties.Add(\"dispidPostRssChannelLink\", \"PidLidPostRssChannelLink\");\n        Properties.Add(\"dispidPrivate\", \"PidLidPrivate\");\n        Properties.Add(\"dispidPropDefStream\", \"PidLidPropertyDefinitionStream\");\n        Properties.Add(\"dispidRecallTime\", \"PidLidRecallTime\");\n        Properties.Add(\"dispidRecurPattern\", \"PidLidRecurrencePattern\");\n        Properties.Add(\"dispidRecurring\", \"PidLidRecurring\");\n        Properties.Add(\"dispidRecurType\", \"PidLidRecurrenceType\");\n        Properties.Add(\"dispidReferenceEID\", \"PidLidReferenceEntryId\");\n        Properties.Add(\"dispidReminderDelta\", \"PidLidReminderDelta\");\n        Properties.Add(\"dispidReminderFileParam\", \"PidLidReminderFileParameter\");\n        Properties.Add(\"dispidReminderNextTime\", \"PidLidReminderSignalTime\");\n        Properties.Add(\"dispidReminderOverride\", \"PidLidReminderOverride\");\n        Properties.Add(\"dispidReminderPlaySound\", \"PidLidReminderPlaySound\");\n        Properties.Add(\"dispidReminderSet\", \"PidLidReminderSet\");\n        Properties.Add(\"dispidReminderTime\", \"PidLidReminderTime\");\n        Properties.Add(\"dispidRemoteAttachment\", \"PidLidRemoteAttachment\");\n        Properties.Add(\"dispidRemoteEID\", \"PidLidRemoteEntryId\");\n        Properties.Add(\"dispidRemoteMsgClass\", \"PidLidRemoteMessageClass\");\n        Properties.Add(\"dispidRemoteSearchKey\", \"PidLidRemoteSearchKey\");\n        Properties.Add(\"dispidRemoteXferSize\", \"PidLidRemoteTransferSize\");\n        Properties.Add(\"dispidRemoteXferTime\", \"PidLidRemoteTransferTime\");\n        Properties.Add(\"dispidRemoteXP\", \"PidLidRemoteTransport\");\n        Properties.Add(\"dispidRequest\", \"PidLidFlagRequest\");\n        Properties.Add(\"dispidResendTime\", \"PidLidResendTime\");\n        Properties.Add(\"dispidResponseStatus\", \"PidLidResponseStatus\");\n        Properties.Add(\"dispidSendMtgAsICAL\", \"PidLidSendMeetingAsIcal\");\n        Properties.Add(\"dispidSharingCaps\", \"PidLidSharingCapabilities\");\n        Properties.Add(\"dispidSharingConfigUrl\", \"PidLidSharingConfigurationUrl\");\n        Properties.Add(\"dispidSharingFlavor\", \"PidLidSharingFlavor\");\n        Properties.Add(\"dispidSharingInitiatorEid\", \"PidLidSharingInitiatorEntryId\");\n        Properties.Add(\"dispidSharingInitiatorName\", \"PidLidSharingInitiatorName\");\n        Properties.Add(\"dispidSharingInitiatorSmtp\", \"PidLidSharingInitiatorSmtp\");\n        Properties.Add(\"dispidSharingLocalType\", \"PidLidSharingLocalType\");\n        Properties.Add(\"dispidSharingProviderGuid\", \"PidLidSharingProviderGuid\");\n        Properties.Add(\"dispidSharingProviderName\", \"PidLidSharingProviderName\");\n        Properties.Add(\"dispidSharingProviderUrl\", \"PidLidSharingProviderUrl\");\n        Properties.Add(\"dispidSharingRemoteName\", \"PidLidSharingRemoteName\");\n        Properties.Add(\"dispidSharingRemoteStoreUid\", \"PidLidSharingRemoteStoreUid\");\n        Properties.Add(\"dispidSharingRemoteType\", \"PidLidSharingRemoteType\");\n        Properties.Add(\"dispidSharingRemoteUid\", \"PidLidSharingRemoteUid\");\n        Properties.Add(\"dispidSharingResponseTime\", \"PidLidSharingResponseTime\");\n        Properties.Add(\"dispidSharingResponseType\", \"PidLidSharingResponseType\");\n        Properties.Add(\"dispidSideEffects\", \"PidLidSideEffects\");\n        Properties.Add(\"dispidSmartNoAttach\", \"PidLidSmartNoAttach\");\n        Properties.Add(\"dispidSniffState\", \"PidLidAutoProcessState\");\n        Properties.Add(\"dispidSpamOriginalFolder\", \"PidLidSpamOriginalFolder\");\n        Properties.Add(\"dispidTaskAccepted\", \"PidLidTaskAccepted\");\n        Properties.Add(\"dispidTaskActualEffort\", \"PidLidTaskActualEffort\");\n        Properties.Add(\"dispidTaskComplete\", \"PidLidTaskComplete\");\n        Properties.Add(\"dispidTaskDateCompleted\", \"PidLidTaskDateCompleted\");\n        Properties.Add(\"dispidTaskDeadOccur\", \"PidLidTaskDeadOccurrence\");\n        Properties.Add(\"dispidTaskDelegator\", \"PidLidTaskAssigner\");\n        Properties.Add(\"dispidTaskDelegValue\", \"PidLidTaskAcceptanceState\");\n        Properties.Add(\"dispidTaskDueDate\", \"PidLidTaskDueDate\");\n        Properties.Add(\"dispidTaskEstimatedEffort\", \"PidLidTaskEstimatedEffort\");\n        Properties.Add(\"dispidTaskFCreator\", \"PidLidTaskFCreator\");\n        Properties.Add(\"dispidTaskFFixOffline\", \"PidLidTaskFFixOffline\");\n        Properties.Add(\"dispidTaskFRecur\", \"PidLidTaskFRecurring\");\n        Properties.Add(\"dispidTaskGlobalObjId\", \"PidLidTaskGlobalId\");\n        Properties.Add(\"dispidTaskHistory\", \"PidLidTaskHistory\");\n        Properties.Add(\"dispidTaskLastDelegate\", \"PidLidTaskLastDelegate\");\n        Properties.Add(\"dispidTaskLastUpdate\", \"PidLidTaskLastUpdate\");\n        Properties.Add(\"dispidTaskLastUser\", \"PidLidTaskLastUser\");\n        Properties.Add(\"dispidTaskMode\", \"PidLidTaskMode\");\n        Properties.Add(\"dispidTaskMultRecips\", \"PidLidTaskMultipleRecipients\");\n        Properties.Add(\"dispidTaskMyDelegators\", \"PidLidTaskAssigners\");\n        Properties.Add(\"dispidTaskOrdinal\", \"PidLidTaskOrdinal\");\n        Properties.Add(\"dispidTaskOwner\", \"PidLidTaskOwner\");\n        Properties.Add(\"dispidTaskOwnership\", \"PidLidTaskOwnership\");\n        Properties.Add(\"dispidTaskRecur\", \"PidLidTaskRecurrence\");\n        Properties.Add(\"dispidTaskResetReminder\", \"PidLidTaskResetReminder\");\n        Properties.Add(\"dispidTaskSOC\", \"PidLidTaskStatusOnComplete\");\n        Properties.Add(\"dispidTaskStartDate\", \"PidLidTaskStartDate\");\n        Properties.Add(\"dispidTaskState\", \"PidLidTaskState\");\n        Properties.Add(\"dispidTaskStatus\", \"PidLidTaskStatus\");\n        Properties.Add(\"dispidTaskUpdates\", \"PidLidTaskUpdates\");\n        Properties.Add(\"dispidTaskVersion\", \"PidLidTaskVersion\");\n        Properties.Add(\"dispidTimeZoneDesc\", \"PidLidTimeZoneDescription\");\n        Properties.Add(\"dispidTimeZoneStruct\", \"PidLidTimeZoneStruct\");\n        Properties.Add(\"dispidToAttendeesString\", \"PidLidToAttendeesString\");\n        Properties.Add(\"dispidToDoOrdinalDate\", \"PidLidToDoOrdinalDate\");\n        Properties.Add(\"dispidToDoSubOrdinal\", \"PidLidToDoSubOrdinal\");\n        Properties.Add(\"dispidToDoTitle\", \"PidLidToDoTitle\");\n        Properties.Add(\"dispidUseTNEF\", \"PidLidUseTnef\");\n        Properties.Add(\"dispidValidFlagStringProof\", \"PidLidValidFlagStringProof\");\n        Properties.Add(\"dispidVerbResponse\", \"PidLidVerbResponse\");\n        Properties.Add(\"dispidVerbStream\", \"PidLidVerbStream\");\n        Properties.Add(\"dispidWorkAddress\", \"PidLidWorkAddress\");\n        Properties.Add(\"dispidWorkAddressCity\", \"PidLidWorkAddressCity\");\n        Properties.Add(\"dispidWorkAddressCountry\", \"PidLidWorkAddressCountry\");\n        Properties.Add(\"dispidWorkAddressCountryCode\", \"PidLidWorkAddressCountryCode\");\n        Properties.Add(\"dispidWorkAddressPostalCode\", \"PidLidWorkAddressPostalCode\");\n        Properties.Add(\"dispidWorkAddressPostOfficeBox\", \"PidLidWorkAddressPostOfficeBox\");\n        Properties.Add(\"dispidWorkAddressState\", \"PidLidWorkAddressState\");\n        Properties.Add(\"dispidWorkAddressStreet\", \"PidLidWorkAddressStreet\");\n        Properties.Add(\"dispidYomiCompanyName\", \"PidLidYomiCompanyName\");\n        Properties.Add(\"dispidYomiFirstName\", \"PidLidYomiFirstName\");\n        Properties.Add(\"dispidYomiLastName\", \"PidLidYomiLastName\");\n        Properties.Add(\"LID_ATTENDEE_CRITICAL_CHANGE\", \"PidLidAttendeeCriticalChange\");\n        Properties.Add(\"LID_CALENDAR_TYPE\", \"PidLidCalendarType\");\n        Properties.Add(\"LID_GLOBAL_OBJID\", \"PidLidGlobalObjectId\");\n        Properties.Add(\"LID_IS_EXCEPTION\", \"PidLidIsException\");\n        Properties.Add(\"LID_IS_RECURRING\", \"PidLidIsRecurring\");\n        Properties.Add(\"LID_IS_SILENT\", \"PidLidIsSilent\");\n        Properties.Add(\"LID_OWNER_CRITICAL_CHANGE\", \"PidLidOwnerCriticalChange\");\n        Properties.Add(\"LID_TIME_ZONE\", \"PidLidTimeZone\");\n        Properties.Add(\"LID_WHERE\", \"PidLidWhere\");\n        Properties.Add(\"PR_EMS_AB_SERVER_W\", \"PidTagEmsAbServer\");\n        Properties.Add(\"PR_END_DATE\", \"PidTagEndDate\");\n        Properties.Add(\"PR_ENTRYID\", \"PidTagEntryId\");\n        Properties.Add(\"PR_EXCEPTION_ENDTIME\", \"PidTagExceptionEndTime\");\n        Properties.Add(\"PR_EXCEPTION_REPLACETIME\", \"PidTagExceptionReplaceTime\");\n        Properties.Add(\"PR_EXCEPTION_STARTTIME\", \"PidTagExceptionStartTime\");\n        Properties.Add(\"PR_EXPIRY_NUMBER\", \"PidTagExpiryNumber\");\n        Properties.Add(\"PR_EXPIRY_TIME\", \"PidTagExpiryTime\");\n        Properties.Add(\"PR_EXPIRY_UNITS\", \"PidTagExpiryUnits\");\n        Properties.Add(\"PR_EXPLICIT_CONVERSION\", \"PidTagExplicitConversion\");\n        Properties.Add(\"PR_EXTENDED_FOLDER_FLAGS\", \"PidTagExtendedFolderFlags\");\n        Properties.Add(\"PR_EXTENDED_RULE_MSG_ACTIONS\", \"PidTagExtendedRuleMessageActions\");\n        Properties.Add(\"PR_EXTENDED_RULE_MSG_CONDITION\", \"PidTagExtendedRuleMessageCondition\");\n        Properties.Add(\"PR_EXTENDED_RULE_SIZE_LIMIT\", \"PidTagExtendedRuleSizeLimit\");\n        Properties.Add(\"PR_FINDER_ENTRYID\", \"PidTagFinderEntryId\");\n        Properties.Add(\"PR_FLAG_COMPLETE_TIME\", \"PidTagFlagCompleteTime\");\n        Properties.Add(\"PR_FLAG_STATUS\", \"PidTagFlagStatus\");\n        Properties.Add(\"PR_FOLDER_ASSOCIATED_CONTENTS\", \"PidTagFolderAssociatedContents\");\n        Properties.Add(\"PR_FOLDER_TYPE\", \"PidTagFolderType\");\n        Properties.Add(\"PR_FOLLOWUP_ICON\", \"PidTagFollowupIcon\");\n        Properties.Add(\"PR_FORM_CATEGORY_A\", \"PidTagFormCategory\");\n        Properties.Add(\"PR_FORM_CATEGORY_SUB_A\", \"PidTagFormCategorySub\");\n        Properties.Add(\"PR_FORM_CATEGORY_SUB_W\", \"PidTagFormCategorySub\");\n        Properties.Add(\"PR_FORM_CATEGORY_SUB\", \"PidTagFormCategorySub\");\n        Properties.Add(\"PR_FORM_CATEGORY_W\", \"PidTagFormCategory\");\n        Properties.Add(\"PR_FORM_CATEGORY\", \"PidTagFormCategory\");\n        Properties.Add(\"PR_FORM_CLSID\", \"PidTagFormClassId\");\n        Properties.Add(\"PR_FORM_CONTACT_NAME_A\", \"PidTagFormContactName\");\n        Properties.Add(\"PR_FORM_CONTACT_NAME_W\", \"PidTagFormContactName\");\n        Properties.Add(\"PR_FORM_CONTACT_NAME\", \"PidTagFormContactName\");\n        Properties.Add(\"PR_FORM_DESIGNER_GUID\", \"PidTagFormDesignerGuid\");\n        Properties.Add(\"PR_FORM_DESIGNER_NAME_A\", \"PidTagFormDesignerName\");\n        Properties.Add(\"PR_FORM_DESIGNER_NAME_W\", \"PidTagFormDesignerName\");\n        Properties.Add(\"PR_FORM_DESIGNER_NAME\", \"PidTagFormDesignerName\");\n        Properties.Add(\"PR_FORM_HIDDEN\", \"PidTagFormHidden\");\n        Properties.Add(\"PR_FORM_HOST_MAP\", \"PidTagFormHostMap\");\n        Properties.Add(\"PR_FORM_MESSAGE_BEHAVIOR\", \"PidTagFormMessageBehavior\");\n        Properties.Add(\"PR_FORM_VERSION_A\", \"PidTagFormVersion\");\n        Properties.Add(\"PR_FORM_VERSION_W\", \"PidTagFormVersion\");\n        Properties.Add(\"PR_FORM_VERSION\", \"PidTagFormVersion\");\n        Properties.Add(\"PR_FREEBUSY_COUNT_MONTHS\", \"PidTagFreeBusyCountMonths\");\n        Properties.Add(\"PR_FREEBUSY_ENTRYIDS\", \"PidTagFreeBusyEntryIds\");\n        Properties.Add(\"PR_FREEBUSY_PUBLISH_END\", \"PidTagFreeBusyPublishEnd\");\n        Properties.Add(\"PR_FREEBUSY_PUBLISH_START\", \"PidTagFreeBusyPublishStart\");\n        Properties.Add(\"PR_FREEBUSY_RANGE_TIMESTAMP\", \"PidTagFreeBusyRangeTimestamp\");\n        Properties.Add(\"PR_FTP_SITE_A\", \"PidTagFtpSite\");\n        Properties.Add(\"PR_FTP_SITE_W\", \"PidTagFtpSite\");\n        Properties.Add(\"PR_FTP_SITE\", \"PidTagFtpSite\");\n        Properties.Add(\"PR_GENDER\", \"PidTagGender\");\n        Properties.Add(\"PR_GENERATION_A\", \"PidTagGeneration\");\n        Properties.Add(\"PR_GENERATION_W\", \"PidTagGeneration\");\n        Properties.Add(\"PR_GENERATION\", \"PidTagGeneration\");\n        Properties.Add(\"PR_GIVEN_NAME_A\", \"PidTagGivenName\");\n        Properties.Add(\"PR_GIVEN_NAME_W\", \"PidTagGivenName\");\n        Properties.Add(\"PR_GIVEN_NAME\", \"PidTagGivenName\");\n        Properties.Add(\"PR_GOVERNMENT_ID_NUMBER_A\", \"PidTagGovernmentIdNumber\");\n        Properties.Add(\"PR_GOVERNMENT_ID_NUMBER_W\", \"PidTagGovernmentIdNumber\");\n        Properties.Add(\"PR_GOVERNMENT_ID_NUMBER\", \"PidTagGovernmentIdNumber\");\n        Properties.Add(\"PR_HAS_DAMS\", \"PidTagHasDeferredActionMessages\");\n        Properties.Add(\"PR_HASATTACH\", \"PidTagHasAttachments\");\n        Properties.Add(\"PR_HOBBIES_A\", \"PidTagHobbies\");\n        Properties.Add(\"PR_HOBBIES_W\", \"PidTagHobbies\");\n        Properties.Add(\"PR_HOBBIES\", \"PidTagHobbies\");\n        Properties.Add(\"PR_HOME_ADDRESS_CITY_A\", \"PidTagHomeAddressCity\");\n        Properties.Add(\"PR_HOME_ADDRESS_CITY_W\", \"PidTagHomeAddressCity\");\n        Properties.Add(\"PR_HOME_ADDRESS_CITY\", \"PidTagHomeAddressCity\");\n        Properties.Add(\"PR_HOME_ADDRESS_COUNTRY_A\", \"PidTagHomeAddressCountry\");\n        Properties.Add(\"PR_HOME_ADDRESS_COUNTRY_W\", \"PidTagHomeAddressCountry\");\n        Properties.Add(\"PR_HOME_ADDRESS_COUNTRY\", \"PidTagHomeAddressCountry\");\n        Properties.Add(\"PR_HOME_ADDRESS_POST_OFFICE_BOX_A\", \"PidTagHomeAddressPostOfficeBox\");\n        Properties.Add(\"PR_HOME_ADDRESS_POST_OFFICE_BOX_W\", \"PidTagHomeAddressPostOfficeBox\");\n        Properties.Add(\"PR_HOME_ADDRESS_POST_OFFICE_BOX\", \"PidTagHomeAddressPostOfficeBox\");\n        Properties.Add(\"PR_HOME_ADDRESS_POSTAL_CODE_A\", \"PidTagHomeAddressPostalCode\");\n        Properties.Add(\"PR_HOME_ADDRESS_POSTAL_CODE_W\", \"PidTagHomeAddressPostalCode\");\n        Properties.Add(\"PR_HOME_ADDRESS_POSTAL_CODE\", \"PidTagHomeAddressPostalCode\");\n        Properties.Add(\"PR_HOME_ADDRESS_STATE_OR_PROVINCE_A\", \"PidTagHomeAddressStateOrProvince\");\n        Properties.Add(\"PR_HOME_ADDRESS_STATE_OR_PROVINCE_W\", \"PidTagHomeAddressStateOrProvince\");\n        Properties.Add(\"PR_HOME_ADDRESS_STATE_OR_PROVINCE\", \"PidTagHomeAddressStateOrProvince\");\n        Properties.Add(\"PR_HOME_ADDRESS_STREET_A\", \"PidTagHomeAddressStreet\");\n        Properties.Add(\"PR_HOME_ADDRESS_STREET_W\", \"PidTagHomeAddressStreet\");\n        Properties.Add(\"PR_HOME_ADDRESS_STREET\", \"PidTagHomeAddressStreet\");\n        Properties.Add(\"PR_HOME_FAX_NUMBER_A\", \"PidTagHomeFaxNumber\");\n        Properties.Add(\"PR_HOME_FAX_NUMBER_W\", \"PidTagHomeFaxNumber\");\n        Properties.Add(\"PR_HOME_FAX_NUMBER\", \"PidTagHomeFaxNumber\");\n        Properties.Add(\"PR_HOME_TELEPHONE_NUMBER_A\", \"PidTagHomeTelephoneNumber\");\n        Properties.Add(\"PR_HOME_TELEPHONE_NUMBER_W\", \"PidTagHomeTelephoneNumber\");\n        Properties.Add(\"PR_HOME_TELEPHONE_NUMBER\", \"PidTagHomeTelephoneNumber\");\n        Properties.Add(\"PR_HOME2_TELEPHONE_NUMBER_A_MV\", \"PidTagHome2TelephoneNumbers\");\n        Properties.Add(\"PR_HOME2_TELEPHONE_NUMBER_A\", \"PidTagHome2TelephoneNumber\");\n        Properties.Add(\"PR_HOME2_TELEPHONE_NUMBER_W\", \"PidTagHome2TelephoneNumber\");\n        Properties.Add(\"PR_HOME2_TELEPHONE_NUMBER\", \"PidTagHome2TelephoneNumber\");\n        Properties.Add(\"PR_HTML\", \"PidTagHtml\");\n        Properties.Add(\"PR_ICON_INDEX\", \"PidTagIconIndex\");\n        Properties.Add(\"PR_ICON\", \"PidTagIcon\");\n        Properties.Add(\"PR_IDENTITY_DISPLAY_A\", \"PidTagIdentityDisplay\");\n        Properties.Add(\"PR_IDENTITY_DISPLAY_W\", \"PidTagIdentityDisplay\");\n        Properties.Add(\"PR_IDENTITY_DISPLAY\", \"PidTagIdentityDisplay\");\n        Properties.Add(\"PR_IDENTITY_ENTRYID\", \"PidTagIdentityEntryId\");\n        Properties.Add(\"PR_IDENTITY_SEARCH_KEY\", \"PidTagIdentitySearchKey\");\n        Properties.Add(\"PR_IMPLICIT_CONVERSION_PROHIBITED\", \"PidTagImplicitConversionProhibited\");\n        Properties.Add(\"PR_IMPORTANCE\", \"PidTagImportance\");\n        Properties.Add(\"PR_IN_CONFLICT\", \"PidTagInConflict\");\n        Properties.Add(\"PR_IN_REPLY_TO_ID_A\", \"PidTagInReplyToId\");\n        Properties.Add(\"PR_IN_REPLY_TO_ID_W\", \"PidTagInReplyToId\");\n        Properties.Add(\"PR_IN_REPLY_TO_ID\", \"PidTagInReplyToId\");\n        Properties.Add(\"PR_INCOMPLETE_COPY\", \"PidTagIncompleteCopy\");\n        Properties.Add(\"PR_INETMAIL_OVERRIDE_FORMAT\", \"PidTagInternetMailOverrideFormat\");\n        Properties.Add(\"PR_INFERENCES_ENABLED\", \"PidTagInferenceEnabled\");\n        Properties.Add(\"PR_INITIAL_DETAILS_PANE\", \"PidTagInitialDetailsPane\");\n        Properties.Add(\"PR_INITIALS_A\", \"PidTagInitials\");\n        Properties.Add(\"PR_INITIALS_W\", \"PidTagInitials\");\n        Properties.Add(\"PR_INITIALS\", \"PidTagInitials\");\n        Properties.Add(\"PR_INSTANCE_KEY\", \"PidTagInstanceKey\");\n        Properties.Add(\"PR_INTERNET_APPROVED\", \"PidTagInternetApproved\");\n        Properties.Add(\"PR_INTERNET_APPROVED_A\", \"PidTagInternetApproved\");\n        Properties.Add(\"PR_INTERNET_APPROVED_W\", \"PidTagInternetApproved\");\n        Properties.Add(\"PR_INTERNET_ARTICLE_NUMBER\", \"PidTagInternetArticleNumber\");\n        Properties.Add(\"PR_INTERNET_CONTROL\", \"PidTagInternetControl\");\n        Properties.Add(\"PR_INTERNET_CONTROL_A\", \"PidTagInternetControl\");\n        Properties.Add(\"PR_INTERNET_CONTROL_W\", \"PidTagInternetControl\");\n        Properties.Add(\"PR_INTERNET_CPID\", \"PidTagInternetCodepage\");\n        Properties.Add(\"PR_INTERNET_DISTRIBUTION\", \"PidTagInternetDistribution\");\n        Properties.Add(\"PR_INTERNET_DISTRIBUTION_A\", \"PidTagInternetDistribution\");\n        Properties.Add(\"PR_INTERNET_DISTRIBUTION_W\", \"PidTagInternetDistribution\");\n        Properties.Add(\"PR_INTERNET_FOLLOWUP_TO\", \"PidTagInternetFollowupTo\");\n        Properties.Add(\"PR_INTERNET_FOLLOWUP_TO_A\", \"PidTagInternetFollowupTo\");\n        Properties.Add(\"PR_INTERNET_FOLLOWUP_TO_W\", \"PidTagInternetFollowupTo\");\n        Properties.Add(\"PR_INTERNET_LINES\", \"PidTagInternetLines\");\n        Properties.Add(\"PR_INTERNET_MESSAGE_ID_A\", \"PidTagInternetMessageId\");\n        Properties.Add(\"PR_INTERNET_MESSAGE_ID_W\", \"PidTagInternetMessageId\");\n        Properties.Add(\"PR_INTERNET_MESSAGE_ID\", \"PidTagInternetMessageId\");\n        Properties.Add(\"PR_INTERNET_NNTP_PATH\", \"PidTagInternetNntpPath\");\n        Properties.Add(\"PR_INTERNET_NNTP_PATH_A\", \"PidTagInternetNntpPath\");\n        Properties.Add(\"PR_INTERNET_NNTP_PATH_W\", \"PidTagInternetNntpPath\");\n        Properties.Add(\"PR_INTERNET_ORGANIZATION\", \"PidTagInternetOrganization\");\n        Properties.Add(\"PR_INTERNET_ORGANIZATION_A\", \"PidTagInternetOrganization\");\n        Properties.Add(\"PR_INTERNET_ORGANIZATION_W\", \"PidTagInternetOrganization\");\n        Properties.Add(\"PR_INTERNET_REFERENCES_A\", \"PidTagInternetReferences\");\n        Properties.Add(\"PR_INTERNET_REFERENCES_W\", \"PidTagInternetReferences\");\n        Properties.Add(\"PR_INTERNET_REFERENCES\", \"PidTagInternetReferences\");\n        Properties.Add(\"PR_INTERNET_RETURN_PATH_A\", \"PidTagInternetReturnPath\");\n        Properties.Add(\"PR_INTERNET_RETURN_PATH_W\", \"PidTagInternetReturnPath\");\n        Properties.Add(\"PR_INTERNET_RETURN_PATH\", \"PidTagInternetReturnPath\");\n        Properties.Add(\"PR_IPM_APPOINTMENT_ENTRYID\", \"PidTagIpmAppointmentEntryId\");\n        Properties.Add(\"PR_IPM_CONTACT_ENTRYID\", \"PidTagIpmContactEntryId\");\n        Properties.Add(\"PR_IPM_DRAFTS_ENTRYID\", \"PidTagIpmDraftsEntryId\");\n        Properties.Add(\"PR_IPM_JOURNAL_ENTRYID\", \"PidTagIpmJournalEntryId\");\n        Properties.Add(\"PR_IPM_NOTE_ENTRYID\", \"PidTagIpmNoteEntryId\");\n        Properties.Add(\"PR_IPM_OUTBOX_ENTRYID\", \"PidTagIpmOutboxEntryId\");\n        Properties.Add(\"PR_IPM_RETURN_REQUESTED\", \"PidTagIpmReturnRequested\");\n        Properties.Add(\"PR_IPM_SENTMAIL_ENTRYID\", \"PidTagIpmSentMailEntryId\");\n        Properties.Add(\"PR_IPM_SUBTREE_ENTRYID\", \"PidTagIpmSubtreeEntryId\");\n        Properties.Add(\"PR_IPM_TASK_ENTRYID\", \"PidTagIpmTaskEntryId\");\n        Properties.Add(\"PR_IPM_WASTEBASKET_ENTRYID\", \"PidTagIpmWastebasketEntryId\");\n        Properties.Add(\"PR_ISDN_NUMBER_A\", \"PidTagIsdnNumber\");\n        Properties.Add(\"PR_ISDN_NUMBER_W\", \"PidTagIsdnNumber\");\n        Properties.Add(\"PR_ISDN_NUMBER\", \"PidTagIsdnNumber\");\n        Properties.Add(\"PR_ITEM_TMPFLAGS\", \"PidTagItemTemporaryflags\");\n        Properties.Add(\"PR_JUNK_ADD_RECIPS_TO_SSL\", \"PidTagJunkAddRecipientsToSafeSendersList\");\n        Properties.Add(\"PR_JUNK_INCLUDE_CONTACTS\", \"PidTagJunkIncludeContacts\");\n        Properties.Add(\"PR_JUNK_PERMANENTLY_DELETE\", \"PidTagJunkPermanentlyDelete\");\n        Properties.Add(\"PR_JUNK_PHISHING_ENABLE_LINKS\", \"PidTagJunkPhishingEnableLinks\");\n        Properties.Add(\"PR_JUNK_THRESHOLD\", \"PidTagJunkThreshold\");\n        Properties.Add(\"PR_KEYWORD_A\", \"PidTagKeyword\");\n        Properties.Add(\"PR_KEYWORD_W\", \"PidTagKeyword\");\n        Properties.Add(\"PR_KEYWORD\", \"PidTagKeyword\");\n        Properties.Add(\"PR_LANGUAGE_A\", \"PidTagLanguage\");\n        Properties.Add(\"PR_LANGUAGE_W\", \"PidTagLanguage\");\n        Properties.Add(\"PR_LANGUAGE\", \"PidTagLanguage\");\n        Properties.Add(\"PR_LANGUAGES_A\", \"PidTagLanguages\");\n        Properties.Add(\"PR_LANGUAGES_W\", \"PidTagLanguages\");\n        Properties.Add(\"PR_LANGUAGES\", \"PidTagLanguages\");\n        Properties.Add(\"PR_LAST_MODIFICATION_TIME\", \"PidTagLastModificationTime\");\n        Properties.Add(\"PR_LAST_VERB_EXECUTED\", \"PidTagLastVerbExecuted\");\n        Properties.Add(\"PR_LAST_VERB_EXECUTION_TIME\", \"PidTagLastVerbExecutionTime\");\n        Properties.Add(\"PR_LATEST_DELIVERY_TIME\", \"PidTagLatestDeliveryTime\");\n        Properties.Add(\"PR_LIST_HELP_A\", \"PidTagListHelp\");\n        Properties.Add(\"PR_LIST_HELP_W\", \"PidTagListHelp\");\n        Properties.Add(\"PR_LIST_HELP\", \"PidTagListHelp\");\n        Properties.Add(\"PR_LIST_SUBSCRIBE_A\", \"PidTagListSubscribe\");\n        Properties.Add(\"PR_LIST_SUBSCRIBE_W\", \"PidTagListSubscribe\");\n        Properties.Add(\"PR_LIST_SUBSCRIBE\", \"PidTagListSubscribe\");\n        Properties.Add(\"PR_LIST_UNSUBSCRIBE_A\", \"PidTagListUnsubscribe\");\n        Properties.Add(\"PR_LIST_UNSUBSCRIBE_W\", \"PidTagListUnsubscribe\");\n        Properties.Add(\"PR_LIST_UNSUBSCRIBE\", \"PidTagListUnsubscribe\");\n        Properties.Add(\"PR_LOCALE_ID\", \"PidTagLocaleId\");\n        Properties.Add(\"PR_LOCALITY_A\", \"PidTagLocality\");\n        Properties.Add(\"PR_LOCALITY_W\", \"PidTagLocality\");\n        Properties.Add(\"PR_LOCALITY\", \"PidTagLocality\");\n        Properties.Add(\"PR_LOCATION_A\", \"PidTagLocation\");\n        Properties.Add(\"PR_LOCATION_W\", \"PidTagLocation\");\n        Properties.Add(\"PR_LOCATION\", \"PidTagLocation\");\n        Properties.Add(\"PR_MAIL_PERMISSION\", \"PidTagMailPermission\");\n        Properties.Add(\"PR_MANAGER_NAME_A\", \"PidTagManagerName\");\n        Properties.Add(\"PR_MANAGER_NAME_W\", \"PidTagManagerName\");\n        Properties.Add(\"PR_MANAGER_NAME\", \"PidTagManagerName\");\n        Properties.Add(\"PR_MAPPING_SIGNATURE\", \"PidTagMappingSignature\");\n        Properties.Add(\"PR_MDB_PROVIDER\", \"PidTagStoreProvider\");\n        Properties.Add(\"PR_MEMBER_ENTRYID\", \"PidTagMemberEntryId\");\n        Properties.Add(\"PR_MEMBER_ID\", \"PidTagMemberId\");\n        Properties.Add(\"PR_MEMBER_NAME\", \"PidTagMemberName\");\n        Properties.Add(\"PR_MEMBER_RIGHTS\", \"PidTagMemberRights\");\n        Properties.Add(\"PR_MESSAGE_ATTACHMENTS\", \"PidTagMessageAttachments\");\n        Properties.Add(\"PR_MESSAGE_CC_ME\", \"PidTagMessageCcMe\");\n        Properties.Add(\"PR_MESSAGE_CLASS_A\", \"PidTagMessageClass\");\n        Properties.Add(\"PR_MESSAGE_CLASS_W\", \"PidTagMessageClass\");\n        Properties.Add(\"PR_MESSAGE_CLASS\", \"PidTagMessageClass\");\n        Properties.Add(\"PR_MESSAGE_CODEPAGE\", \"PidTagMessageCodepage\");\n        Properties.Add(\"PR_MESSAGE_DELIVERY_ID\", \"PidTagMessageDeliveryId\");\n        Properties.Add(\"PR_MESSAGE_DELIVERY_TIME\", \"PidTagMessageDeliveryTime\");\n        Properties.Add(\"PR_MESSAGE_DOWNLOAD_TIME\", \"PidTagMessageDownloadTime\");\n        Properties.Add(\"PR_MESSAGE_FLAGS\", \"PidTagMessageFlags\");\n        Properties.Add(\"PR_MESSAGE_LOCALE_ID\", \"PidTagMessageLocaleId\");\n        Properties.Add(\"PR_MESSAGE_RECIP_ME\", \"PidTagMessageRecipientMe\");\n        Properties.Add(\"PR_MESSAGE_RECIPIENTS\", \"PidTagMessageRecipients\");\n        Properties.Add(\"PR_MESSAGE_SECURITY_LABEL\", \"PidTagMessageSecurityLabel\");\n        Properties.Add(\"PR_MESSAGE_SIZE_EXTENDED\", \"PidTagMessageSizeExtended\");\n        Properties.Add(\"PR_MESSAGE_SIZE\", \"PidTagMessageSize\");\n        Properties.Add(\"PR_MESSAGE_SUBMISSION_ID\", \"PidTagMessageSubmissionId\");\n        Properties.Add(\"PR_MESSAGE_TO_ME\", \"PidTagMessageToMe\");\n        Properties.Add(\"PR_MHS_COMMON_NAME_A\", \"PidTagMessageHandlingSystemCommonName\");\n        Properties.Add(\"PR_MHS_COMMON_NAME_W\", \"PidTagMessageHandlingSystemCommonName\");\n        Properties.Add(\"PR_MHS_COMMON_NAME\", \"PidTagMessageHandlingSystemCommonName\");\n        Properties.Add(\"PR_MIDDLE_NAME_A\", \"PidTagMiddleName\");\n        Properties.Add(\"PR_MIDDLE_NAME_W\", \"PidTagMiddleName\");\n        Properties.Add(\"PR_MIDDLE_NAME\", \"PidTagMiddleName\");\n        Properties.Add(\"PR_MINI_ICON\", \"PidTagMiniIcon\");\n        Properties.Add(\"PR_MOBILE_TELEPHONE_NUMBER_A\", \"PidTagMobileTelephoneNumber\");\n        Properties.Add(\"PR_MOBILE_TELEPHONE_NUMBER_W\", \"PidTagMobileTelephoneNumber\");\n        Properties.Add(\"PR_MOBILE_TELEPHONE_NUMBER\", \"PidTagMobileTelephoneNumber\");\n        Properties.Add(\"PR_MSG_EDITOR_FORMAT\", \"PidTagMessageEditorFormat\");\n        Properties.Add(\"PR_MSG_STATUS\", \"PidTagMessageStatus\");\n        Properties.Add(\"PR_NDR_DIAG_CODE\", \"PidTagNonDeliveryReportDiagCode\");\n        Properties.Add(\"PR_NDR_FROM_ENTRYID\", \"PidTagNonDeliveryReportFromEntryId\");\n        Properties.Add(\"PR_NDR_FROM_NAME\", \"PidTagNonDeliveryReportFromName\");\n        Properties.Add(\"PR_NDR_FROM_SEARCH_KEY\", \"PidTagNonDeliveryReportFromSearchKey\");\n        Properties.Add(\"PR_NDR_REASON_CODE\", \"PidTagNonDeliveryReportReasonCode\");\n        Properties.Add(\"PR_NEXT_SEND_ACCT\", \"PidTagNextSendAcct\");\n        Properties.Add(\"PR_NICKNAME_A\", \"PidTagNickname\");\n        Properties.Add(\"PR_NICKNAME_W\", \"PidTagNickname\");\n        Properties.Add(\"PR_NICKNAME\", \"PidTagNickname\");\n        Properties.Add(\"PR_NON_IPM_SUBTREE_ENTRYID\", \"PidTagNonIpmSubtreeEntryId\");\n        Properties.Add(\"PR_NON_RECEIPT_NOTIFICATION_REQUESTED\", \"PidTagNonReceiptNotificationRequested\");\n        Properties.Add(\"PR_NON_RECEIPT_REASON\", \"PidTagNonReceiptReason\");\n        Properties.Add(\"PR_NORMALIZED_SUBJECT_A\", \"PidTagNormalizedSubject\");\n        Properties.Add(\"PR_NORMALIZED_SUBJECT_W\", \"PidTagNormalizedSubject\");\n        Properties.Add(\"PR_NORMALIZED_SUBJECT\", \"PidTagNormalizedSubject\");\n        Properties.Add(\"PR_OBJECT_TYPE\", \"PidTagObjectType\");\n        Properties.Add(\"PR_OBSOLETED_IPMS\", \"PidTagObsoletedMessageIds\");\n        Properties.Add(\"PR_OFFICE_LOCATION_A\", \"PidTagOfficeLocation\");\n        Properties.Add(\"PR_OFFICE_LOCATION_W\", \"PidTagOfficeLocation\");\n        Properties.Add(\"PR_OFFICE_LOCATION\", \"PidTagOfficeLocation\");\n        Properties.Add(\"PR_OFFICE_TELEPHONE_NUMBER\", \"PidTagBusinessTelephoneNumber\");\n        Properties.Add(\"PR_OFFICE_TELEPHONE_NUMBER_W\", \"PidTagBusinessTelephoneNumber\");\n        Properties.Add(\"PR_OFFICE2_TELEPHONE_NUMBER\", \"PidTagBusiness2TelephoneNumber\");\n        Properties.Add(\"PR_ORDINAL_MOST\", \"PidTagOrdinalMost\");\n        Properties.Add(\"PR_ORG_EMAIL_ADDRESS\", \"PidTagOrgEmailAddress\");\n        Properties.Add(\"PR_ORGANIZATIONAL_ID_NUMBER_A\", \"PidTagOrganizationalIdNumber\");\n        Properties.Add(\"PR_ORGANIZATIONAL_ID_NUMBER_W\", \"PidTagOrganizationalIdNumber\");\n        Properties.Add(\"PR_ORGANIZATIONAL_ID_NUMBER\", \"PidTagOrganizationalIdNumber\");\n        Properties.Add(\"PR_ORIG_MESSAGE_CLASS_A\", \"PidTagOriginalMessageClass\");\n        Properties.Add(\"PR_ORIG_MESSAGE_CLASS_W\", \"PidTagOriginalMessageClass\");\n        Properties.Add(\"PR_ORIG_MESSAGE_CLASS\", \"PidTagOriginalMessageClass\");\n        Properties.Add(\"PR_ORIGIN_CHECK\", \"PidTagOriginCheck\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_ADDRTYPE_A\", \"PidTagOriginalAuthorAddressType\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_ADDRTYPE_W\", \"PidTagOriginalAuthorAddressType\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_ADDRTYPE\", \"PidTagOriginalAuthorAddressType\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_A\", \"PidTagOriginalAuthorEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS_W\", \"PidTagOriginalAuthorEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS\", \"PidTagOriginalAuthorEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_ENTRYID\", \"PidTagOriginalAuthorEntryId\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_NAME_A\", \"PidTagOriginalAuthorName\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_NAME_W\", \"PidTagOriginalAuthorName\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_NAME\", \"PidTagOriginalAuthorName\");\n        Properties.Add(\"PR_ORIGINAL_AUTHOR_SEARCH_KEY\", \"PidTagOriginalAuthorSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_DELIVERY_TIME\", \"PidTagOriginalDeliveryTime\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_BCC_A\", \"PidTagOriginalDisplayBcc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_BCC_W\", \"PidTagOriginalDisplayBcc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_BCC\", \"PidTagOriginalDisplayBcc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_CC_A\", \"PidTagOriginalDisplayCc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_CC_W\", \"PidTagOriginalDisplayCc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_CC\", \"PidTagOriginalDisplayCc\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_NAME_A\", \"PidTagOriginalDisplayName\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_NAME_W\", \"PidTagOriginalDisplayName\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_NAME\", \"PidTagOriginalDisplayName\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_TO_A\", \"PidTagOriginalDisplayTo\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_TO_W\", \"PidTagOriginalDisplayTo\");\n        Properties.Add(\"PR_ORIGINAL_DISPLAY_TO\", \"PidTagOriginalDisplayTo\");\n        Properties.Add(\"PR_ORIGINAL_EITS\", \"PidTagOriginalEits\");\n        Properties.Add(\"PR_ORIGINAL_ENTRYID\", \"PidTagOriginalEntryId\");\n        Properties.Add(\"PR_ORIGINAL_SEARCH_KEY\", \"PidTagOriginalSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_ADDRTYPE_A\", \"PidTagOriginalSenderAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_ADDRTYPE_W\", \"PidTagOriginalSenderAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_ADDRTYPE\", \"PidTagOriginalSenderAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_EMAIL_ADDRESS_A\", \"PidTagOriginalSenderEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_EMAIL_ADDRESS_W\", \"PidTagOriginalSenderEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_EMAIL_ADDRESS\", \"PidTagOriginalSenderEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_ENTRYID\", \"PidTagOriginalSenderEntryId\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_NAME_A\", \"PidTagOriginalSenderName\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_NAME_W\", \"PidTagOriginalSenderName\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_NAME\", \"PidTagOriginalSenderName\");\n        Properties.Add(\"PR_ORIGINAL_SENDER_SEARCH_KEY\", \"PidTagOriginalSenderSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_SENSITIVITY\", \"PidTagOriginalSensitivity\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_A\", \"PidTagOriginalSentRepresentingAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE_W\", \"PidTagOriginalSentRepresentingAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE\", \"PidTagOriginalSentRepresentingAddressType\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_A\",\n            \"PidTagOriginalSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS_W\",\n            \"PidTagOriginalSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS\", \"PidTagOriginalSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_ENTRYID\", \"PidTagOriginalSentRepresentingEntryId\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_NAME_A\", \"PidTagOriginalSentRepresentingName\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_NAME_W\", \"PidTagOriginalSentRepresentingName\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_NAME\", \"PidTagOriginalSentRepresentingName\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY_A\", \"PidTagOriginalSentRepresentingSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY_W\", \"PidTagOriginalSentRepresentingSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY\", \"PidTagOriginalSentRepresentingSearchKey\");\n        Properties.Add(\"PR_ORIGINAL_SUBJECT_A\", \"PidTagOriginalSubject\");\n        Properties.Add(\"PR_ORIGINAL_SUBJECT_W\", \"PidTagOriginalSubject\");\n        Properties.Add(\"PR_ORIGINAL_SUBJECT\", \"PidTagOriginalSubject\");\n        Properties.Add(\"PR_ORIGINAL_SUBMIT_TIME\", \"PidTagOriginalSubmitTime\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_A\", \"PidTagOriginallyIntendedRecipAddrtype\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE_W\", \"PidTagOriginallyIntendedRecipAddrtype\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE\", \"PidTagOriginallyIntendedRecipAddrtype\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_A\", \"PidTagOriginallyIntendedRecipEmailAddress\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS_W\", \"PidTagOriginallyIntendedRecipEmailAddress\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS\", \"PidTagOriginallyIntendedRecipEmailAddress\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIP_ENTRYID\", \"PidTagOriginallyIntendedRecipEntryId\");\n        Properties.Add(\"PR_ORIGINALLY_INTENDED_RECIPIENT_NAME\", \"PidTagOriginallyIntendedRecipientName\");\n        Properties.Add(\"PR_ORIGINATING_MTA_CERTIFICATE\", \"PidTagOriginatingMtaCertificate\");\n        Properties.Add(\"PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY\",\n            \"PidTagOriginatorAndDistributionListExpansionHistory\");\n        Properties.Add(\"PR_ORIGINATOR_CERTIFICATE\", \"PidTagOriginatorCertificate\");\n        Properties.Add(\"PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED\", \"PidTagOriginatorDeliveryReportRequested\");\n        Properties.Add(\"PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED\", \"PidTagOriginatorNonDeliveryReportRequested\");\n        Properties.Add(\"PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT\",\n            \"PidTagOriginatorRequestedAlternateRecipient\");\n        Properties.Add(\"PR_ORIGINATOR_RETURN_ADDRESS\", \"PidTagOriginatorReturnAddress\");\n        Properties.Add(\"PR_OTHER_ADDRESS_CITY_A\", \"PidTagOtherAddressCity\");\n        Properties.Add(\"PR_OTHER_ADDRESS_CITY_W\", \"PidTagOtherAddressCity\");\n        Properties.Add(\"PR_OTHER_ADDRESS_CITY\", \"PidTagOtherAddressCity\");\n        Properties.Add(\"PR_OTHER_ADDRESS_COUNTRY_A\", \"PidTagOtherAddressCountry\");\n        Properties.Add(\"PR_OTHER_ADDRESS_COUNTRY_W\", \"PidTagOtherAddressCountry\");\n        Properties.Add(\"PR_OTHER_ADDRESS_COUNTRY\", \"PidTagOtherAddressCountry\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POST_OFFICE_BOX_A\", \"PidTagOtherAddressPostOfficeBox\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POST_OFFICE_BOX_W\", \"PidTagOtherAddressPostOfficeBox\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POST_OFFICE_BOX\", \"PidTagOtherAddressPostOfficeBox\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POSTAL_CODE_A\", \"PidTagOtherAddressPostalCode\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POSTAL_CODE_W\", \"PidTagOtherAddressPostalCode\");\n        Properties.Add(\"PR_OTHER_ADDRESS_POSTAL_CODE\", \"PidTagOtherAddressPostalCode\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A\", \"PidTagOtherAddressStateOrProvince\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W\", \"PidTagOtherAddressStateOrProvince\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STATE_OR_PROVINCE\", \"PidTagOtherAddressStateOrProvince\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STREET_A\", \"PidTagOtherAddressStreet\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STREET_W\", \"PidTagOtherAddressStreet\");\n        Properties.Add(\"PR_OTHER_ADDRESS_STREET\", \"PidTagOtherAddressStreet\");\n        Properties.Add(\"PR_OTHER_TELEPHONE_NUMBER_A\", \"PidTagOtherTelephoneNumber\");\n        Properties.Add(\"PR_OTHER_TELEPHONE_NUMBER_W\", \"PidTagOtherTelephoneNumber\");\n        Properties.Add(\"PR_OTHER_TELEPHONE_NUMBER\", \"PidTagOtherTelephoneNumber\");\n        Properties.Add(\"PR_OWN_STORE_ENTRYID\", \"PidTagOwnStoreEntryId\");\n        Properties.Add(\"PR_OWNER_APPT_ID\", \"PidTagOwnerAppointmentId\");\n        Properties.Add(\"PR_PAGER_TELEPHONE_NUMBER_A\", \"PidTagPagerTelephoneNumber\");\n        Properties.Add(\"PR_PAGER_TELEPHONE_NUMBER_W\", \"PidTagPagerTelephoneNumber\");\n        Properties.Add(\"PR_PAGER_TELEPHONE_NUMBER\", \"PidTagPagerTelephoneNumber\");\n        Properties.Add(\"PR_PARENT_DISPLAY_A\", \"PidTagParentDisplay\");\n        Properties.Add(\"PR_PARENT_DISPLAY_W\", \"PidTagParentDisplay\");\n        Properties.Add(\"PR_PARENT_DISPLAY\", \"PidTagParentDisplay\");\n        Properties.Add(\"PR_PARENT_ENTRYID\", \"PidTagParentEntryId\");\n        Properties.Add(\"PR_PERSONAL_HOME_PAGE_A\", \"PidTagPersonalHomePage\");\n        Properties.Add(\"PR_PERSONAL_HOME_PAGE_W\", \"PidTagPersonalHomePage\");\n        Properties.Add(\"PR_PERSONAL_HOME_PAGE\", \"PidTagPersonalHomePage\");\n        Properties.Add(\"PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY\", \"PidTagPhysicalDeliveryBureauFaxDelivery\");\n        Properties.Add(\"PR_PHYSICAL_DELIVERY_MODE\", \"PidTagPhysicalDeliveryMode\");\n        Properties.Add(\"PR_PHYSICAL_DELIVERY_REPORT_REQUEST\", \"PidTagPhysicalDeliveryReportRequest\");\n        Properties.Add(\"PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED\", \"PidTagPhysicalForwardingAddressRequested\");\n        Properties.Add(\"PR_PHYSICAL_FORWARDING_ADDRESS\", \"PidTagPhysicalForwardingAddress\");\n        Properties.Add(\"PR_PHYSICAL_FORWARDING_PROHIBITED\", \"PidTagPhysicalForwardingProhibited\");\n        Properties.Add(\"PR_PHYSICAL_RENDITION_ATTRIBUTES\", \"PidTagPhysicalRenditionAttributes\");\n        Properties.Add(\"PR_POST_OFFICE_BOX_A\", \"PidTagPostOfficeBox\");\n        Properties.Add(\"PR_POST_OFFICE_BOX_W\", \"PidTagPostOfficeBox\");\n        Properties.Add(\"PR_POST_OFFICE_BOX\", \"PidTagPostOfficeBox\");\n        Properties.Add(\"PR_POSTAL_ADDRESS_A\", \"PidTagPostalAddress\");\n        Properties.Add(\"PR_POSTAL_ADDRESS_W\", \"PidTagPostalAddress\");\n        Properties.Add(\"PR_POSTAL_ADDRESS\", \"PidTagPostalAddress\");\n        Properties.Add(\"PR_POSTAL_CODE_A\", \"PidTagPostalCode\");\n        Properties.Add(\"PR_POSTAL_CODE_W\", \"PidTagPostalCode\");\n        Properties.Add(\"PR_POSTAL_CODE\", \"PidTagPostalCode\");\n        Properties.Add(\"PR_PREFERRED_BY_NAME_A\", \"PidTagPreferredByName\");\n        Properties.Add(\"PR_PREFERRED_BY_NAME_W\", \"PidTagPreferredByName\");\n        Properties.Add(\"PR_PREFERRED_BY_NAME\", \"PidTagPreferredByName\");\n        Properties.Add(\"PR_PREPROCESS\", \"PidTagPreprocess\");\n        Properties.Add(\"PR_PRIMARY_FAX_NUMBER_A\", \"PidTagPrimaryFaxNumber\");\n        Properties.Add(\"PR_PRIMARY_FAX_NUMBER_W\", \"PidTagPrimaryFaxNumber\");\n        Properties.Add(\"PR_PRIMARY_FAX_NUMBER\", \"PidTagPrimaryFaxNumber\");\n        Properties.Add(\"PR_PRIMARY_SEND_ACCT\", \"PidTagPrimarySendAccount\");\n        Properties.Add(\"PR_PRIMARY_TELEPHONE_NUMBER_A\", \"PidTagPrimaryTelephoneNumber\");\n        Properties.Add(\"PR_PRIMARY_TELEPHONE_NUMBER_W\", \"PidTagPrimaryTelephoneNumber\");\n        Properties.Add(\"PR_PRIMARY_TELEPHONE_NUMBER\", \"PidTagPrimaryTelephoneNumber\");\n        Properties.Add(\"PR_PRIORITY\", \"PidTagPriority\");\n        Properties.Add(\"PR_PROCESSED\", \"PidTagProcessed\");\n        Properties.Add(\"PR_PROFESSION_A\", \"PidTagProfession\");\n        Properties.Add(\"PR_PROFESSION_W\", \"PidTagProfession\");\n        Properties.Add(\"PR_PROFESSION\", \"PidTagProfession\");\n        Properties.Add(\"PR_PROFILE_HOME_SERVER_FQDN\", \"PidTagProfileHomeServerFQDN\");\n        Properties.Add(\"PR_PROFILE_NAME_A\", \"PidTagProfileName\");\n        Properties.Add(\"PR_PROFILE_NAME_W\", \"PidTagProfileName\");\n        Properties.Add(\"PR_PROFILE_NAME\", \"PidTagProfileName\");\n        Properties.Add(\"PR_PROFILE_SERVER_FULL_VERSION\", \"PidTagProfileServerFullVersion\");\n        Properties.Add(\"PR_PROFILE_SERVER_VERSION\", \"PR_PROFILE_SERVER_VERSION\");\n        Properties.Add(\"PR_PROFILE_TYPE\", \"PidTagProfileType\");\n        Properties.Add(\"PR_PROOF_OF_DELIVERY_REQUESTED\", \"PidTagProofOfDeliveryRequested\");\n        Properties.Add(\"PR_PROOF_OF_DELIVERY\", \"PidTagProofOfDelivery\");\n        Properties.Add(\"PR_PROOF_OF_SUBMISSION_REQUESTED\", \"PidTagProofOfSubmissionRequested\");\n        Properties.Add(\"PR_PROOF_OF_SUBMISSION\", \"PidTagProofOfSubmission\");\n        Properties.Add(\"PR_PROVIDER_DISPLAY_A\", \"PidTagProviderDisplay\");\n        Properties.Add(\"PR_PROVIDER_DISPLAY_NAME_W\", \"PidTagProviderDisplayName\");\n        Properties.Add(\"PR_PROVIDER_DISPLAY_NAME\", \"PidTagProviderDisplayName\");\n        Properties.Add(\"PR_PROVIDER_DISPLAY_W\", \"PidTagProviderDisplay\");\n        Properties.Add(\"PR_PROVIDER_DISPLAY\", \"PidTagProviderDisplay\");\n        Properties.Add(\"PR_PROVIDER_DLL_NAME_A\", \"PidTagProviderDllName\");\n        Properties.Add(\"PR_PROVIDER_DLL_NAME_W\", \"PidTagProviderDllName\");\n        Properties.Add(\"PR_PROVIDER_DLL_NAME\", \"PidTagProviderDllName\");\n        Properties.Add(\"PR_PROVIDER_ICON_W\", \"PidTagProviderIcon\");\n        Properties.Add(\"PR_PROVIDER_ICON\", \"PidTagProviderIcon\");\n        Properties.Add(\"PR_PROVIDER_ITEMID\", \"PidTagProviderItemId\");\n        Properties.Add(\"PR_PROVIDER_ORDINAL\", \"PidTagProviderOrdinal\");\n        Properties.Add(\"PR_PROVIDER_PARENT_ITEMID\", \"PidTagProviderParentItemId\");\n        Properties.Add(\"PR_PROVIDER_SUBMIT_TIME\", \"PidTagProviderSubmitTime\");\n        Properties.Add(\"PR_PROVIDER_UID\", \"PidTagProviderUid\");\n        Properties.Add(\"PR_PST_CONFIG_FLAGS\", \"PidTagPstConfigurationFlags\");\n        Properties.Add(\"PR_PST_PATH\", \"PidTagPstPath\");\n        Properties.Add(\"PR_PST_PATH_A\", \"PidTagPstPath\");\n        Properties.Add(\"PR_PST_PATH_W\", \"PidTagPstPath\");\n        Properties.Add(\"PR_PST_PATH_HINT\", \"PidTagPstPathHint\");\n        Properties.Add(\"PR_PST_PATH_HINT_A\", \"PidTagPstPathHint\");\n        Properties.Add(\"PR_PST_PATH_HINT_W\", \"PidTagPstPathHint\");\n        Properties.Add(\"PR_PST_PW_SZ_NEW\", \"PidTagPstPasswordSzNew\");\n        Properties.Add(\"PR_PST_PW_SZ_NEW_A\", \"PidTagPstPasswordSzNew\");\n        Properties.Add(\"PR_PST_PW_SZ_NEW_W\", \"PidTagPstPasswordSzNew\");\n        Properties.Add(\"PR_PST_PW_SZ_OLD\", \"PidTagPstPasswordSzOld\");\n        Properties.Add(\"PR_PST_PW_SZ_OLD_A\", \"PidTagPstPasswordSzOld\");\n        Properties.Add(\"PR_PST_PW_SZ_OLD_W\", \"PidTagPstPasswordSzOld\");\n        Properties.Add(\"PR_PST_REMEMBER_PW\", \"PidTagPstRememberPassword\");\n        Properties.Add(\"PR_RADIO_TELEPHONE_NUMBER_A\", \"PidTagRadioTelephoneNumber\");\n        Properties.Add(\"PR_RADIO_TELEPHONE_NUMBER_W\", \"PidTagRadioTelephoneNumber\");\n        Properties.Add(\"PR_RADIO_TELEPHONE_NUMBER\", \"PidTagRadioTelephoneNumber\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_ADDRTYPE_A\", \"PidTagReceivedRepresentingAddressType\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_ADDRTYPE_W\", \"PidTagReceivedRepresentingAddressType\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_ADDRTYPE\", \"PidTagReceivedRepresentingAddressType\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_EMAIL_ADDRESS_A\", \"PidTagReceivedRepresentingEmailAddress\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_EMAIL_ADDRESS_W\", \"PidTagReceivedRepresentingEmailAddress\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_EMAIL_ADDRESS\", \"PidTagReceivedRepresentingEmailAddress\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_ENTRYID\", \"PidTagReceivedRepresentingEntryId\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_NAME_A\", \"PidTagReceivedRepresentingName\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_NAME_W\", \"PidTagReceivedRepresentingName\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_NAME\", \"PidTagReceivedRepresentingName\");\n        Properties.Add(\"PR_RCVD_REPRESENTING_SEARCH_KEY\", \"PidTagReceivedRepresentingSearchKey\");\n        Properties.Add(\"PR_READ_RECEIPT_ENTRYID\", \"PidTagReadReceiptEntryId\");\n        Properties.Add(\"PR_READ_RECEIPT_REQUESTED\", \"PidTagReadReceiptRequested\");\n        Properties.Add(\"PR_READ_RECEIPT_SEARCH_KEY\", \"PidTagReadReceiptSearchKey\");\n        Properties.Add(\"PR_READ\", \"PidTagRead\");\n        Properties.Add(\"PR_RECEIPT_TIME\", \"PidTagReceiptTime\");\n        Properties.Add(\"PR_RECEIVE_FOLDER_SETTINGS\", \"PidTagReceiveFolderSettings\");\n        Properties.Add(\"PR_RECEIVED_BY_ADDRTYPE_A\", \"PidTagReceivedByAddressType\");\n        Properties.Add(\"PR_RECEIVED_BY_ADDRTYPE_W\", \"PidTagReceivedByAddressType\");\n        Properties.Add(\"PR_RECEIVED_BY_ADDRTYPE\", \"PidTagReceivedByAddressType\");\n        Properties.Add(\"PR_RECEIVED_BY_EMAIL_ADDRESS_A\", \"PidTagReceivedByEmailAddress\");\n        Properties.Add(\"PR_RECEIVED_BY_EMAIL_ADDRESS_W\", \"PidTagReceivedByEmailAddress\");\n        Properties.Add(\"PR_RECEIVED_BY_EMAIL_ADDRESS\", \"PidTagReceivedByEmailAddress\");\n        Properties.Add(\"PR_RECEIVED_BY_ENTRYID\", \"PidTagReceivedByEntryId\");\n        Properties.Add(\"PR_RECEIVED_BY_NAME_A\", \"PidTagReceivedByName\");\n        Properties.Add(\"PR_RECEIVED_BY_NAME_W\", \"PidTagReceivedByName\");\n        Properties.Add(\"PR_RECEIVED_BY_NAME\", \"PidTagReceivedByName\");\n        Properties.Add(\"PR_RECEIVED_BY_SEARCH_KEY\", \"PidTagReceivedBySearchKey\");\n        Properties.Add(\"PR_RECIPIENT_CERTIFICATE\", \"PidTagRecipientCertificate\");\n        Properties.Add(\"PR_RECIPIENT_DISPLAY_NAME_W\", \"PidTagRecipientDisplayName\");\n        Properties.Add(\"PR_RECIPIENT_DISPLAY_NAME\", \"PidTagRecipientDisplayName\");\n        Properties.Add(\"PR_RECIPIENT_ENTRYID\", \"PidTagRecipientEntryId\");\n        Properties.Add(\"PR_RECIPIENT_FLAGS\", \"PidTagRecipientFlags\");\n        Properties.Add(\"PR_RECIPIENT_NUMBER\", \"PidTagRecipientNumber\");\n        Properties.Add(\"PR_RECIPIENT_NUMBER_FOR_ADVICE_A\", \"PidTagRecipientNumberForAdvice\");\n        Properties.Add(\"PR_RECIPIENT_NUMBER_FOR_ADVICE_W\", \"PidTagRecipientNumberForAdvice\");\n        Properties.Add(\"PR_RECIPIENT_NUMBER_FOR_ADVICE\", \"PidTagRecipientNumberForAdvice\");\n        Properties.Add(\"PR_RECIPIENT_PROPOSED\", \"PidTagRecipientProposed\");\n        Properties.Add(\"PR_RECIPIENT_PROPOSEDENDTIME\", \"PidTagRecipientProposedEndTime\");\n        Properties.Add(\"PR_RECIPIENT_PROPOSEDSTARTTIME\", \"PidTagRecipientProposedStartTime\");\n        Properties.Add(\"PR_RECIPIENT_REASSIGNMENT_PROHIBITED\", \"PidTagRecipientReassignmentProhibited\");\n        Properties.Add(\"PR_RECIPIENT_STATUS\", \"PidTagRecipientStatus\");\n        Properties.Add(\"PR_RECIPIENT_TRACKSTATUS_TIME\", \"PidTagRecipientTrackStatusTime\");\n        Properties.Add(\"PR_RECIPIENT_TRACKSTATUS\", \"PidTagRecipientTrackStatus\");\n        Properties.Add(\"PR_RECIPIENT_TYPE\", \"PidTagRecipientType\");\n        Properties.Add(\"PR_RECORD_KEY\", \"PidTagRecordKey\");\n        Properties.Add(\"PR_REDIRECTION_HISTORY\", \"PidTagRedirectionHistory\");\n        Properties.Add(\"PR_REFERRED_BY_NAME_A\", \"PidTagReferredByName\");\n        Properties.Add(\"PR_REFERRED_BY_NAME_W\", \"PidTagReferredByName\");\n        Properties.Add(\"PR_REFERRED_BY_NAME\", \"PidTagReferredByName\");\n        Properties.Add(\"PR_REGISTERED_MAIL_TYPE\", \"PidTagRegisteredMailType\");\n        Properties.Add(\"PR_RELATED_IPMS\", \"PidTagRelatedMessageIds\");\n        Properties.Add(\"PR_REM_ONLINE_ENTRYID\", \"PidTagRemindersOnlineEntryId\");\n        Properties.Add(\"PR_REMOTE_PROGRESS_TEXT_A\", \"PidTagRemoteProgressText\");\n        Properties.Add(\"PR_REMOTE_PROGRESS_TEXT_W\", \"PidTagRemoteProgressText\");\n        Properties.Add(\"PR_REMOTE_PROGRESS_TEXT\", \"PidTagRemoteProgressText\");\n        Properties.Add(\"PR_REMOTE_PROGRESS\", \"PidTagRemoteProgress\");\n        Properties.Add(\"PR_REMOTE_VALIDATE_OK\", \"PidTagRemoteValidateOk\");\n        Properties.Add(\"PR_RENDERING_POSITION\", \"PidTagRenderingPosition\");\n        Properties.Add(\"PR_REPLY_RECIPIENT_ENTRIES\", \"PidTagReplyRecipientEntries\");\n        Properties.Add(\"PR_REPLY_RECIPIENT_NAMES_A\", \"PidTagReplyRecipientNames\");\n        Properties.Add(\"PR_REPLY_RECIPIENT_NAMES_W\", \"PidTagReplyRecipientNames\");\n        Properties.Add(\"PR_REPLY_RECIPIENT_NAMES\", \"PidTagReplyRecipientNames\");\n        Properties.Add(\"PR_REPLY_REQUESTED\", \"PidTagReplyRequested\");\n        Properties.Add(\"PR_REPLY_TEMPLATE_ID\", \"PidTagReplyTemplateId\");\n        Properties.Add(\"PR_REPLY_TIME\", \"PidTagReplyTime\");\n        Properties.Add(\"PR_REPORT_DISPOSITION\", \"PidTagReportDisposition\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_A\", \"PidTagReportDisposition\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_W\", \"PidTagReportDisposition\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_MODE\", \"PidTagReportDispositionMode\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_MODE_A\", \"PidTagReportDispositionMode\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_MODE_W\", \"PidTagReportDispositionMode\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_OPTIONS\", \"PidTagReportDispositionOptions\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_OPTIONS_A\", \"PidTagReportDispositionOptions\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_OPTIONS_W\", \"PidTagReportDispositionOptions\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_EMAIL_ADDRESSES\", \"PidTagReportDispositionToEmailAddresses\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_EMAIL_ADDRESSES_A\", \"PidTagReportDispositionToEmailAddresses\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_EMAIL_ADDRESSES_W\", \"PidTagReportDispositionToEmailAddresses\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_NAMES\", \"PidTagReportDispositionToNames\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_NAMES_A\", \"PidTagReportDispositionToNames\");\n        Properties.Add(\"PR_REPORT_DISPOSITION_TO_NAMES_W\", \"PidTagReportDispositionToNames\");\n        Properties.Add(\"PR_REPORT_ENTRYID\", \"PidTagReportEntryId\");\n        Properties.Add(\"PR_REPORT_NAME_A\", \"PidTagReportName\");\n        Properties.Add(\"PR_REPORT_NAME_W\", \"PidTagReportName\");\n        Properties.Add(\"PR_REPORT_NAME\", \"PidTagReportName\");\n        Properties.Add(\"PR_REPORT_ORIGINAL_SENDER\", \"PidTagReportOriginalSender\");\n        Properties.Add(\"PR_REPORT_ORIGINAL_SENDER_A\", \"PidTagReportOriginalSender\");\n        Properties.Add(\"PR_REPORT_ORIGINAL_SENDER_W\", \"PidTagReportOriginalSender\");\n        Properties.Add(\"PR_REPORT_SEARCH_KEY\", \"PidTagReportSearchKey\");\n        Properties.Add(\"PR_REPORT_TAG\", \"PidTagReportTag\");\n        Properties.Add(\"PR_REPORT_TEXT_A\", \"PidTagReportText\");\n        Properties.Add(\"PR_REPORT_TEXT_W\", \"PidTagReportText\");\n        Properties.Add(\"PR_REPORT_TEXT\", \"PidTagReportText\");\n        Properties.Add(\"PR_REPORT_TIME\", \"PidTagReportTime\");\n        Properties.Add(\"PR_REPORTING_DL_NAME\", \"PidTagReportingDistributionListName\");\n        Properties.Add(\"PR_REPORTING_MTA_CERTIFICATE\", \"PidTagReportingMessageTransferAgentCertificate\");\n        Properties.Add(\"PR_REQUESTED_DELIVERY_METHOD\", \"PidTagRequestedDeliveryMethod\");\n        Properties.Add(\"PR_RESOLVE_METHOD\", \"PidTagResolveMethod\");\n        Properties.Add(\"PR_RESOURCE_FLAGS\", \"PidTagResourceFlags\");\n        Properties.Add(\"PR_RESOURCE_METHODS\", \"PidTagResourceMethods\");\n        Properties.Add(\"PR_RESOURCE_PATH_A\", \"PidTagResourcePath\");\n        Properties.Add(\"PR_RESOURCE_PATH_W\", \"PidTagResourcePath\");\n        Properties.Add(\"PR_RESOURCE_PATH\", \"PidTagResourcePath\");\n        Properties.Add(\"PR_RESOURCE_TYPE\", \"PidTagResourceType\");\n        Properties.Add(\"PR_RESPONSE_REQUESTED\", \"PidTagResponseRequested\");\n        Properties.Add(\"PR_RESPONSIBILITY\", \"PidTagResponsibility\");\n        Properties.Add(\"PR_RETURNED_IPM\", \"PidTagReturnedMessageid\");\n        Properties.Add(\"PR_ROAMING_BINARYSTREAM\", \"PidTagRoamingBinary\");\n        Properties.Add(\"PR_ROAMING_DATATYPES\", \"PidTagRoamingDatatypes\");\n        Properties.Add(\"PR_ROAMING_DICTIONARY\", \"PidTagRoamingDictionary\");\n        Properties.Add(\"PR_ROAMING_XMLSTREAM\", \"PidTagRoamingXmlStream\");\n        Properties.Add(\"PR_ROH_FLAGS\", \"PidTagRpcOverHttpFlags\");\n        Properties.Add(\"PR_ROH_PROXY_AUTH_SCHEME\", \"PidTagRpcOverHttpProxyAuthScheme\");\n        Properties.Add(\"PR_ROH_PROXY_PRINCIPAL_NAME\", \"PidTagRpcOverHttpProxyPrincipalName\");\n        Properties.Add(\"PR_ROH_PROXY_SERVER\", \"PidTagRpcOverHttpProxyServer\");\n        Properties.Add(\"PR_ROW_TYPE\", \"PidTagRowType\");\n        Properties.Add(\"PR_ROWID\", \"PidTagRowid\");\n        Properties.Add(\"PR_RTF_COMPRESSED\", \"PidTagRtfCompressed\");\n        Properties.Add(\"PR_RTF_IN_SYNC\", \"PidTagRtfInSync\");\n        Properties.Add(\"PR_RTF_SYNC_BODY_COUNT\", \"PidTagRtfSyncBodyCount\");\n        Properties.Add(\"PR_RTF_SYNC_BODY_CRC\", \"PidTagRtfSyncBodyCrc\");\n        Properties.Add(\"PR_RTF_SYNC_BODY_TAG_A\", \"PidTagRtfSyncBodyTag\");\n        Properties.Add(\"PR_RTF_SYNC_BODY_TAG_W\", \"PidTagRtfSyncBodyTag\");\n        Properties.Add(\"PR_RTF_SYNC_BODY_TAG\", \"PidTagRtfSyncBodyTag\");\n        Properties.Add(\"PR_RTF_SYNC_PREFIX_COUNT\", \"PidTagRtfSyncPrefixCount\");\n        Properties.Add(\"PR_RTF_SYNC_TRAILING_COUNT\", \"PidTagRtfSyncTrailingCount\");\n        Properties.Add(\"PR_RULE_ACTIONS\", \"PidTagRuleActions\");\n        Properties.Add(\"PR_RULE_CONDITION\", \"PidTagRuleCondition\");\n        Properties.Add(\"PR_RULE_ID\", \"PidTagRuleId\");\n        Properties.Add(\"PR_RULE_LEVEL\", \"PidTagRuleLevel\");\n        Properties.Add(\"PR_RULE_MSG_NAME\", \"PidTagRuleMsgName\");\n        Properties.Add(\"PR_RULE_MSG_PROVIDER\", \"PidTagRuleMsgProvider\");\n        Properties.Add(\"PR_RULE_NAME\", \"PidTagRuleName\");\n        Properties.Add(\"PR_RULE_PROVIDER\", \"PidTagRuleProvider\");\n        Properties.Add(\"PR_RULE_PROVIDER_DATA\", \"PidTagRuleProviderData\");\n        Properties.Add(\"PR_RULE_SEQUENCE\", \"PidTagRuleSequence\");\n        Properties.Add(\"PR_RULE_STATE\", \"PidTagRuleState\");\n        Properties.Add(\"PR_RULE_USER_FLAGS\", \"PidTagRuleUserFlags\");\n        Properties.Add(\"PR_RULES_TABLE\", \"PidTagRulesTable\");\n        Properties.Add(\"PR_SCHDINFO_APPT_TOMBSTONE\", \"PidTagScheduleInfoAppointmentTombstone\");\n        Properties.Add(\"PR_SCHDINFO_AUTO_ACCEPT_APPTS\", \"PidTagScheduleInfoAutoAcceptAppointments\");\n        Properties.Add(\"PR_SCHDINFO_BOSS_WANTS_COPY\", \"PidTagScheduleInfoDelegatorWantsCopy\");\n        Properties.Add(\"PR_SCHDINFO_BOSS_WANTS_INFO\", \"PidTagScheduleInfoDelegatorWantsInfo\");\n        Properties.Add(\"PR_SCHDINFO_DELEGATE_ENTRYIDS\", \"PidTagScheduleInfoDelegateEntryIds\");\n        Properties.Add(\"PR_SCHDINFO_DELEGATE_NAMES\", \"PidTagScheduleInfoDelegateNames\");\n        Properties.Add(\"PR_SCHDINFO_DISALLOW_OVERLAPPING_APPTS\", \"PidTagScheduleInfoDisallowOverlappingAppts\");\n        Properties.Add(\"PR_SCHDINFO_DISALLOW_RECURRING_APPTS\", \"PidTagScheduleInfoDisallowRecurringAppts\");\n        Properties.Add(\"PR_SCHDINFO_DONT_MAIL_DELEGATES\", \"PidTagScheduleInfoDontMailDelegates\");\n        Properties.Add(\"PR_SCHDINFO_FREEBUSY_BUSY\", \"PidTagScheduleInfoFreeBusyBusy\");\n        Properties.Add(\"PR_SCHDINFO_FREEBUSY_MERGED\", \"PidTagScheduleInfoFreeBusyMerged\");\n        Properties.Add(\"PR_SCHDINFO_FREEBUSY_OOF\", \"PidTagScheduleInfoFreeBusyAway\");\n        Properties.Add(\"PR_SCHDINFO_FREEBUSY_TENTATIVE\", \"PidTagScheduleInfoFreeBusyTentative\");\n        Properties.Add(\"PR_SCHDINFO_FREEBUSY\", \"PidTagScheduleInfoFreeBusy\");\n        Properties.Add(\"PR_SCHDINFO_MONTHS_BUSY\", \"PidTagScheduleInfoMonthsBusy\");\n        Properties.Add(\"PR_SCHDINFO_MONTHS_MERGED\", \"PidTagScheduleInfoMonthsMerged\");\n        Properties.Add(\"PR_SCHDINFO_MONTHS_OOF\", \"PidTagScheduleInfoMonthsAway\");\n        Properties.Add(\"PR_SCHDINFO_MONTHS_TENTATIVE\", \"PidTagScheduleInfoMonthsTentative\");\n        Properties.Add(\"PR_SCHDINFO_RESOURCE_TYPE\", \"PidTagScheduleInfoResourceType\");\n        Properties.Add(\"PR_SEARCH_KEY\", \"PidTagSearchKey\");\n        Properties.Add(\"PR_SEARCH\", \"PidTagSearch\");\n        Properties.Add(\"PR_SEARCH_ATTACHMENTS_W\", \"PidTagSearchAttachments\");\n        Properties.Add(\"PR_SEARCH_RECIP_EMAIL_BCC_W\", \"PidTagSearchRecipientEmailBcc\");\n        Properties.Add(\"PR_SEARCH_RECIP_EMAIL_CC_W\", \"PidTagSearchRecipientEmailCc\");\n        Properties.Add(\"PR_SEARCH_RECIP_EMAIL_TO_W\", \"PidTagSearchRecipientEmailTo\");\n        Properties.Add(\"PR_SELECTABLE\", \"PidTagSelectable\");\n        Properties.Add(\"PR_SEND_INTERNET_ENCODING\", \"PidTagSendInternetEncoding\");\n        Properties.Add(\"PR_SEND_RICH_INFO\", \"PidTagSendRichInfo\");\n        Properties.Add(\"PR_SENDER_ADDRTYPE_A\", \"PidTagSenderAddressType\");\n        Properties.Add(\"PR_SENDER_ADDRTYPE_W\", \"PidTagSenderAddressType\");\n        Properties.Add(\"PR_SENDER_ADDRTYPE\", \"PidTagSenderAddressType\");\n        Properties.Add(\"PR_SENDER_EMAIL_ADDRESS_A\", \"PidTagSenderEmailAddress\");\n        Properties.Add(\"PR_SENDER_EMAIL_ADDRESS_W\", \"PidTagSenderEmailAddress\");\n        Properties.Add(\"PR_SENDER_EMAIL_ADDRESS\", \"PidTagSenderEmailAddress\");\n        Properties.Add(\"PR_SENDER_ENTRYID\", \"PidTagSenderEntryId\");\n        Properties.Add(\"PR_SENDER_NAME_A\", \"PidTagSenderName\");\n        Properties.Add(\"PR_SENDER_NAME_W\", \"PidTagSenderName\");\n        Properties.Add(\"PR_SENDER_NAME\", \"PidTagSenderName\");\n        Properties.Add(\"PR_SENDER_SEARCH_KEY\", \"PidTagSenderSearchKey\");\n        Properties.Add(\"PR_SENDER_SMTP_ADDRESS_A\", \"PidTagSenderSmtpAddress\");\n        Properties.Add(\"PR_SENDER_SMTP_ADDRESS_W\", \"PidTagSenderSmtpAddress\");\n        Properties.Add(\"PR_SENDER_SMTP_ADDRESS\", \"PidTagSenderSmtpAddress\");\n        Properties.Add(\"PR_SENSITIVITY\", \"PidTagSensitivity\");\n        Properties.Add(\"PR_SENT_REPRESENTING_ADDRTYPE_A\", \"PidTagSentRepresentingAddressType\");\n        Properties.Add(\"PR_SENT_REPRESENTING_ADDRTYPE_W\", \"PidTagSentRepresentingAddressType\");\n        Properties.Add(\"PR_SENT_REPRESENTING_ADDRTYPE\", \"PidTagSentRepresentingAddressType\");\n        Properties.Add(\"PR_SENT_REPRESENTING_EMAIL_ADDRESS_A\", \"PidTagSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_SENT_REPRESENTING_EMAIL_ADDRESS_W\", \"PidTagSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_SENT_REPRESENTING_EMAIL_ADDRESS\", \"PidTagSentRepresentingEmailAddress\");\n        Properties.Add(\"PR_SENT_REPRESENTING_ENTRYID\", \"PidTagSentRepresentingEntryId\");\n        Properties.Add(\"PR_SENT_REPRESENTING_NAME_A\", \"PidTagSentRepresentingName\");\n        Properties.Add(\"PR_SENT_REPRESENTING_NAME_W\", \"PidTagSentRepresentingName\");\n        Properties.Add(\"PR_SENT_REPRESENTING_NAME\", \"PidTagSentRepresentingName\");\n        Properties.Add(\"PR_SENT_REPRESENTING_SEARCH_KEY\", \"PidTagSentRepresentingSearchKey\");\n        Properties.Add(\"PR_SENT_REPRESENTING_SMTP_ADDRESS_A\", \"PidTagSentRepresentingSmtpAddress\");\n        Properties.Add(\"PR_SENT_REPRESENTING_SMTP_ADDRESS_W\", \"PidTagSentRepresentingSmtpAddress\");\n        Properties.Add(\"PR_SENT_REPRESENTING_SMTP_ADDRESS\", \"PidTagSentRepresentingSmtpAddress\");\n        Properties.Add(\"PR_SENTMAIL_ENTRYID\", \"PidTagSentMailEntryId\");\n        Properties.Add(\"PR_SERVICE_DELETE_FILES_A\", \"PidTagServiceDeleteFiles\");\n        Properties.Add(\"PR_SERVICE_DELETE_FILES_W\", \"PidTagServiceDeleteFiles\");\n        Properties.Add(\"PR_SERVICE_DELETE_FILES\", \"PidTagServiceDeleteFiles\");\n        Properties.Add(\"PR_SERVICE_DLL_NAME_A\", \"PidTagServiceDllName\");\n        Properties.Add(\"PR_SERVICE_DLL_NAME_W\", \"PidTagServiceDllName\");\n        Properties.Add(\"PR_SERVICE_DLL_NAME\", \"PidTagServiceDllName\");\n        Properties.Add(\"PR_SERVICE_ENTRY_NAME\", \"PidTagServiceEntryName\");\n        Properties.Add(\"PR_SERVICE_EXTRA_UIDS\", \"PidTagServiceExtraUids\");\n        Properties.Add(\"PR_SERVICE_INSTALL_ID_A\", \"PidTagServiceInstallId\");\n        Properties.Add(\"PR_SERVICE_INSTALL_ID_W\", \"PidTagServiceInstallId\");\n        Properties.Add(\"PR_SERVICE_INSTALL_ID\", \"PidTagServiceInstallId\");\n        Properties.Add(\"PR_SERVICE_NAME_A\", \"PidTagServiceName\");\n        Properties.Add(\"PR_SERVICE_NAME_W\", \"PidTagServiceName\");\n        Properties.Add(\"PR_SERVICE_NAME\", \"PidTagServiceName\");\n        Properties.Add(\"PR_SERVICE_SUPPORT_FILES_A\", \"PidTagServiceSupportFiles\");\n        Properties.Add(\"PR_SERVICE_SUPPORT_FILES_W\", \"PidTagServiceSupportFiles\");\n        Properties.Add(\"PR_SERVICE_SUPPORT_FILES\", \"PidTagServiceSupportFiles\");\n        Properties.Add(\"PR_SERVICE_UID\", \"PidTagServiceUid\");\n        Properties.Add(\"PR_SERVICES\", \"PidTagServices\");\n        Properties.Add(\"PR_SMTP_ADDRESS_A\", \"PidTagSmtpAddress\");\n        Properties.Add(\"PR_SMTP_ADDRESS_W\", \"PidTagSmtpAddress\");\n        Properties.Add(\"PR_SMTP_ADDRESS\", \"PidTagSmtpAddress\");\n        Properties.Add(\"PR_SPOOLER_STATUS\", \"PidTagSpoolerStatus\");\n        Properties.Add(\"PR_SPOUSE_NAME_A\", \"PidTagSpouseName\");\n        Properties.Add(\"PR_SPOUSE_NAME_W\", \"PidTagSpouseName\");\n        Properties.Add(\"PR_SPOUSE_NAME\", \"PidTagSpouseName\");\n        Properties.Add(\"PR_START_DATE\", \"PidTagStartDate\");\n        Properties.Add(\"PR_STATE_OR_PROVINCE_A\", \"PidTagStateOrProvince\");\n        Properties.Add(\"PR_STATE_OR_PROVINCE_W\", \"PidTagStateOrProvince\");\n        Properties.Add(\"PR_STATE_OR_PROVINCE\", \"PidTagStateOrProvince\");\n        Properties.Add(\"PR_STATUS_CODE\", \"PidTagStatusCode\");\n        Properties.Add(\"PR_STATUS_STRING_A\", \"PidTagStatusString\");\n        Properties.Add(\"PR_STATUS_STRING_W\", \"PidTagStatusString\");\n        Properties.Add(\"PR_STATUS_STRING\", \"PidTagStatusString\");\n        Properties.Add(\"PR_STATUS\", \"PidTagStatus\");\n        Properties.Add(\"PR_STORE_ENTRYID\", \"PidTagStoreEntryId\");\n        Properties.Add(\"PR_STORE_ENTRYID_EMSMDB_V1\", \"PidTagStoreEntryIdEmsmdbV1\");\n        Properties.Add(\"PR_STORE_PROVIDERS\", \"PidTagStoreProviders\");\n        Properties.Add(\"PR_STORE_RECORD_KEY\", \"PidTagStoreRecordKey\");\n        Properties.Add(\"PR_STORE_STATE\", \"PidTagStoreState\");\n        Properties.Add(\"PR_STORE_SUPPORT_MASK\", \"PidTagStoreSupportMask\");\n        Properties.Add(\"PR_STORE_UNICODE_MASK\", \"PidTagStoreUnicodeMask\");\n        Properties.Add(\"PR_STREET_ADDRESS_A\", \"PidTagStreetAddress\");\n        Properties.Add(\"PR_STREET_ADDRESS_W\", \"PidTagStreetAddress\");\n        Properties.Add(\"PR_STREET_ADDRESS\", \"PidTagStreetAddress\");\n        Properties.Add(\"PR_SUBFOLDERS\", \"PidTagSubfolders\");\n        Properties.Add(\"PR_SUBJECT_A\", \"PidTagSubject\");\n        Properties.Add(\"PR_SUBJECT_IPM\", \"PidTagSubjectMessageId\");\n        Properties.Add(\"PR_SUBJECT_PREFIX_A\", \"PidTagSubjectPrefix\");\n        Properties.Add(\"PR_SUBJECT_PREFIX_W\", \"PidTagSubjectPrefix\");\n        Properties.Add(\"PR_SUBJECT_PREFIX\", \"PidTagSubjectPrefix\");\n        Properties.Add(\"PR_SUBJECT_W\", \"PidTagSubject\");\n        Properties.Add(\"PR_SUBJECT\", \"PidTagSubject\");\n        Properties.Add(\"PR_SUBMIT_FLAGS\", \"PidTagSubmitFlags\");\n        Properties.Add(\"PR_SUPPLEMENTARY_INFO_A\", \"PidTagSupplementaryInfo\");\n        Properties.Add(\"PR_SUPPLEMENTARY_INFO_W\", \"PidTagSupplementaryInfo\");\n        Properties.Add(\"PR_SUPPLEMENTARY_INFO\", \"PidTagSupplementaryInfo\");\n        Properties.Add(\"PR_SURNAME_A\", \"PidTagSurname\");\n        Properties.Add(\"PR_SURNAME_W\", \"PidTagSurname\");\n        Properties.Add(\"PR_SURNAME\", \"PidTagSurname\");\n        Properties.Add(\"PR_SWAPPED_TODO_DATA\", \"PidTagSwappedToDoData\");\n        Properties.Add(\"PR_SWAPPED_TODO_STORE\", \"PidTagSwappedToDoStore\");\n        Properties.Add(\"PR_TELEX_NUMBER_A\", \"PidTagTelexNumber\");\n        Properties.Add(\"PR_TELEX_NUMBER_W\", \"PidTagTelexNumber\");\n        Properties.Add(\"PR_TELEX_NUMBER\", \"PidTagTelexNumber\");\n        Properties.Add(\"PR_TEMPLATEID\", \"PidTagTemplateid\");\n        Properties.Add(\"PR_TITLE_A\", \"PidTagTitle\");\n        Properties.Add(\"PR_TITLE_W\", \"PidTagTitle\");\n        Properties.Add(\"PR_TITLE\", \"PidTagTitle\");\n        Properties.Add(\"PR_TNEF_CORRELATION_KEY\", \"PidTagTnefCorrelationKey\");\n        Properties.Add(\"PR_TNEF_UNPROCESSED_PROPS\", \"PidTagTnefUnprocessedProps\");\n        Properties.Add(\"PR_TODO_ITEM_FLAGS\", \"PidTagToDoItemFlags\");\n        Properties.Add(\"PR_TRANSMITABLE_DISPLAY_NAME_A\", \"PidTagTransmittableDisplayName\");\n        Properties.Add(\"PR_TRANSMITABLE_DISPLAY_NAME_W\", \"PidTagTransmittableDisplayName\");\n        Properties.Add(\"PR_TRANSMITABLE_DISPLAY_NAME\", \"PidTagTransmittableDisplayName\");\n        Properties.Add(\"PR_TRANSPORT_KEY\", \"PidTagTransportKey\");\n        Properties.Add(\"PR_TRANSPORT_MESSAGE_HEADERS_A\", \"PidTagTransportMessageHeaders\");\n        Properties.Add(\"PR_TRANSPORT_MESSAGE_HEADERS_W\", \"PidTagTransportMessageHeaders\");\n        Properties.Add(\"PR_TRANSPORT_MESSAGE_HEADERS\", \"PidTagTransportMessageHeaders\");\n        Properties.Add(\"PR_TRANSPORT_PROVIDERS\", \"PidTagTransportProviders\");\n        Properties.Add(\"PR_TTYTDD_PHONE_NUMBER_A\", \"PidTagTelecommunicationsDeviceForDeafTelephoneNumber\");\n        Properties.Add(\"PR_TTYTDD_PHONE_NUMBER_W\", \"PidTagTelecommunicationsDeviceForDeafTelephoneNumber\");\n        Properties.Add(\"PR_TTYTDD_PHONE_NUMBER\", \"PidTagTtyTddPhoneNumber\");\n        Properties.Add(\"PR_TTYTDD_PHONE_NUMBER\", \"PidTagTelecommunicationsDeviceForDeafTelephoneNumber\");\n        Properties.Add(\"PR_TYPE_OF_MTS_USER\", \"PidTagTypeOfX400User\");\n        Properties.Add(\"PR_URL_COMP_NAME_A\", \"PidTagUrlComponentName\");\n        Properties.Add(\"PR_URL_COMP_NAME_W\", \"PidTagUrlComponentName\");\n        Properties.Add(\"PR_URL_COMP_NAME\", \"PidTagUrlComponentName\");\n        Properties.Add(\"PR_USER_CERTIFICATE\", \"PidTagUserCertificate\");\n        Properties.Add(\"PR_USER_X509_CERTIFICATE\", \"PidTagUserX509Certificate\");\n        Properties.Add(\"PR_VALID_FOLDER_MASK\", \"PidTagValidFolderMask\");\n        Properties.Add(\"PR_VD_NAME_W\", \"PidTagViewDescriptorName\");\n        Properties.Add(\"PR_VD_NAME\", \"PidTagViewDescriptorName\");\n        Properties.Add(\"PR_VD_VERSION\", \"PidTagViewDescriptorVersion\");\n        Properties.Add(\"PR_VIEWS_ENTRYID\", \"PidTagViewsEntryId\");\n        Properties.Add(\"PR_WB_SF_DEFINITION\", \"PidTagSearchFolderDefinition\");\n        Properties.Add(\"PR_WB_SF_EFP_FLAGS\", \"PidTagSearchFolderEfpFlags\");\n        Properties.Add(\"PR_WB_SF_EXPIRATION\", \"PidTagSearchFolderExpiration\");\n        Properties.Add(\"PR_WB_SF_ID\", \"PidTagSearchFolderId\");\n        Properties.Add(\"PR_WB_SF_LAST_USED\", \"PidTagSearchFolderLastUsed\");\n        Properties.Add(\"PR_WB_SF_STORAGE_TYPE\", \"PidTagSearchFolderStorageType\");\n        Properties.Add(\"PR_WB_SF_TAG\", \"PidTagSearchFolderTag\");\n        Properties.Add(\"PR_WB_SF_TEMPLATE_ID\", \"PidTagSearchFolderTemplateId\");\n        Properties.Add(\"PR_WEDDING_ANNIVERSARY\", \"PidTagWeddingAnniversary\");\n        Properties.Add(\"PR_WIZARD_NO_PAB_PAGE\", \"PidTagWizardNoPabPage\");\n        Properties.Add(\"PR_WIZARD_NO_PST_PAGE\", \"PidTagWizardNoPstPage\");\n        Properties.Add(\"PR_X400_CONTENT_TYPE\", \"PidTagX400ContentType\");\n        Properties.Add(\"PR_XPOS\", \"PidTagXCoordinate\");\n        Properties.Add(\"PR_YPOS\", \"PidTagYCoordinate\");\n    }\n    #endregion\n\n    #region PropertyNameToCanonical\n    /// <summary>\n    ///     Returns the canonical name of the give <paramref name=\"propertyName\" />. When the property does not\n    ///     exists then <c>null</c> is returned\n    /// </summary>\n    /// <param name=\"propertyName\"></param>\n    /// <returns></returns>\n    internal static string PropertyNameToCanonical(string propertyName)\n    {\n        return Properties.ContainsKey(propertyName)\n            ? Properties[propertyName]\n            : null;\n    }\n    #endregion\n\n    #region CanonicalToPropertyName\n    /// <summary>\n    ///     Returns the property name of the give <paramref name=\"canonicalName\" />. When the property does not\n    ///     exists then <c>null</c> is returned\n    /// </summary>\n    /// <remarks>\n    ///     When more then one property is found then the UNICODE property is returned instead\n    ///     of it's Non-UNICODE counter parts\n    /// </remarks>\n    /// <param name=\"canonicalName\">The canonical name of the <see cref=\"PropertyTags\"/></param>\n    /// <returns></returns>\n    internal static string CanonicalToPropertyName(string canonicalName)\n    {\n        var matches = Properties.Where(m => m.Value.StartsWith(canonicalName)).Select(m => m.Key);\n        var enumerable = matches as string[] ?? matches.ToArray();\n        return enumerable.Count() == 1 ? enumerable.First() : enumerable.First(m => m.EndsWith(\"_W\"));\n    }\n    #endregion\n}"
  },
  {
    "path": "MsgKit/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"BouncyCastle.Crypto\" publicKeyToken=\"0e99375e54769942\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.8.4.0\" newVersion=\"1.8.4.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "MsgKit/packages.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<packages>\n  <package id=\"BouncyCastle\" version=\"1.8.9\" targetFramework=\"net46\" />\n  <package id=\"MimeKit\" version=\"2.0.7\" targetFramework=\"net46\" />\n  <package id=\"OpenMcdf\" version=\"2.2.1.3\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "MsgKit.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.16\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MsgKitTestTool\", \"MsgKitTestTool\\MsgKitTestTool.csproj\", \"{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"MsgKit\", \"MsgKit\\MsgKit.csproj\", \"{696489E4-C272-47D8-B617-95AEF59F1EB7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{696489E4-C272-47D8-B617-95AEF59F1EB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{696489E4-C272-47D8-B617-95AEF59F1EB7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{696489E4-C272-47D8-B617-95AEF59F1EB7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{696489E4-C272-47D8-B617-95AEF59F1EB7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {18EB2BBF-0FE6-4B07-8CEB-40C4862C00FD}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "MsgKit.sln.DotSettings",
    "content": "﻿<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\">\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MK/@EntryIndexedValue\">MK</s:String>\n\t<s:String x:Key=\"/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MW/@EntryIndexedValue\">MW</s:String>\n\t<s:Boolean x:Key=\"/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=counter_0020proposal/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=basefont/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=bgcolor/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=bgsound/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=blockquote/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=CLSID/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=colortbl/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=deff/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=deftab/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=dispid/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=displayname/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=DOCTYPE/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Encapsulator/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=exchg/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=FFFFFFFF/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=guids/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Hspace/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=htmltag/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=inkerbell/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=IPNNRN/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=IPNRN/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=isindex/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=mapi/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=MHTML/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=MHTMLTAG/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=MSOXPROPS/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=MULTIPARTSIGNED/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=nameid/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Neverland/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=nextid/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=nobr/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=noembed/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=noframes/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=noscript/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=nsicpg/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Octel/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=onttbl/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=OXCDATA/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=OXMSG/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=OXRTFCP/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=pard/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=peterpan/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=propertiesstream/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=RAWTEXT/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=RCDATA/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=romhtml/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=samp/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Semple/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=SMIME/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=SRESTRICT/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Stedfast/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=storages/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=substg/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=SVREID/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=tfoot/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Tokenizes/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Tokenizing/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Valign/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Vlink/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Voicenotes/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Vspace/@EntryIndexedValue\">True</s:Boolean>\n\t<s:Boolean x:Key=\"/Default/UserDictionary/Words/=Yomi/@EntryIndexedValue\">True</s:Boolean></wpf:ResourceDictionary>"
  },
  {
    "path": "MsgKitTestTool/EmailForm.Designer.cs",
    "content": "﻿namespace MsgKitTestTool\n{\n    partial class MainForm\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            this.EmailButton = new System.Windows.Forms.Button();\n            this.label1 = new System.Windows.Forms.Label();\n            this.label2 = new System.Windows.Forms.Label();\n            this.label3 = new System.Windows.Forms.Label();\n            this.label4 = new System.Windows.Forms.Label();\n            this.label5 = new System.Windows.Forms.Label();\n            this.TextBodyTextBox = new System.Windows.Forms.TextBox();\n            this.label6 = new System.Windows.Forms.Label();\n            this.label7 = new System.Windows.Forms.Label();\n            this.HtmlBodyTextBox = new System.Windows.Forms.TextBox();\n            this.label8 = new System.Windows.Forms.Label();\n            this.label9 = new System.Windows.Forms.Label();\n            this.label10 = new System.Windows.Forms.Label();\n            this.button1 = new System.Windows.Forms.Button();\n            this.ReadMsgFileButton = new System.Windows.Forms.Button();\n            this.ReadReceiptCheckBox = new System.Windows.Forms.CheckBox();\n            this.DraftMessageCheckBox = new System.Windows.Forms.CheckBox();\n            this.ImportanceComboBox = new System.Windows.Forms.ComboBox();\n            this.SenderTextBox = new System.Windows.Forms.TextBox();\n            this.SubjectTextBox = new System.Windows.Forms.TextBox();\n            this.SentOnDatePicker = new System.Windows.Forms.DateTimePicker();\n            this.BccTextBox = new System.Windows.Forms.TextBox();\n            this.CcTextBox = new System.Windows.Forms.TextBox();\n            this.ToTextBox = new System.Windows.Forms.TextBox();\n            this.FromTextBox = new System.Windows.Forms.TextBox();\n            this.ContactButton = new System.Windows.Forms.Button();\n            this.button2 = new System.Windows.Forms.Button();\n            this.SuspendLayout();\n            // \n            // EmailButton\n            // \n            this.EmailButton.Location = new System.Drawing.Point(446, 295);\n            this.EmailButton.Margin = new System.Windows.Forms.Padding(2);\n            this.EmailButton.Name = \"EmailButton\";\n            this.EmailButton.Size = new System.Drawing.Size(91, 33);\n            this.EmailButton.TabIndex = 10;\n            this.EmailButton.Text = \"E-mail\";\n            this.EmailButton.UseVisualStyleBackColor = true;\n            this.EmailButton.Click += new System.EventHandler(this.button1_Click);\n            // \n            // label1\n            // \n            this.label1.AutoSize = true;\n            this.label1.Location = new System.Drawing.Point(7, 36);\n            this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label1.Name = \"label1\";\n            this.label1.Size = new System.Drawing.Size(33, 13);\n            this.label1.TabIndex = 1;\n            this.label1.Text = \"From:\";\n            // \n            // label2\n            // \n            this.label2.AutoSize = true;\n            this.label2.Location = new System.Drawing.Point(7, 61);\n            this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label2.Name = \"label2\";\n            this.label2.Size = new System.Drawing.Size(23, 13);\n            this.label2.TabIndex = 2;\n            this.label2.Text = \"To:\";\n            // \n            // label3\n            // \n            this.label3.AutoSize = true;\n            this.label3.Location = new System.Drawing.Point(7, 84);\n            this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label3.Name = \"label3\";\n            this.label3.Size = new System.Drawing.Size(24, 13);\n            this.label3.TabIndex = 3;\n            this.label3.Text = \"CC:\";\n            // \n            // label4\n            // \n            this.label4.AutoSize = true;\n            this.label4.Location = new System.Drawing.Point(7, 109);\n            this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label4.Name = \"label4\";\n            this.label4.Size = new System.Drawing.Size(31, 13);\n            this.label4.TabIndex = 4;\n            this.label4.Text = \"BCC:\";\n            // \n            // label5\n            // \n            this.label5.AutoSize = true;\n            this.label5.Location = new System.Drawing.Point(7, 163);\n            this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label5.Name = \"label5\";\n            this.label5.Size = new System.Drawing.Size(47, 13);\n            this.label5.TabIndex = 10;\n            this.label5.Text = \"Sent on:\";\n            // \n            // TextBodyTextBox\n            // \n            this.TextBodyTextBox.Location = new System.Drawing.Point(278, 30);\n            this.TextBodyTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.TextBodyTextBox.Multiline = true;\n            this.TextBodyTextBox.Name = \"TextBodyTextBox\";\n            this.TextBodyTextBox.Size = new System.Drawing.Size(258, 116);\n            this.TextBodyTextBox.TabIndex = 8;\n            this.TextBodyTextBox.Text = \"Hello Neverland text\";\n            // \n            // label6\n            // \n            this.label6.AutoSize = true;\n            this.label6.Location = new System.Drawing.Point(276, 14);\n            this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label6.Name = \"label6\";\n            this.label6.Size = new System.Drawing.Size(57, 13);\n            this.label6.TabIndex = 12;\n            this.label6.Text = \"Text body:\";\n            // \n            // label7\n            // \n            this.label7.AutoSize = true;\n            this.label7.Location = new System.Drawing.Point(276, 155);\n            this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label7.Name = \"label7\";\n            this.label7.Size = new System.Drawing.Size(66, 13);\n            this.label7.TabIndex = 14;\n            this.label7.Text = \"HTML body:\";\n            // \n            // HtmlBodyTextBox\n            // \n            this.HtmlBodyTextBox.Location = new System.Drawing.Point(278, 171);\n            this.HtmlBodyTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.HtmlBodyTextBox.Multiline = true;\n            this.HtmlBodyTextBox.Name = \"HtmlBodyTextBox\";\n            this.HtmlBodyTextBox.Size = new System.Drawing.Size(258, 116);\n            this.HtmlBodyTextBox.TabIndex = 9;\n            this.HtmlBodyTextBox.Text = \"<html>\\r\\n   <head>\\r\\n      <title>Peter Pann</title>\\r\\n   </head>\\r\\n   <body>\\r\\n      \" +\n    \"<b>Hello Neverland html</b><br/>\\r\\n     <img src=\\\"cid:tinkerbell.jpg\\\">\\r\\n   </body\" +\n    \">\\r\\n</html>\";\n            // \n            // label8\n            // \n            this.label8.AutoSize = true;\n            this.label8.Location = new System.Drawing.Point(7, 135);\n            this.label8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label8.Name = \"label8\";\n            this.label8.Size = new System.Drawing.Size(46, 13);\n            this.label8.TabIndex = 15;\n            this.label8.Text = \"Subject:\";\n            // \n            // label9\n            // \n            this.label9.AutoSize = true;\n            this.label9.Location = new System.Drawing.Point(7, 12);\n            this.label9.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label9.Name = \"label9\";\n            this.label9.Size = new System.Drawing.Size(44, 13);\n            this.label9.TabIndex = 17;\n            this.label9.Text = \"Sender:\";\n            // \n            // label10\n            // \n            this.label10.AutoSize = true;\n            this.label10.Location = new System.Drawing.Point(4, 188);\n            this.label10.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);\n            this.label10.Name = \"label10\";\n            this.label10.Size = new System.Drawing.Size(63, 13);\n            this.label10.TabIndex = 18;\n            this.label10.Text = \"Importance:\";\n            // \n            // button1\n            // \n            this.button1.Location = new System.Drawing.Point(7, 295);\n            this.button1.Margin = new System.Windows.Forms.Padding(2);\n            this.button1.Name = \"button1\";\n            this.button1.Size = new System.Drawing.Size(91, 33);\n            this.button1.TabIndex = 20;\n            this.button1.Text = \"EML -> MSG\";\n            this.button1.UseVisualStyleBackColor = true;\n            this.button1.Click += new System.EventHandler(this.Eml2MsgButton_Click);\n            // \n            // ReadMsgFileButton\n            // \n            this.ReadMsgFileButton.Location = new System.Drawing.Point(102, 295);\n            this.ReadMsgFileButton.Margin = new System.Windows.Forms.Padding(2);\n            this.ReadMsgFileButton.Name = \"ReadMsgFileButton\";\n            this.ReadMsgFileButton.Size = new System.Drawing.Size(91, 33);\n            this.ReadMsgFileButton.TabIndex = 21;\n            this.ReadMsgFileButton.Text = \"MSG -> EML\";\n            this.ReadMsgFileButton.UseVisualStyleBackColor = true;\n            this.ReadMsgFileButton.Visible = true;\n            this.ReadMsgFileButton.Click += new System.EventHandler(this.ReadMsgFileButton_Click);\n            // \n            // ReadReceiptCheckBox\n            // \n            this.ReadReceiptCheckBox.AutoSize = true;\n            this.ReadReceiptCheckBox.Checked = global::MsgKitTestTool.Properties.Settings.Default.ReadReceiptCheckBox;\n            this.ReadReceiptCheckBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Checked\", global::MsgKitTestTool.Properties.Settings.Default, \"ReadReceiptCheckBox\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.ReadReceiptCheckBox.Location = new System.Drawing.Point(70, 237);\n            this.ReadReceiptCheckBox.Margin = new System.Windows.Forms.Padding(2);\n            this.ReadReceiptCheckBox.Name = \"ReadReceiptCheckBox\";\n            this.ReadReceiptCheckBox.Size = new System.Drawing.Size(87, 17);\n            this.ReadReceiptCheckBox.TabIndex = 23;\n            this.ReadReceiptCheckBox.Text = \"Read receipt\";\n            this.ReadReceiptCheckBox.UseVisualStyleBackColor = true;\n            // \n            // DraftMessageCheckBox\n            // \n            this.DraftMessageCheckBox.AutoSize = true;\n            this.DraftMessageCheckBox.Checked = global::MsgKitTestTool.Properties.Settings.Default.DraftMessageCheckBox;\n            this.DraftMessageCheckBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Checked\", global::MsgKitTestTool.Properties.Settings.Default, \"DraftMessageCheckBox\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.DraftMessageCheckBox.Location = new System.Drawing.Point(70, 216);\n            this.DraftMessageCheckBox.Margin = new System.Windows.Forms.Padding(2);\n            this.DraftMessageCheckBox.Name = \"DraftMessageCheckBox\";\n            this.DraftMessageCheckBox.Size = new System.Drawing.Size(94, 17);\n            this.DraftMessageCheckBox.TabIndex = 22;\n            this.DraftMessageCheckBox.Text = \"Draft message\";\n            this.DraftMessageCheckBox.UseVisualStyleBackColor = true;\n            // \n            // ImportanceComboBox\n            // \n            this.ImportanceComboBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"Importance\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.ImportanceComboBox.FormattingEnabled = true;\n            this.ImportanceComboBox.Items.AddRange(new object[] {\n            \"Low\",\n            \"Normal\",\n            \"High\"});\n            this.ImportanceComboBox.Location = new System.Drawing.Point(70, 187);\n            this.ImportanceComboBox.Margin = new System.Windows.Forms.Padding(2);\n            this.ImportanceComboBox.Name = \"ImportanceComboBox\";\n            this.ImportanceComboBox.Size = new System.Drawing.Size(62, 21);\n            this.ImportanceComboBox.TabIndex = 19;\n            this.ImportanceComboBox.Text = global::MsgKitTestTool.Properties.Settings.Default.Importance;\n            // \n            // SenderTextBox\n            // \n            this.SenderTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"Sender\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.SenderTextBox.Location = new System.Drawing.Point(70, 11);\n            this.SenderTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.SenderTextBox.Name = \"SenderTextBox\";\n            this.SenderTextBox.Size = new System.Drawing.Size(192, 20);\n            this.SenderTextBox.TabIndex = 1;\n            this.SenderTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.Sender;\n            // \n            // SubjectTextBox\n            // \n            this.SubjectTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"Subject\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.SubjectTextBox.Location = new System.Drawing.Point(70, 133);\n            this.SubjectTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.SubjectTextBox.Name = \"SubjectTextBox\";\n            this.SubjectTextBox.Size = new System.Drawing.Size(192, 20);\n            this.SubjectTextBox.TabIndex = 6;\n            this.SubjectTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.Subject;\n            // \n            // SentOnDatePicker\n            // \n            this.SentOnDatePicker.Checked = false;\n            this.SentOnDatePicker.CustomFormat = \"yyyy-MM-dd HH:mm:ss\";\n            this.SentOnDatePicker.DataBindings.Add(new System.Windows.Forms.Binding(\"Value\", global::MsgKitTestTool.Properties.Settings.Default, \"SentOn\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.SentOnDatePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;\n            this.SentOnDatePicker.Location = new System.Drawing.Point(70, 161);\n            this.SentOnDatePicker.Margin = new System.Windows.Forms.Padding(2);\n            this.SentOnDatePicker.Name = \"SentOnDatePicker\";\n            this.SentOnDatePicker.Size = new System.Drawing.Size(192, 20);\n            this.SentOnDatePicker.TabIndex = 7;\n            this.SentOnDatePicker.Value = global::MsgKitTestTool.Properties.Settings.Default.SentOn;\n            // \n            // BccTextBox\n            // \n            this.BccTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"Bcc\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.BccTextBox.Location = new System.Drawing.Point(70, 108);\n            this.BccTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.BccTextBox.Name = \"BccTextBox\";\n            this.BccTextBox.Size = new System.Drawing.Size(192, 20);\n            this.BccTextBox.TabIndex = 5;\n            this.BccTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.Bcc;\n            // \n            // CcTextBox\n            // \n            this.CcTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"Cc\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.CcTextBox.Location = new System.Drawing.Point(70, 83);\n            this.CcTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.CcTextBox.Name = \"CcTextBox\";\n            this.CcTextBox.Size = new System.Drawing.Size(192, 20);\n            this.CcTextBox.TabIndex = 4;\n            this.CcTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.Cc;\n            // \n            // ToTextBox\n            // \n            this.ToTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"To\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.ToTextBox.Location = new System.Drawing.Point(70, 59);\n            this.ToTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.ToTextBox.Name = \"ToTextBox\";\n            this.ToTextBox.Size = new System.Drawing.Size(192, 20);\n            this.ToTextBox.TabIndex = 3;\n            this.ToTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.To;\n            // \n            // FromTextBox\n            // \n            this.FromTextBox.DataBindings.Add(new System.Windows.Forms.Binding(\"Text\", global::MsgKitTestTool.Properties.Settings.Default, \"From\", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));\n            this.FromTextBox.Location = new System.Drawing.Point(70, 35);\n            this.FromTextBox.Margin = new System.Windows.Forms.Padding(2);\n            this.FromTextBox.Name = \"FromTextBox\";\n            this.FromTextBox.Size = new System.Drawing.Size(192, 20);\n            this.FromTextBox.TabIndex = 2;\n            this.FromTextBox.Text = global::MsgKitTestTool.Properties.Settings.Default.From;\n            // \n            // ContactButton\n            // \n            this.ContactButton.Location = new System.Drawing.Point(351, 295);\n            this.ContactButton.Margin = new System.Windows.Forms.Padding(2);\n            this.ContactButton.Name = \"ContactButton\";\n            this.ContactButton.Size = new System.Drawing.Size(91, 33);\n            this.ContactButton.TabIndex = 24;\n            this.ContactButton.Text = \"Contact\";\n            this.ContactButton.UseVisualStyleBackColor = true;\n            this.ContactButton.Click += new System.EventHandler(this.ContactButton_Click);\n            // \n            // button2\n            // \n            this.button2.Location = new System.Drawing.Point(197, 295);\n            this.button2.Margin = new System.Windows.Forms.Padding(2);\n            this.button2.Name = \"button2\";\n            this.button2.Size = new System.Drawing.Size(91, 33);\n            this.button2.TabIndex = 25;\n            this.button2.Text = \"Task\";\n            this.button2.UseVisualStyleBackColor = true;\n            this.button2.Click += new System.EventHandler(this.button2_Click);\n            // \n            // MainForm\n            // \n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(548, 341);\n            this.Controls.Add(this.button2);\n            this.Controls.Add(this.ContactButton);\n            this.Controls.Add(this.ReadReceiptCheckBox);\n            this.Controls.Add(this.DraftMessageCheckBox);\n            this.Controls.Add(this.ReadMsgFileButton);\n            this.Controls.Add(this.button1);\n            this.Controls.Add(this.ImportanceComboBox);\n            this.Controls.Add(this.label10);\n            this.Controls.Add(this.SenderTextBox);\n            this.Controls.Add(this.label9);\n            this.Controls.Add(this.SubjectTextBox);\n            this.Controls.Add(this.label8);\n            this.Controls.Add(this.label7);\n            this.Controls.Add(this.HtmlBodyTextBox);\n            this.Controls.Add(this.label6);\n            this.Controls.Add(this.TextBodyTextBox);\n            this.Controls.Add(this.label5);\n            this.Controls.Add(this.SentOnDatePicker);\n            this.Controls.Add(this.BccTextBox);\n            this.Controls.Add(this.CcTextBox);\n            this.Controls.Add(this.ToTextBox);\n            this.Controls.Add(this.FromTextBox);\n            this.Controls.Add(this.label4);\n            this.Controls.Add(this.label3);\n            this.Controls.Add(this.label2);\n            this.Controls.Add(this.label1);\n            this.Controls.Add(this.EmailButton);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.Margin = new System.Windows.Forms.Padding(2);\n            this.MaximizeBox = false;\n            this.Name = \"MainForm\";\n            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;\n            this.Text = \"MsgKit testtool\";\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.Button EmailButton;\n        private System.Windows.Forms.Label label1;\n        private System.Windows.Forms.Label label2;\n        private System.Windows.Forms.Label label3;\n        private System.Windows.Forms.Label label4;\n        private System.Windows.Forms.TextBox FromTextBox;\n        private System.Windows.Forms.TextBox ToTextBox;\n        private System.Windows.Forms.TextBox CcTextBox;\n        private System.Windows.Forms.TextBox BccTextBox;\n        private System.Windows.Forms.DateTimePicker SentOnDatePicker;\n        private System.Windows.Forms.Label label5;\n        private System.Windows.Forms.TextBox TextBodyTextBox;\n        private System.Windows.Forms.Label label6;\n        private System.Windows.Forms.Label label7;\n        private System.Windows.Forms.TextBox HtmlBodyTextBox;\n        private System.Windows.Forms.TextBox SubjectTextBox;\n        private System.Windows.Forms.Label label8;\n        private System.Windows.Forms.TextBox SenderTextBox;\n        private System.Windows.Forms.Label label9;\n        private System.Windows.Forms.Label label10;\n        private System.Windows.Forms.ComboBox ImportanceComboBox;\n        private System.Windows.Forms.Button button1;\n        private System.Windows.Forms.Button ReadMsgFileButton;\n        private System.Windows.Forms.CheckBox DraftMessageCheckBox;\n        private System.Windows.Forms.CheckBox ReadReceiptCheckBox;\n        private System.Windows.Forms.Button ContactButton;\n        private System.Windows.Forms.Button button2;\n    }\n}\n\n"
  },
  {
    "path": "MsgKitTestTool/EmailForm.cs",
    "content": "﻿//\n// MainForm\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Windows.Forms;\nusing MsgKit;\nusing MsgKit.Enums;\nusing MsgKitTestTool.Properties;\n\nnamespace MsgKitTestTool\n{\n    public partial class MainForm : Form\n    {\n        public MainForm()\n        {\n            InitializeComponent();\n        }\n\n        private void button1_Click(object sender, EventArgs e)\n        {\n            using (var email = new Email(\n                       new Sender(SenderTextBox.Text, string.Empty),\n                       SubjectTextBox.Text,\n                       DraftMessageCheckBox.Checked,\n                       ReadReceiptCheckBox.Checked))\n            {\n                email.Recipients.AddTo(ToTextBox.Text);\n                email.Recipients.AddCc(CcTextBox.Text);\n                email.Recipients.AddBcc(BccTextBox.Text);\n                email.Subject = SubjectTextBox.Text;\n                email.BodyText = TextBodyTextBox.Text;\n                email.BodyHtml = HtmlBodyTextBox.Text;\n                email.SentOn = SentOnDatePicker.Value.ToUniversalTime();\n                email.AddProperty(NamedPropertyTags.PidLidBilling, \"Test\");\n\n                switch (ImportanceComboBox.Text)\n                {\n                    case \"Low\":\n                        email.Importance = MessageImportance.IMPORTANCE_LOW;\n                        break;\n\n                    case \"High\":\n                        email.Importance = MessageImportance.IMPORTANCE_HIGH;\n                        break;\n\n                    default:\n                        email.Importance = MessageImportance.IMPORTANCE_NORMAL;\n                        break;\n                }\n\n                email.Attachments.Add(\"Images\\\\peterpan.jpg\");\n                email.Attachments.Add(\"Images\\\\tinkerbell.jpg\", -1, true, \"tinkerbell.jpg\");\n                email.Save(\"d:\\\\email.msg\");\n            }\n\n            System.Diagnostics.Process.Start(\"d:\\\\email.msg\");\n        }\n\n        private void Eml2MsgButton_Click(object sender, EventArgs e)\n        {\n            // Create an instance of the open file dialog box.\n            var openFileDialog1 = new OpenFileDialog\n            {\n                // ReSharper disable once LocalizableElement\n                Filter = \"E-mail|*.eml\",\n                FilterIndex = 1,\n                Multiselect = false\n            };\n\n            if (Directory.Exists(Settings.Default.InitialDirectory))\n                openFileDialog1.InitialDirectory = Settings.Default.InitialDirectory;\n\n            // Process input if the user clicked OK.\n            if (openFileDialog1.ShowDialog() == DialogResult.OK)\n            {\n                Settings.Default.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName);\n                var emlFileName = openFileDialog1.FileName;\n                var msgFileName = Path.ChangeExtension(emlFileName, \".msg\");\n                Converter.ConvertEmlToMsg(emlFileName, msgFileName);\n            }\n        }\n\n        private void ReadMsgFileButton_Click(object sender, EventArgs e)\n        {\n            var openFileDialog1 = new OpenFileDialog\n            {\n                // ReSharper disable once LocalizableElement\n                Filter = \"Outlook message|*.msg\",\n                FilterIndex = 1,\n                Multiselect = false\n            };\n\n            if (Directory.Exists(Settings.Default.InitialDirectory))\n                openFileDialog1.InitialDirectory = Settings.Default.InitialDirectory;\n\n            if (openFileDialog1.ShowDialog() == DialogResult.OK)\n            {\n                Settings.Default.InitialDirectory = Path.GetDirectoryName(openFileDialog1.FileName);\n                var msgFileName = openFileDialog1.FileName;\n                var emlFileName = Path.ChangeExtension(msgFileName, \".eml\");\n                Converter.ConvertMsgToEml(msgFileName, emlFileName);\n            }\n        }\n\n        private void ContactButton_Click(object sender, EventArgs e)\n        {\n            using (var contact = new Contact(\n                       new Sender(SenderTextBox.Text, string.Empty),\n                       SubjectTextBox.Text,\n                       DraftMessageCheckBox.Checked,\n                       ReadReceiptCheckBox.Checked))\n            {\n                contact.Recipients.AddTo(ToTextBox.Text);\n                contact.Recipients.AddCc(CcTextBox.Text);\n                contact.Recipients.AddBcc(BccTextBox.Text);\n                contact.Subject = SubjectTextBox.Text;\n                contact.BodyText = TextBodyTextBox.Text;\n                contact.BodyHtml = HtmlBodyTextBox.Text;\n                contact.SentOn = SentOnDatePicker.Value.ToUniversalTime();\n\n                switch (ImportanceComboBox.Text)\n                {\n                    case \"Low\":\n                        contact.Importance = MessageImportance.IMPORTANCE_LOW;\n                        break;\n\n                    case \"High\":\n                        contact.Importance = MessageImportance.IMPORTANCE_HIGH;\n                        break;\n\n                    default:\n                        contact.Importance = MessageImportance.IMPORTANCE_NORMAL;\n                        break;\n                }\n\n                contact.FileUnder = \"File under\";\n                contact.InstantMessagingAddress = \"Instant messaging address\";\n                contact.Private = false;\n                contact.BirthDay = DateTime.Now;\n                contact.WeddingAnniversary = DateTime.Now;\n                contact.Assistant = new ContactAssistant\n                    { Name = \"Assistant name\", TelephoneNumber = \"Assistant telephone number\" };\n                contact.CallBackTelePhoneNumber = \"callback telephone number\";\n                contact.CarTelePhoneNumber = \"car telephone number\";\n                contact.ChildrensNames = new List<string>\n                    { \"First child name\", \"Second child name\", \"Third child name\" };\n                contact.CompanyMain = new ContactCompanyMain\n                    { Name = \"Company main name\", TelephoneNumber = \"Company main telephone number\" };\n                contact.DepartmentName = \"Department name\";\n                contact.Generation = \"Generation\";\n                contact.GivenName = \"GivenName\";\n                contact.Initials = \"Initials\";\n                contact.ISDNNumber = \"ISDN number\";\n                contact.Language = \"Language\";\n                contact.Location = \"Location\";\n                contact.ManagerName = \"Manager name\";\n                contact.MiddleName = \"Middle name\";\n                contact.MobileTelephoneNumber = \"Mobile telephone number\";\n                contact.NickName = \"Nick name\";\n                contact.OfficeLocation = \"Office location\";\n                contact.PersonalHomePage = \"Personal home-page\";\n                contact.PostalAddress = \"Postal address\";\n                contact.PrimaryFaxNumber = \"Primary fax number\";\n                contact.PrimaryTelephoneNumber = \"Primary telephone number\";\n                contact.Profession = \"Profession\";\n                contact.RadioTelephoneNumber = \"Radio telephone number\";\n                contact.SpouseName = \"Spouse name\";\n                contact.SurName = \"Sur name\";\n                contact.TelexNumber = \"Telex number\";\n                contact.Title = \"Title\";\n                contact.TTYTDDPhoneNumber = \"TTYTDD phone number\";\n                contact.Email1 = new Address(\"email1@neverland.com\", \"email1\");\n                contact.Email2 = new Address(\"email2@neverland.com\", \"email2\");\n                contact.Email3 = new Address(\"email3@neverland.com\", \"email3\");\n                //contact.Fax1 = \"fax1@1234567890\";\n                //contact.Fax2 = \"fax2@1234567890\";\n                //contact.Fax3 = \"fax3@1234567890\";\n                contact.OfficeTelephoneNumber = \"Office telephone number\";\n                contact.InstantMessagingAddress = \"Instant messaging address\";\n                contact.Yomi = new ContactYomi\n                    { CompanyName = \"Yomi company name\", FirstName = \"Yomi first name\", LastName = \"Yomi last name\" };\n\n                contact.Work = new ContactWork\n                {\n                    TelephoneNumber = \"Contact telephone number\",\n                    City = \"Contact city\",\n                    Country = \"Contact country\",\n                    CountryCode = \"Contact country code\",\n                    PostOfficeBox = \"Contact post office box\",\n                    PostalCode = \"Contact postal code\",\n                    Street = \"Contact street\",\n                    Address = \"Contact\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n                };\n\n                contact.Business = new ContactBusiness\n                {\n                    TelephoneNumber = \"Business telephone number\",\n                    FaxNumber = \"Business fax number\",\n                    HomePage = \"Business home-page\",\n                    City = \"Business city\",\n                    Country = \"Business country\",\n                    PostalCode = \"Business postal code\",\n                    State = \"Business state\",\n                    Street = \"Business street\",\n                    Address = \"Business\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n                };\n\n                contact.Home = new ContactHome\n                {\n                    TelephoneNumber = \"Home telephone number\",\n                    TelephoneNumber2 = \"Home telephone number 2\",\n                    FaxNumber = \"Home faxnumber\",\n                    City = \"Home city\",\n                    Country = \"Home country\",\n                    PostalCode = \"Home postal code\",\n                    State = \"Home state\",\n                    Street = \"Home street\",\n                    Address = \"Home\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n                };\n\n                contact.Other = new ContactOther\n                {\n                    TelephoneNumber = \"Other telephone number\",\n                    City = \"Other city\",\n                    Country = \"Other country\",\n                    PostalCode = \"Other postal code\",\n                    State = \"Other state\",\n                    Street = \"Other street\",\n                    Address = \"Other\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n                };\n\n                contact.PagerTelephoneNumber = \"Pager telephone number\";\n                contact.PostalAddressId = PostalAddressId.HOME_ADDRESS;\n\n                contact.ContactPicture = File.ReadAllBytes(\"Images\\\\tinkerbell.jpg\");\n                contact.IconIndex = MessageIconIndex.UnsentMail;\n                contact.Save(\"d:\\\\contact.msg\");\n            }\n\n            System.Diagnostics.Process.Start(\"d:\\\\contact.msg\");\n        }\n\n        private void button2_Click(object sender, EventArgs e)\n        {\n            using (var task = new MsgKit.Task(\n                       new MsgKit.Sender(\"peterpan@neverland.com\", \"Peter Pan\"),\n                       new MsgKit.Representing(\"tinkerbell@neverland.com\", \"Tinkerbell\"),\n                       \"Hello Neverland subject\"))\n            {\n                task.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n                task.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n                task.Subject = \"This is the subject\";\n                task.Status = MsgKit.Enums.TaskStatus.NotStarted;\n                task.Complete = false;\n                task.PercentageComplete = 0.0;\n                task.DueDate = DateTime.Now.Date.AddDays(1).Date;\n                task.StartDate = DateTime.Now.Date;\n                task.Mode = MsgKit.Enums.TaskMode.Accepted;\n                task.Recurring = false;\n                task.ReminderTime = DateTime.Now.Date;\n                task.BodyRtf = @\"{\\rtf1\\ansi\\deff0{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\" +\n                                      @\"This line is the default color\\line\\cf2This line is red\\line\\cf1\" +\n                                      @\"This line is the default color}\";\n                task.BodyRtfCompressed = true;\n                task.BodyText = \"Hello Neverland text\";\n                task.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\";\n                task.SentOn = DateTime.UtcNow;\n                task.Importance = MsgKit.Enums.MessageImportance.IMPORTANCE_NORMAL;\n                task.IconIndex = MsgKit.Enums.MessageIconIndex.UnsentMail;\n                task.Attachments.Add(\"Images\\\\peterpan.jpg\");\n                task.Attachments.Add(\"Images\\\\tinkerbell.jpg\", -1, true, \"tinkerbell.jpg\");\n                task.Save(@\"d:\\Task.msg\");\n\n                // Show the appointment\n                System.Diagnostics.Process.Start(@\"d:\\Task.msg\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "MsgKitTestTool/EmailForm.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "MsgKitTestTool/MsgKitTestTool.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B8D26FD7-EF9C-40C2-891B-C6AB51A7A6DA}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MsgKitTestTool</RootNamespace>\n    <AssemblyName>MsgKitTestTool</AssemblyName>\n    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\BouncyCastle.Cryptography.2.6.2\\lib\\net461\\BouncyCastle.Cryptography.dll</HintPath>\n    </Reference>\n    <Reference Include=\"IndexRange, Version=1.1.1.0, Culture=neutral, PublicKeyToken=35e6a3c4212514c6, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\IndexRange.1.1.1\\lib\\net47\\IndexRange.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bcl.HashCode, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bcl.HashCode.6.0.0\\lib\\net462\\Microsoft.Bcl.HashCode.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bcl.Memory, Version=10.0.0.7, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bcl.Memory.10.0.7\\lib\\net462\\Microsoft.Bcl.Memory.dll</HintPath>\n    </Reference>\n    <Reference Include=\"MimeKit, Version=4.16.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MimeKit.4.16.0\\lib\\net48\\MimeKit.dll</HintPath>\n    </Reference>\n    <Reference Include=\"OpenMcdf, Version=3.1.3.0, Culture=neutral, PublicKeyToken=fdbb1629d7c00800, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\OpenMcdf.3.1.3\\lib\\netstandard2.0\\OpenMcdf.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Buffers.4.6.1\\lib\\net462\\System.Buffers.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Memory.4.6.3\\lib\\net462\\System.Memory.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.6.1\\lib\\net462\\System.Numerics.Vectors.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.6.1.2\\lib\\net462\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Security\" />\n    <Reference Include=\"System.ValueTuple\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Deployment\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Tests.cs\" />\n    <Compile Include=\"EmailForm.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"EmailForm.Designer.cs\">\n      <DependentUpon>EmailForm.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"EmailForm.resx\">\n      <DependentUpon>EmailForm.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <None Include=\"app.config\" />\n    <None Include=\"packages.config\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Images\\peterpan.jpg\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Images\\tinkerbell.jpg\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\MsgKit\\MsgKit.csproj\">\n      <Project>{696489e4-c272-47d8-b617-95aef59f1eb7}</Project>\n      <Name>MsgKit</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n  <Import Project=\"..\\packages\\System.ValueTuple.4.6.2\\build\\net471\\System.ValueTuple.targets\" Condition=\"Exists('..\\packages\\System.ValueTuple.4.6.2\\build\\net471\\System.ValueTuple.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\System.ValueTuple.4.6.2\\build\\net471\\System.ValueTuple.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\System.ValueTuple.4.6.2\\build\\net471\\System.ValueTuple.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "MsgKitTestTool/Program.cs",
    "content": "﻿//\n// Program.cs\n//\n// Author: Kees van Spelde <sicos2002@hotmail.com>\n//\n// Copyright (c) 2013-2026 Kees van Spelde. (www.magic-sessions.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nusing System;\nusing System.Windows.Forms;\n\nnamespace MsgKitTestTool\n{\n    static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        static void Main()\n        {\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n            Application.Run(new MainForm());\n            //new AppointmentTest().Run();\n        }\n    }\n}"
  },
  {
    "path": "MsgKitTestTool/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"MsgKitTestTool\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Magic-Sessions.com - Kees van Spelde\")]\n[assembly: AssemblyProduct(\"MsgKitTestTool\")]\n[assembly: AssemblyCopyright(\"Copyright © 2015 - 2023\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"4389a0fe-653d-4f1b-8d26-4054cc57a775\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"2.4.0.0\")]\n[assembly: AssemblyFileVersion(\"2.4.0.0\")]"
  },
  {
    "path": "MsgKitTestTool/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace MsgKitTestTool.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"MsgKitTestTool.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "MsgKitTestTool/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "MsgKitTestTool/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace MsgKitTestTool.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"17.5.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"captainhook@neverland.com\")]\n        public string From {\n            get {\n                return ((string)(this[\"From\"]));\n            }\n            set {\n                this[\"From\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"crocodile@neverland.com\")]\n        public string To {\n            get {\n                return ((string)(this[\"To\"]));\n            }\n            set {\n                this[\"To\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"tinkerbel@neverland.com\")]\n        public string Cc {\n            get {\n                return ((string)(this[\"Cc\"]));\n            }\n            set {\n                this[\"Cc\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"wendy@neverland.com\")]\n        public string Bcc {\n            get {\n                return ((string)(this[\"Bcc\"]));\n            }\n            set {\n                this[\"Bcc\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"This is the subject\")]\n        public string Subject {\n            get {\n                return ((string)(this[\"Subject\"]));\n            }\n            set {\n                this[\"Subject\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"12/03/2016 19:08:54\")]\n        public global::System.DateTime SentOn {\n            get {\n                return ((global::System.DateTime)(this[\"SentOn\"]));\n            }\n            set {\n                this[\"SentOn\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"peterpan@neverland.com\")]\n        public string Sender {\n            get {\n                return ((string)(this[\"Sender\"]));\n            }\n            set {\n                this[\"Sender\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"Normal\")]\n        public string Importance {\n            get {\n                return ((string)(this[\"Importance\"]));\n            }\n            set {\n                this[\"Importance\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"C:\\\\\")]\n        public string InitialDirectory {\n            get {\n                return ((string)(this[\"InitialDirectory\"]));\n            }\n            set {\n                this[\"InitialDirectory\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"False\")]\n        public bool DraftMessageCheckBox {\n            get {\n                return ((bool)(this[\"DraftMessageCheckBox\"]));\n            }\n            set {\n                this[\"DraftMessageCheckBox\"] = value;\n            }\n        }\n        \n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"False\")]\n        public bool ReadReceiptCheckBox {\n            get {\n                return ((bool)(this[\"ReadReceiptCheckBox\"]));\n            }\n            set {\n                this[\"ReadReceiptCheckBox\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "MsgKitTestTool/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\" GeneratedClassNamespace=\"MsgKitTestTool.Properties\" GeneratedClassName=\"Settings\">\n  <Profiles />\n  <Settings>\n    <Setting Name=\"From\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">captainhook@neverland.com</Value>\n    </Setting>\n    <Setting Name=\"To\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">crocodile@neverland.com</Value>\n    </Setting>\n    <Setting Name=\"Cc\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">tinkerbel@neverland.com</Value>\n    </Setting>\n    <Setting Name=\"Bcc\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">wendy@neverland.com</Value>\n    </Setting>\n    <Setting Name=\"Subject\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">This is the subject</Value>\n    </Setting>\n    <Setting Name=\"SentOn\" Type=\"System.DateTime\" Scope=\"User\">\n      <Value Profile=\"(Default)\">12/03/2016 19:08:54</Value>\n    </Setting>\n    <Setting Name=\"Sender\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">peterpan@neverland.com</Value>\n    </Setting>\n    <Setting Name=\"Importance\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">Normal</Value>\n    </Setting>\n    <Setting Name=\"InitialDirectory\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">C:\\</Value>\n    </Setting>\n    <Setting Name=\"DraftMessageCheckBox\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">False</Value>\n    </Setting>\n    <Setting Name=\"ReadReceiptCheckBox\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">False</Value>\n    </Setting>\n  </Settings>\n</SettingsFile>"
  },
  {
    "path": "MsgKitTestTool/Tests.cs",
    "content": "﻿using System;\n\nnamespace MsgKitTestTool\n{\n    public class Tests\n    {\n        public void CreateAppointment()\n        {\n            using (var appointment = new MsgKit.Appointment(\n                       new MsgKit.Sender(\"peterpan@neverland.com\", \"Peter Pan\"),\n                       new MsgKit.Representing(\"tinkerbell@neverland.com\", \"Tinkerbell\"),\n                       \"Hello Neverland subject\"))\n            {\n                appointment.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n                appointment.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n                appointment.Subject = \"This is the subject\";\n                appointment.Location = \"Neverland\";\n                appointment.MeetingStart = DateTime.Now.Date;\n                appointment.MeetingEnd = DateTime.Now.Date.AddDays(1).Date;\n                appointment.AllDay = true;\n                appointment.BodyRtf = @\"{\\rtf1\\ansi\\deff0{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\" +\n                                      @\"This line is the default color\\line\\cf2This line is red\\line\\cf1\" +\n                                      @\"This line is the default color}\";\n                appointment.BodyRtfCompressed = true;\n                appointment.BodyText = \"Hello Neverland text\";\n                appointment.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\";\n                appointment.SentOn = DateTime.UtcNow;\n                appointment.Importance = MsgKit.Enums.MessageImportance.IMPORTANCE_NORMAL;\n                appointment.IconIndex = MsgKit.Enums.MessageIconIndex.UnsentMail;\n                appointment.Attachments.Add(\"Images\\\\peterpan.jpg\");\n                appointment.Attachments.Add(\"Images\\\\tinkerbell.jpg\", -1, true, \"tinkerbell.jpg\");\n                appointment.Save(@\"d:\\test.msg\");\n\n                // Show the appointment\n                System.Diagnostics.Process.Start(@\"d:\\Appointment.msg\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "MsgKitTestTool/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<configuration>\n    <configSections>\n        <sectionGroup name=\"userSettings\" type=\"System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n            <section name=\"MsgKitTestTool.Properties.Settings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n        </sectionGroup>\n    </configSections>\n    <userSettings>\n        <MsgKitTestTool.Properties.Settings>\n            <setting name=\"From\" serializeAs=\"String\">\n                <value>captainhook@neverland.com</value>\n            </setting>\n            <setting name=\"To\" serializeAs=\"String\">\n                <value>crocodile@neverland.com</value>\n            </setting>\n            <setting name=\"Cc\" serializeAs=\"String\">\n                <value>tinkerbel@neverland.com</value>\n            </setting>\n            <setting name=\"Bcc\" serializeAs=\"String\">\n                <value>wendy@neverland.com</value>\n            </setting>\n            <setting name=\"Subject\" serializeAs=\"String\">\n                <value>This is the subject</value>\n            </setting>\n            <setting name=\"SentOn\" serializeAs=\"String\">\n                <value>12/03/2016 19:08:54</value>\n            </setting>\n            <setting name=\"Sender\" serializeAs=\"String\">\n                <value>peterpan@neverland.com</value>\n            </setting>\n            <setting name=\"Importance\" serializeAs=\"String\">\n                <value>Normal</value>\n            </setting>\n            <setting name=\"InitialDirectory\" serializeAs=\"String\">\n                <value>C:\\</value>\n            </setting>\n            <setting name=\"DraftMessageCheckBox\" serializeAs=\"String\">\n                <value>False</value>\n            </setting>\n            <setting name=\"ReadReceiptCheckBox\" serializeAs=\"String\">\n                <value>False</value>\n            </setting>\n        </MsgKitTestTool.Properties.Settings>\n    </userSettings>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.8\" /></startup>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.3.0\" newVersion=\"6.0.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Buffers\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.5.0\" newVersion=\"4.0.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Bcl.Memory\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.7\" newVersion=\"10.0.0.7\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "MsgKitTestTool/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"BouncyCastle.Cryptography\" version=\"2.6.2\" targetFramework=\"net48\" />\n  <package id=\"IndexRange\" version=\"1.1.1\" targetFramework=\"net48\" />\n  <package id=\"Microsoft.Bcl.HashCode\" version=\"6.0.0\" targetFramework=\"net48\" />\n  <package id=\"Microsoft.Bcl.Memory\" version=\"10.0.7\" targetFramework=\"net48\" />\n  <package id=\"MimeKit\" version=\"4.16.0\" targetFramework=\"net48\" />\n  <package id=\"OpenMcdf\" version=\"3.1.3\" targetFramework=\"net48\" />\n  <package id=\"Portable.BouncyCastle\" version=\"1.9.0\" targetFramework=\"net48\" />\n  <package id=\"System.Buffers\" version=\"4.6.1\" targetFramework=\"net48\" />\n  <package id=\"System.Memory\" version=\"4.6.3\" targetFramework=\"net48\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.6.1\" targetFramework=\"net48\" />\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"6.1.2\" targetFramework=\"net48\" />\n  <package id=\"System.ValueTuple\" version=\"4.6.2\" targetFramework=\"net48\" />\n</packages>"
  },
  {
    "path": "README.md",
    "content": "## What is MsgKit?\n\nMsgKit is a 100% managed C# .NET 4.6.2, .NET Standard 2.0 and .NET Standard 2.1 assembly (no PINVOKE or whatsoever) which may be used for the creation of messages (E-Mail, Appointments, Journals and Stickey Notes) that are Outlook compatible\n\n## License Information\n\nMsgKit is Copyright (C) 2015-2025 Kees van Spelde (Magic-Sessions) and is licensed under the MIT license:\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n\n## Installing via NuGet\n\n[![NuGet](https://img.shields.io/nuget/v/MSGKit.svg?style=flat-square)](https://www.nuget.org/packages/MSGKit)\n\nThe easiest way to install MsgKit is via NuGet.\n\nIn Visual Studio's Package Manager Console, simply enter the following command:\n\n    Install-Package MsgKit \n\n### Creating an e-mail\n\n```csharp\nusing (var email = new Email(\n        new Sender(\"peterpan@neverland.com\", \"Peter Pan\"),\n        new Representing(\"tinkerbell@neverland.com\", \"Tinkerbell\"),\n        \"Hello Neverland subject\"))\n{\n    email.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n    email.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n    email.Subject = \"This is the subject\";\n    email.BodyText = \"Hello Neverland text\";\n    email.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\";\n    email.Importance = MessageImportance.IMPORTANCE_HIGH;\n    email.IconIndex = MessageIconIndex.ReadMail;\n    email.Attachments.Add(@\"d:\\crocodile.jpg\");\n    email.Save(@\"c:\\email.msg\");\n\n    // Show the E-mail\n    System.Diagnostics.Process.Start(@\"c:\\Email.msg\");\n}\n```\n\n### Creating an Appointment\n\n```csharp\nusing (var appointment = new Appointment(\n    new Sender(\"peterpan@neverland.com\", \"Peter Pan\"),\n    new Representing(\"tinkerbell@neverland.com\", \"Tinkerbell\"),\n    \"Hello Neverland subject\")) \n{\n    appointment.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n    appointment.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n    appointment.Subject = \"This is the subject\";\n    appointment.Location = \"Neverland\";\n    appointment.MeetingStart = DateTime.Now.Date;\n    appointment.MeetingEnd = DateTime.Now.Date.AddDays(1).Date;\n    appointment.AllDay = true;\n    appointment.BodyText = \"Hello Neverland text\";\n    appointment.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\";\n    appointment.SentOn = DateTime.UtcNow;\n    appointment.Importance = MessageImportance.IMPORTANCE_NORMAL;\n    appointment.IconIndex = MessageIconIndex.UnsentMail;\n    appointment.Attachments.Add(@\"d:\\crocodile.jpg\");\n    appointment.Save(@\"c:\\appointment.msg\");\n\n    // Show the Appointment\n    System.Diagnostics.Process.Start(@\"c:\\Appointment.msg\");\n}\n```\n\n### Creating a contact card\n\n```csharp\nusing (var contact = new Contact(\n    new Sender(SenderTextBox.Text, string.Empty),\n    SubjectTextBox.Text,\n    DraftMessageCheckBox.Checked,\n    ReadReceiptCheckBox.Checked))\n{\n    contact.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n    contact.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n    contact.Subject = \"This is the subject\";\n    contact.BodyText = \"Hello Neverland text\";\n    contact.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\"\n    contact.Importance = MessageImportance.IMPORTANCE_NORMAL;\n    contact.FileUnder = \"File under\";\n    contact.InstantMessagingAddress = \"Instant messaging address\";\n    contact.Private = false;\n    contact.BirthDay = DateTime.Now;\n    contact.WeddingAnniversary = DateTime.Now;\n    contact.Assistant = new ContactAssistant {Name = \"Assistant name\", TelephoneNumber = \"Assistant telephone number\"};\n    contact.CallBackTelePhoneNumber = \"callback telephone number\";\n    contact.CarTelePhoneNumber = \"car telephone number\";\n    contact.ChildrensNames = new List<string> {\"First child name\", \"Second child name\", \"Third child name\"};\n    contact.CompanyMain = new ContactCompanyMain { Name = \"Company main name\", TelephoneNumber = \"Company main telephone number\"};\n    contact.DepartmentName = \"Department name\";\n    contact.Generation = \"Generation\";\n    contact.GivenName = \"GivenName\";\n    contact.Initials = \"Initials\";\n    contact.ISDNNumber = \"ISDN number\";\n    contact.Language = \"Language\";\n    contact.Location = \"Location\";\n    contact.ManagerName = \"Manager name\";\n    contact.MiddleName = \"Middle name\";\n    contact.MobileTelephoneNumber = \"Mobile telephone number\";\n    contact.NickName = \"Nick name\";\n    contact.OfficeLocation = \"Office location\";\n    contact.PersonalHomePage = \"Personal home-page\";\n    contact.PostalAddress = \"Postal address\";\n    contact.PrimaryFaxNumber = \"Primary fax number\";\n    contact.PrimaryTelephoneNumber = \"Primary telephone number\";\n    contact.Profession = \"Profession\";\n    contact.RadioTelephoneNumber = \"Radio telephone number\";\n    contact.SpouseName = \"Spouse name\";\n    contact.SurName = \"Sur name\";\n    contact.TelexNumber = \"Telex number\";\n    contact.Title = \"Title\";\n    contact.TTYTDDPhoneNumber = \"TTYTDD phone number\";\n    contact.Email1 = new Address(\"email1@neverland.com\", \"email1\");\n    contact.Email2 = new Address(\"email2@neverland.com\", \"email2\");\n    contact.Email3 = new Address(\"email3@neverland.com\", \"email3\");\n    //contact.Fax1 = \"fax1@1234567890\";\n    //contact.Fax2 = \"fax2@1234567890\";\n    //contact.Fax3 = \"fax3@1234567890\";\n    contact.OfficeTelephoneNumber = \"Office telephone number\";\n    contact.InstantMessagingAddress = \"Instant messaging address\";\n    contact.Yomi = new ContactYomi { CompanyName = \"Yomi company name\", FirstName = \"Yomi first name\", LastName = \"Yomi last name\"};\n\n    contact.Work = new ContactWork\n    {\n        TelephoneNumber = \"Contact telephone number\",\n        City = \"Contact city\",\n        Country = \"Contact country\",\n        CountryCode = \"Contact country code\",\n        PostOfficeBox = \"Contact post office box\",\n        PostalCode = \"Contact postal code\",\n        Street = \"Contact street\",\n        Address = \"Contact\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n    };\n\n    contact.Business = new ContactBusiness\n    {\n        TelephoneNumber = \"Business telephone number\",\n        FaxNumber = \"Business fax number\",\n        HomePage = \"Business home-page\",\n        City = \"Business city\",\n        Country = \"Business country\",\n        PostalCode = \"Business postal code\",\n        State = \"Business state\",\n        Street = \"Business street\",\n        Address = \"Business\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n    };\n\n    contact.Home = new ContactHome\n    {\n        TelephoneNumber = \"Home telephone number\",\n        TelephoneNumber2 = \"Home telephone number 2\",\n        FaxNumber = \"Home faxnumber\",\n        City = \"Home city\",\n        Country = \"Home country\",\n        PostalCode = \"Home postal code\",\n        State = \"Home state\",\n        Street = \"Home street\",\n        Address = \"Home\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n    };\n\n    contact.Other = new ContactOther\n    {\n        TelephoneNumber = \"Other telephone number\",\n        City = \"Other city\",\n        Country = \"Other country\",\n        PostalCode = \"Other postal code\",\n        State = \"Other state\",\n        Street = \"Other street\",\n        Address = \"Other\\nBla bla\\nBla die bla\\nBLa die bla die bla\"\n    };\n\n    contact.PagerTelephoneNumber = \"Pager telephone number\";\n    contact.PostalAddressId = PostalAddressId.HOME_ADDRESS;\n\n    contact.ContactPicture = File.ReadAllBytes(\"Images\\\\tinkerbell.jpg\");\n    contact.IconIndex = MessageIconIndex.UnsentMail;\n    contact.Save(\"c:\\\\contact.msg\");\n    \n    System.Diagnostics.Process.Start(\"c:\\\\Contact.msg\");\n}\n```\n\n### Creating a task\n\n```csharp\nusing (var task = new MsgKit.Task(\n           new MsgKit.Sender(\"peterpan@neverland.com\", \"Peter Pan\"),\n           new MsgKit.Representing(\"tinkerbell@neverland.com\", \"Tinkerbell\"),\n           \"Hello Neverland subject\"))\n{\n    task.Recipients.AddTo(\"captainhook@neverland.com\", \"Captain Hook\");\n    task.Recipients.AddCc(\"crocodile@neverland.com\", \"The evil ticking crocodile\");\n    task.Subject = \"This is the subject\";\n    task.Status = MsgKit.Enums.TaskStatus.NotStarted;\n    task.Complete = false;\n    task.PercentageComplete = 0.0;\n    task.DueDate = DateTime.Now.Date.AddDays(1).Date;\n    task.StartDate = DateTime.Now.Date;\n    task.Mode = MsgKit.Enums.TaskMode.Accepted;\n    task.Recurring = false;\n    task.ReminderTime = DateTime.Now.Date;\n    task.BodyRtf = @\"{\\rtf1\\ansi\\deff0{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\" +\n                          @\"This line is the default color\\line\\cf2This line is red\\line\\cf1\" +\n                          @\"This line is the default color}\";\n    task.BodyRtfCompressed = true;\n    task.BodyText = \"Hello Neverland text\";\n    task.BodyHtml = \"<html><head></head><body><b>Hello Neverland html</b></body></html>\";\n    task.SentOn = DateTime.UtcNow;\n    task.Importance = MsgKit.Enums.MessageImportance.IMPORTANCE_NORMAL;\n    task.IconIndex = MsgKit.Enums.MessageIconIndex.UnsentMail;\n    task.Attachments.Add(\"Images\\\\peterpan.jpg\");\n    task.Attachments.Add(\"Images\\\\tinkerbell.jpg\", -1, true, \"tinkerbell.jpg\");\n    task.Save(@\"d:\\Task.msg\");\n\n    // Show the appointment\n    System.Diagnostics.Process.Start(@\"d:\\Task.msg\");\n}\n```\n\nCore Team\n=========\n    Sicos1977 (Kees van Spelde)\n    Seeker25 (Travis Semple) - Implemented Appointment support\n\nSupport\n=======\nIf you like my work then please consider a donation as a thank you by using the sponsor button on the top\n\n## Reporting Bugs\n\nHave a bug or a feature request? [Please open a new issue](https://github.com/Sicos1977/MsgKit/issues).\n\nBefore opening a new issue, please search for existing issues to avoid submitting duplicates.\n"
  }
]