public void Init()
        {
            Cache = new Dictionary <ulong, T>();
            lock (Cache)
            {
                EntriesById   = new Dictionary <ulong, Far3ProviderEntry <T> >();
                EntriesByName = new Dictionary <string, Far3ProviderEntry <T> >();

                if (FarFilePattern != null)
                {
                    List <string> FarFiles = new List <string>();
                    foreach (var File in ContentManager.AllFiles)
                    {
                        if (FarFilePattern.IsMatch(File))
                        {
                            FarFiles.Add(File);
                        }
                    }

                    m_FarFiles = FarFiles.ToArray();
                }

                foreach (var FarPath in m_FarFiles)
                {
                    var archive = new FAR3Archive(ContentManager.GetPath(FarPath));
                    var entries = archive.GetAllFAR3Entries();

                    foreach (var entry in entries)
                    {
                        var fileID = ((ulong)entry.FileID) << 32;

                        var referenceItem = new Far3ProviderEntry <T>(this)
                        {
                            ID       = fileID | entry.TypeID,
                            Archive  = archive,
                            FarEntry = entry
                        };

                        EntriesById.Add(referenceItem.ID, referenceItem);
                        if (entry.Filename != null)
                        {
                            EntriesByName.Add(entry.Filename.ToLower(), referenceItem);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Gets an archive based on a Far3ProviderEntry.
        /// </summary>
        /// <param name="Entry">The Far3ProviderEntry of the archive.</param>
        /// <returns>A FAR3 archive.</returns>
        public T Get(Far3ProviderEntry <T> Entry)
        {
            lock (Cache)
            {
                if (this.Cache.ContainsKey(Entry.ID))
                {
                    return(this.Cache[Entry.ID]);
                }

                byte[] data = Entry.Archive.GetEntry(Entry.FarEntry);
                using (var stream = new MemoryStream(data, false))
                {
                    T result = this.Codec.Decode(stream);
                    this.Cache.Add(Entry.ID, result);
                    return(result);
                }
            }
        }