diff --git a/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab b/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab index acf270baa..6b337e9fb 100644 --- a/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab +++ b/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab @@ -381,8 +381,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: 0c061fc81ac26244d9a22aad1c9e9e8a, type: 3} m_Type: 0 m_PreserveAspect: 0 @@ -494,6 +492,7 @@ Transform: - {fileID: 4562958389511350823} - {fileID: 3706623227065307714} - {fileID: 8833734914231061216} + - {fileID: 8862048243498412527} m_Father: {fileID: 8069444317427349030} m_RootOrder: 15 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1083,8 +1082,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: e337c1dff2e0a824fbc1d5f8c90c2ec1, type: 3} m_Type: 0 m_PreserveAspect: 0 @@ -1434,8 +1431,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: da18df064fc938741825bf4b646bb2a4, type: 3} m_Type: 0 m_PreserveAspect: 0 @@ -2044,8 +2039,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: f5f4cd79c3f72d142a256d04d5471973, type: 3} m_Type: 0 m_PreserveAspect: 0 @@ -2151,6 +2144,50 @@ Transform: m_Father: {fileID: 8069444317427349030} m_RootOrder: 17 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &7763783724366295958 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8862048243498412527} + - component: {fileID: 4591571610610142511} + m_Layer: 0 + m_Name: ContentDownloadReference + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8862048243498412527 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7763783724366295958} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8570025457633197298} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4591571610610142511 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7763783724366295958} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0602c0fdbc0b8f4ca63023ff9472f03, type: 3} + m_Name: + m_EditorClassIdentifier: + scene: 16 --- !u!1 &8055386401976209420 GameObject: m_ObjectHideFlags: 0 @@ -2304,8 +2341,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: 97909610fce886542905273f781dc083, type: 3} m_Type: 0 m_PreserveAspect: 0 @@ -2393,8 +2428,6 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null m_Sprite: {fileID: 21300000, guid: b79170b1e9bf52a4993b87ab99f2e167, type: 3} m_Type: 0 m_PreserveAspect: 0 diff --git a/UltraStar Play/Assets/Common/Scene/EScene.cs b/UltraStar Play/Assets/Common/Scene/EScene.cs index ef151d658..65a481911 100644 --- a/UltraStar Play/Assets/Common/Scene/EScene.cs +++ b/UltraStar Play/Assets/Common/Scene/EScene.cs @@ -21,6 +21,7 @@ public enum EScene OptionsSoundScene = 6, RecordingOptionsScene = 15, PlayerProfileSetupScene = 7, + ContentDownloadScene = 16, // sing SingScene = 11, diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib.meta b/UltraStar Play/Assets/Plugins/SharpZipLib.meta new file mode 100644 index 000000000..6268348e9 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57e22ffae05f8e54ead34727aaa00d47 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt b/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt new file mode 100644 index 000000000..f7642317c --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt @@ -0,0 +1,17 @@ +Copyright © 2000-2018 SharpZipLib Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt.meta new file mode 100644 index 000000000..e8a8b5aff --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/LICENSE.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eaac750e3af0bdc49a5ca910674db3b1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs new file mode 100644 index 000000000..eb14e2d49 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs @@ -0,0 +1,58 @@ +using System; +using System.Runtime.Serialization; + +namespace ICSharpCode.SharpZipLib +{ + /// + /// SharpZipBaseException is the base exception class for SharpZipLib. + /// All library exceptions are derived from this. + /// + /// NOTE: Not all exceptions thrown will be derived from this class. + /// A variety of other exceptions are possible for example + [Serializable] + public class SharpZipBaseException : Exception + { + /// + /// Initializes a new instance of the SharpZipBaseException class. + /// + public SharpZipBaseException() + { + } + + /// + /// Initializes a new instance of the SharpZipBaseException class with a specified error message. + /// + /// A message describing the exception. + public SharpZipBaseException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the SharpZipBaseException class with a specified + /// error message and a reference to the inner exception that is the cause of this exception. + /// + /// A message describing the exception. + /// The inner exception + public SharpZipBaseException(string message, Exception innerException) + : base(message, innerException) + { + } + + /// + /// Initializes a new instance of the SharpZipBaseException class with serialized data. + /// + /// + /// The System.Runtime.Serialization.SerializationInfo that holds the serialized + /// object data about the exception being thrown. + /// + /// + /// The System.Runtime.Serialization.StreamingContext that contains contextual information + /// about the source or destination. + /// + protected SharpZipBaseException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs.meta new file mode 100644 index 000000000..a96a9de3b --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/SharpZipBaseException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c73f172d8ffca0e46873f744e59dfdc5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar.meta new file mode 100644 index 000000000..1fdd9d920 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db966b51db216204e92c1374ffe7b23e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs new file mode 100644 index 000000000..a2e114052 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs @@ -0,0 +1,37 @@ +using System; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// This exception is used to indicate that there is a problem + /// with a TAR archive header. + /// + public class InvalidHeaderException : TarException + { + /// + /// Initialise a new instance of the InvalidHeaderException class. + /// + public InvalidHeaderException() + { + } + + /// + /// Initialises a new instance of the InvalidHeaderException class with a specified message. + /// + /// Message describing the exception cause. + public InvalidHeaderException(string message) + : base(message) + { + } + + /// + /// Initialise a new instance of InvalidHeaderException + /// + /// Message describing the problem. + /// The exception that is the cause of the current exception. + public InvalidHeaderException(string message, Exception exception) + : base(message, exception) + { + } + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs.meta new file mode 100644 index 000000000..1e48fec0a --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/InvalidHeaderException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b3b78bf44caa954389656c7807e171f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs new file mode 100644 index 000000000..133b33081 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs @@ -0,0 +1,959 @@ +using System; +using System.IO; +using System.Text; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// Used to advise clients of 'events' while processing archives + /// + public delegate void ProgressMessageHandler(TarArchive archive, TarEntry entry, string message); + + /// + /// The TarArchive class implements the concept of a + /// 'Tape Archive'. A tar archive is a series of entries, each of + /// which represents a file system object. Each entry in + /// the archive consists of a header block followed by 0 or more data blocks. + /// Directory entries consist only of the header block, and are followed by entries + /// for the directory's contents. File entries consist of a + /// header followed by the number of blocks needed to + /// contain the file's contents. All entries are written on + /// block boundaries. Blocks are 512 bytes long. + /// + /// TarArchives are instantiated in either read or write mode, + /// based upon whether they are instantiated with an InputStream + /// or an OutputStream. Once instantiated TarArchives read/write + /// mode can not be changed. + /// + /// There is currently no support for random access to tar archives. + /// However, it seems that subclassing TarArchive, and using the + /// TarBuffer.CurrentRecord and TarBuffer.CurrentBlock + /// properties, this would be rather trivial. + /// + public class TarArchive : IDisposable + { + /// + /// Client hook allowing detailed information to be reported during processing + /// + public event ProgressMessageHandler ProgressMessageEvent; + + /// + /// Raises the ProgressMessage event + /// + /// The TarEntry for this event + /// message for this event. Null is no message + protected virtual void OnProgressMessageEvent(TarEntry entry, string message) + { + ProgressMessageHandler handler = ProgressMessageEvent; + if (handler != null) + { + handler(this, entry, message); + } + } + + #region Constructors + + /// + /// Constructor for a default . + /// + protected TarArchive() + { + } + + /// + /// Initalise a TarArchive for input. + /// + /// The to use for input. + protected TarArchive(TarInputStream stream) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + tarIn = stream; + } + + /// + /// Initialise a TarArchive for output. + /// + /// The to use for output. + protected TarArchive(TarOutputStream stream) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + tarOut = stream; + } + + #endregion Constructors + + #region Static factory methods + + /// + /// The InputStream based constructors create a TarArchive for the + /// purposes of extracting or listing a tar archive. Thus, use + /// these constructors when you wish to extract files from or list + /// the contents of an existing tar archive. + /// + /// The stream to retrieve archive data from. + /// Returns a new suitable for reading from. + public static TarArchive CreateInputTarArchive(Stream inputStream) + { + if (inputStream == null) + { + throw new ArgumentNullException(nameof(inputStream)); + } + + var tarStream = inputStream as TarInputStream; + + TarArchive result; + if (tarStream != null) + { + result = new TarArchive(tarStream); + } + else + { + result = CreateInputTarArchive(inputStream, TarBuffer.DefaultBlockFactor); + } + return result; + } + + /// + /// Create TarArchive for reading setting block factor + /// + /// A stream containing the tar archive contents + /// The blocking factor to apply + /// Returns a suitable for reading. + public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFactor) + { + if (inputStream == null) + { + throw new ArgumentNullException(nameof(inputStream)); + } + + if (inputStream is TarInputStream) + { + throw new ArgumentException("TarInputStream not valid"); + } + + return new TarArchive(new TarInputStream(inputStream, blockFactor)); + } + + /// + /// Create a TarArchive for writing to, using the default blocking factor + /// + /// The to write to + /// Returns a suitable for writing. + public static TarArchive CreateOutputTarArchive(Stream outputStream) + { + if (outputStream == null) + { + throw new ArgumentNullException(nameof(outputStream)); + } + + var tarStream = outputStream as TarOutputStream; + + TarArchive result; + if (tarStream != null) + { + result = new TarArchive(tarStream); + } + else + { + result = CreateOutputTarArchive(outputStream, TarBuffer.DefaultBlockFactor); + } + return result; + } + + /// + /// Create a tar archive for writing. + /// + /// The stream to write to + /// The blocking factor to use for buffering. + /// Returns a suitable for writing. + public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFactor) + { + if (outputStream == null) + { + throw new ArgumentNullException(nameof(outputStream)); + } + + if (outputStream is TarOutputStream) + { + throw new ArgumentException("TarOutputStream is not valid"); + } + + return new TarArchive(new TarOutputStream(outputStream, blockFactor)); + } + + #endregion Static factory methods + + /// + /// Set the flag that determines whether existing files are + /// kept, or overwritten during extraction. + /// + /// + /// If true, do not overwrite existing files. + /// + public void SetKeepOldFiles(bool keepExistingFiles) + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + keepOldFiles = keepExistingFiles; + } + + /// + /// Get/set the ascii file translation flag. If ascii file translation + /// is true, then the file is checked to see if it a binary file or not. + /// If the flag is true and the test indicates it is ascii text + /// file, it will be translated. The translation converts the local + /// operating system's concept of line ends into the UNIX line end, + /// '\n', which is the defacto standard for a TAR archive. This makes + /// text files compatible with UNIX. + /// + public bool AsciiTranslate + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return asciiTranslate; + } + + set + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + asciiTranslate = value; + } + } + + /// + /// Set the ascii file translation flag. + /// + /// + /// If true, translate ascii text files. + /// + [Obsolete("Use the AsciiTranslate property")] + public void SetAsciiTranslation(bool translateAsciiFiles) + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + asciiTranslate = translateAsciiFiles; + } + + /// + /// PathPrefix is added to entry names as they are written if the value is not null. + /// A slash character is appended after PathPrefix + /// + public string PathPrefix + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return pathPrefix; + } + + set + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + pathPrefix = value; + } + } + + /// + /// RootPath is removed from entry names if it is found at the + /// beginning of the name. + /// + public string RootPath + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return rootPath; + } + + set + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + // Convert to forward slashes for matching. Trim trailing / for correct final path + rootPath = value.Replace('\\', '/').TrimEnd('/'); + } + } + + /// + /// Set user and group information that will be used to fill in the + /// tar archive's entry headers. This information is based on that available + /// for the linux operating system, which is not always available on other + /// operating systems. TarArchive allows the programmer to specify values + /// to be used in their place. + /// is set to true by this call. + /// + /// + /// The user id to use in the headers. + /// + /// + /// The user name to use in the headers. + /// + /// + /// The group id to use in the headers. + /// + /// + /// The group name to use in the headers. + /// + public void SetUserInfo(int userId, string userName, int groupId, string groupName) + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + this.userId = userId; + this.userName = userName; + this.groupId = groupId; + this.groupName = groupName; + applyUserInfoOverrides = true; + } + + /// + /// Get or set a value indicating if overrides defined by SetUserInfo should be applied. + /// + /// If overrides are not applied then the values as set in each header will be used. + public bool ApplyUserInfoOverrides + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return applyUserInfoOverrides; + } + + set + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + applyUserInfoOverrides = value; + } + } + + /// + /// Get the archive user id. + /// See ApplyUserInfoOverrides for detail + /// on how to allow setting values on a per entry basis. + /// + /// + /// The current user id. + /// + public int UserId + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return userId; + } + } + + /// + /// Get the archive user name. + /// See ApplyUserInfoOverrides for detail + /// on how to allow setting values on a per entry basis. + /// + /// + /// The current user name. + /// + public string UserName + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return userName; + } + } + + /// + /// Get the archive group id. + /// See ApplyUserInfoOverrides for detail + /// on how to allow setting values on a per entry basis. + /// + /// + /// The current group id. + /// + public int GroupId + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return groupId; + } + } + + /// + /// Get the archive group name. + /// See ApplyUserInfoOverrides for detail + /// on how to allow setting values on a per entry basis. + /// + /// + /// The current group name. + /// + public string GroupName + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + return groupName; + } + } + + /// + /// Get the archive's record size. Tar archives are composed of + /// a series of RECORDS each containing a number of BLOCKS. + /// This allowed tar archives to match the IO characteristics of + /// the physical device being used. Archives are expected + /// to be properly "blocked". + /// + /// + /// The record size this archive is using. + /// + public int RecordSize + { + get + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + if (tarIn != null) + { + return tarIn.RecordSize; + } + else if (tarOut != null) + { + return tarOut.RecordSize; + } + return TarBuffer.DefaultRecordSize; + } + } + + /// + /// Sets the IsStreamOwner property on the underlying stream. + /// Set this to false to prevent the Close of the TarArchive from closing the stream. + /// + public bool IsStreamOwner + { + set + { + if (tarIn != null) + { + tarIn.IsStreamOwner = value; + } + else + { + tarOut.IsStreamOwner = value; + } + } + } + + /// + /// Close the archive. + /// + [Obsolete("Use Close instead")] + public void CloseArchive() + { + Close(); + } + + /// + /// Perform the "list" command for the archive contents. + /// + /// NOTE That this method uses the progress event to actually list + /// the contents. If the progress display event is not set, nothing will be listed! + /// + public void ListContents() + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + while (true) + { + TarEntry entry = tarIn.GetNextEntry(); + + if (entry == null) + { + break; + } + OnProgressMessageEvent(entry, null); + } + } + + /// + /// Perform the "extract" command and extract the contents of the archive. + /// + /// + /// The destination directory into which to extract. + /// + public void ExtractContents(string destinationDirectory) + { + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + while (true) + { + TarEntry entry = tarIn.GetNextEntry(); + + if (entry == null) + { + break; + } + + if (entry.TarHeader.TypeFlag == TarHeader.LF_LINK || entry.TarHeader.TypeFlag == TarHeader.LF_SYMLINK) + continue; + + ExtractEntry(destinationDirectory, entry); + } + } + + /// + /// Extract an entry from the archive. This method assumes that the + /// tarIn stream has been properly set with a call to GetNextEntry(). + /// + /// + /// The destination directory into which to extract. + /// + /// + /// The TarEntry returned by tarIn.GetNextEntry(). + /// + private void ExtractEntry(string destDir, TarEntry entry) + { + OnProgressMessageEvent(entry, null); + + string name = entry.Name; + + if (Path.IsPathRooted(name)) + { + // NOTE: + // for UNC names... \\machine\share\zoom\beet.txt gives \zoom\beet.txt + name = name.Substring(Path.GetPathRoot(name).Length); + } + + name = name.Replace('/', Path.DirectorySeparatorChar); + + string destFile = Path.Combine(destDir, name); + + if (entry.IsDirectory) + { + EnsureDirectoryExists(destFile); + } + else + { + string parentDirectory = Path.GetDirectoryName(destFile); + EnsureDirectoryExists(parentDirectory); + + bool process = true; + var fileInfo = new FileInfo(destFile); + if (fileInfo.Exists) + { + if (keepOldFiles) + { + OnProgressMessageEvent(entry, "Destination file already exists"); + process = false; + } + else if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0) + { + OnProgressMessageEvent(entry, "Destination file already exists, and is read-only"); + process = false; + } + } + + if (process) + { + using (var outputStream = File.Create(destFile)) + { + if (this.asciiTranslate) + { + // May need to translate the file. + ExtractAndTranslateEntry(destFile, outputStream); + } + else + { + // If translation is disabled, just copy the entry across directly. + tarIn.CopyEntryContents(outputStream); + } + } + } + } + } + + // Extract a TAR entry, and perform an ASCII translation if required. + private void ExtractAndTranslateEntry(string destFile, Stream outputStream) + { + bool asciiTrans = !IsBinary(destFile); + + if (asciiTrans) + { + using (var outw = new StreamWriter(outputStream, new UTF8Encoding(false), 1024, true)) + { + byte[] rdbuf = new byte[32 * 1024]; + + while (true) + { + int numRead = tarIn.Read(rdbuf, 0, rdbuf.Length); + + if (numRead <= 0) + { + break; + } + + for (int off = 0, b = 0; b < numRead; ++b) + { + if (rdbuf[b] == 10) + { + string s = Encoding.ASCII.GetString(rdbuf, off, (b - off)); + outw.WriteLine(s); + off = b + 1; + } + } + } + } + } + else + { + // No translation required. + tarIn.CopyEntryContents(outputStream); + } + } + + /// + /// Write an entry to the archive. This method will call the putNextEntry + /// and then write the contents of the entry, and finally call closeEntry() + /// for entries that are files. For directories, it will call putNextEntry(), + /// and then, if the recurse flag is true, process each entry that is a + /// child of the directory. + /// + /// + /// The TarEntry representing the entry to write to the archive. + /// + /// + /// If true, process the children of directory entries. + /// + public void WriteEntry(TarEntry sourceEntry, bool recurse) + { + if (sourceEntry == null) + { + throw new ArgumentNullException(nameof(sourceEntry)); + } + + if (isDisposed) + { + throw new ObjectDisposedException("TarArchive"); + } + + try + { + if (recurse) + { + TarHeader.SetValueDefaults(sourceEntry.UserId, sourceEntry.UserName, + sourceEntry.GroupId, sourceEntry.GroupName); + } + WriteEntryCore(sourceEntry, recurse); + } + finally + { + if (recurse) + { + TarHeader.RestoreSetValues(); + } + } + } + + /// + /// Write an entry to the archive. This method will call the putNextEntry + /// and then write the contents of the entry, and finally call closeEntry() + /// for entries that are files. For directories, it will call putNextEntry(), + /// and then, if the recurse flag is true, process each entry that is a + /// child of the directory. + /// + /// + /// The TarEntry representing the entry to write to the archive. + /// + /// + /// If true, process the children of directory entries. + /// + private void WriteEntryCore(TarEntry sourceEntry, bool recurse) + { + string tempFileName = null; + string entryFilename = sourceEntry.File; + + var entry = (TarEntry)sourceEntry.Clone(); + + if (applyUserInfoOverrides) + { + entry.GroupId = groupId; + entry.GroupName = groupName; + entry.UserId = userId; + entry.UserName = userName; + } + + OnProgressMessageEvent(entry, null); + + if (asciiTranslate && !entry.IsDirectory) + { + if (!IsBinary(entryFilename)) + { + tempFileName = Path.GetTempFileName(); + + using (StreamReader inStream = File.OpenText(entryFilename)) + { + using (Stream outStream = File.Create(tempFileName)) + { + while (true) + { + string line = inStream.ReadLine(); + if (line == null) + { + break; + } + byte[] data = Encoding.ASCII.GetBytes(line); + outStream.Write(data, 0, data.Length); + outStream.WriteByte((byte)'\n'); + } + + outStream.Flush(); + } + } + + entry.Size = new FileInfo(tempFileName).Length; + entryFilename = tempFileName; + } + } + + string newName = null; + + if (!String.IsNullOrEmpty(rootPath)) + { + if (entry.Name.StartsWith(rootPath, StringComparison.OrdinalIgnoreCase)) + { + newName = entry.Name.Substring(rootPath.Length + 1); + } + } + + if (pathPrefix != null) + { + newName = (newName == null) ? pathPrefix + "/" + entry.Name : pathPrefix + "/" + newName; + } + + if (newName != null) + { + entry.Name = newName; + } + + tarOut.PutNextEntry(entry); + + if (entry.IsDirectory) + { + if (recurse) + { + TarEntry[] list = entry.GetDirectoryEntries(); + for (int i = 0; i < list.Length; ++i) + { + WriteEntryCore(list[i], recurse); + } + } + } + else + { + using (Stream inputStream = File.OpenRead(entryFilename)) + { + byte[] localBuffer = new byte[32 * 1024]; + while (true) + { + int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length); + + if (numRead <= 0) + { + break; + } + + tarOut.Write(localBuffer, 0, numRead); + } + } + + if (!string.IsNullOrEmpty(tempFileName)) + { + File.Delete(tempFileName); + } + + tarOut.CloseEntry(); + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases the unmanaged resources used by the FileStream and optionally releases the managed resources. + /// + /// true to release both managed and unmanaged resources; + /// false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + isDisposed = true; + if (disposing) + { + if (tarOut != null) + { + tarOut.Flush(); + tarOut.Dispose(); + } + + if (tarIn != null) + { + tarIn.Dispose(); + } + } + } + } + + /// + /// Closes the archive and releases any associated resources. + /// + public virtual void Close() + { + Dispose(true); + } + + /// + /// Ensures that resources are freed and other cleanup operations are performed + /// when the garbage collector reclaims the . + /// + ~TarArchive() + { + Dispose(false); + } + + private static void EnsureDirectoryExists(string directoryName) + { + if (!Directory.Exists(directoryName)) + { + try + { + Directory.CreateDirectory(directoryName); + } + catch (Exception e) + { + throw new TarException("Exception creating directory '" + directoryName + "', " + e.Message, e); + } + } + } + + // TODO: TarArchive - Is there a better way to test for a text file? + // It no longer reads entire files into memory but is still a weak test! + // This assumes that byte values 0-7, 14-31 or 255 are binary + // and that all non text files contain one of these values + private static bool IsBinary(string filename) + { + using (FileStream fs = File.OpenRead(filename)) + { + int sampleSize = Math.Min(4096, (int)fs.Length); + byte[] content = new byte[sampleSize]; + + int bytesRead = fs.Read(content, 0, sampleSize); + + for (int i = 0; i < bytesRead; ++i) + { + byte b = content[i]; + if ((b < 8) || ((b > 13) && (b < 32)) || (b == 255)) + { + return true; + } + } + } + return false; + } + + #region Instance Fields + + private bool keepOldFiles; + private bool asciiTranslate; + + private int userId; + private string userName = string.Empty; + private int groupId; + private string groupName = string.Empty; + + private string rootPath; + private string pathPrefix; + + private bool applyUserInfoOverrides; + + private TarInputStream tarIn; + private TarOutputStream tarOut; + private bool isDisposed; + + #endregion Instance Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs.meta new file mode 100644 index 000000000..94a834a0f --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarArchive.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4cd2847d10388d549b98fcd3b7468ea4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs new file mode 100644 index 000000000..43a6d5cdf --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs @@ -0,0 +1,599 @@ +using System; +using System.IO; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// The TarBuffer class implements the tar archive concept + /// of a buffered input stream. This concept goes back to the + /// days of blocked tape drives and special io devices. In the + /// C# universe, the only real function that this class + /// performs is to ensure that files have the correct "record" + /// size, or other tars will complain. + ///

+ /// You should never have a need to access this class directly. + /// TarBuffers are created by Tar IO Streams. + ///

+ ///
+ public class TarBuffer + { + /* A quote from GNU tar man file on blocking and records + A `tar' archive file contains a series of blocks. Each block + contains `BLOCKSIZE' bytes. Although this format may be thought of as + being on magnetic tape, other media are often used. + + Each file archived is represented by a header block which describes + the file, followed by zero or more blocks which give the contents of + the file. At the end of the archive file there may be a block filled + with binary zeros as an end-of-file marker. A reasonable system should + write a block of zeros at the end, but must not assume that such a + block exists when reading an archive. + + The blocks may be "blocked" for physical I/O operations. Each + record of N blocks is written with a single 'write ()' + operation. On magnetic tapes, the result of such a write is a single + record. When writing an archive, the last record of blocks should be + written at the full size, with blocks after the zero block containing + all zeros. When reading an archive, a reasonable system should + properly handle an archive whose last record is shorter than the rest, + or which contains garbage records after a zero block. + */ + + #region Constants + + /// + /// The size of a block in a tar archive in bytes. + /// + /// This is 512 bytes. + public const int BlockSize = 512; + + /// + /// The number of blocks in a default record. + /// + /// + /// The default value is 20 blocks per record. + /// + public const int DefaultBlockFactor = 20; + + /// + /// The size in bytes of a default record. + /// + /// + /// The default size is 10KB. + /// + public const int DefaultRecordSize = BlockSize * DefaultBlockFactor; + + #endregion Constants + + /// + /// Get the record size for this buffer + /// + /// The record size in bytes. + /// This is equal to the multiplied by the + public int RecordSize + { + get + { + return recordSize; + } + } + + /// + /// Get the TAR Buffer's record size. + /// + /// The record size in bytes. + /// This is equal to the multiplied by the + [Obsolete("Use RecordSize property instead")] + public int GetRecordSize() + { + return recordSize; + } + + /// + /// Get the Blocking factor for the buffer + /// + /// This is the number of blocks in each record. + public int BlockFactor + { + get + { + return blockFactor; + } + } + + /// + /// Get the TAR Buffer's block factor + /// + /// The block factor; the number of blocks per record. + [Obsolete("Use BlockFactor property instead")] + public int GetBlockFactor() + { + return blockFactor; + } + + /// + /// Construct a default TarBuffer + /// + protected TarBuffer() + { + } + + /// + /// Create TarBuffer for reading with default BlockFactor + /// + /// Stream to buffer + /// A new suitable for input. + public static TarBuffer CreateInputTarBuffer(Stream inputStream) + { + if (inputStream == null) + { + throw new ArgumentNullException(nameof(inputStream)); + } + + return CreateInputTarBuffer(inputStream, DefaultBlockFactor); + } + + /// + /// Construct TarBuffer for reading inputStream setting BlockFactor + /// + /// Stream to buffer + /// Blocking factor to apply + /// A new suitable for input. + public static TarBuffer CreateInputTarBuffer(Stream inputStream, int blockFactor) + { + if (inputStream == null) + { + throw new ArgumentNullException(nameof(inputStream)); + } + + if (blockFactor <= 0) + { + throw new ArgumentOutOfRangeException(nameof(blockFactor), "Factor cannot be negative"); + } + + var tarBuffer = new TarBuffer(); + tarBuffer.inputStream = inputStream; + tarBuffer.outputStream = null; + tarBuffer.Initialize(blockFactor); + + return tarBuffer; + } + + /// + /// Construct TarBuffer for writing with default BlockFactor + /// + /// output stream for buffer + /// A new suitable for output. + public static TarBuffer CreateOutputTarBuffer(Stream outputStream) + { + if (outputStream == null) + { + throw new ArgumentNullException(nameof(outputStream)); + } + + return CreateOutputTarBuffer(outputStream, DefaultBlockFactor); + } + + /// + /// Construct TarBuffer for writing Tar output to streams. + /// + /// Output stream to write to. + /// Blocking factor to apply + /// A new suitable for output. + public static TarBuffer CreateOutputTarBuffer(Stream outputStream, int blockFactor) + { + if (outputStream == null) + { + throw new ArgumentNullException(nameof(outputStream)); + } + + if (blockFactor <= 0) + { + throw new ArgumentOutOfRangeException(nameof(blockFactor), "Factor cannot be negative"); + } + + var tarBuffer = new TarBuffer(); + tarBuffer.inputStream = null; + tarBuffer.outputStream = outputStream; + tarBuffer.Initialize(blockFactor); + + return tarBuffer; + } + + /// + /// Initialization common to all constructors. + /// + private void Initialize(int archiveBlockFactor) + { + blockFactor = archiveBlockFactor; + recordSize = archiveBlockFactor * BlockSize; + recordBuffer = new byte[RecordSize]; + + if (inputStream != null) + { + currentRecordIndex = -1; + currentBlockIndex = BlockFactor; + } + else + { + currentRecordIndex = 0; + currentBlockIndex = 0; + } + } + + /// + /// Determine if an archive block indicates End of Archive. End of + /// archive is indicated by a block that consists entirely of null bytes. + /// All remaining blocks for the record should also be null's + /// However some older tars only do a couple of null blocks (Old GNU tar for one) + /// and also partial records + /// + /// The data block to check. + /// Returns true if the block is an EOF block; false otherwise. + [Obsolete("Use IsEndOfArchiveBlock instead")] + public bool IsEOFBlock(byte[] block) + { + if (block == null) + { + throw new ArgumentNullException(nameof(block)); + } + + if (block.Length != BlockSize) + { + throw new ArgumentException("block length is invalid"); + } + + for (int i = 0; i < BlockSize; ++i) + { + if (block[i] != 0) + { + return false; + } + } + + return true; + } + + /// + /// Determine if an archive block indicates the End of an Archive has been reached. + /// End of archive is indicated by a block that consists entirely of null bytes. + /// All remaining blocks for the record should also be null's + /// However some older tars only do a couple of null blocks (Old GNU tar for one) + /// and also partial records + /// + /// The data block to check. + /// Returns true if the block is an EOF block; false otherwise. + public static bool IsEndOfArchiveBlock(byte[] block) + { + if (block == null) + { + throw new ArgumentNullException(nameof(block)); + } + + if (block.Length != BlockSize) + { + throw new ArgumentException("block length is invalid"); + } + + for (int i = 0; i < BlockSize; ++i) + { + if (block[i] != 0) + { + return false; + } + } + + return true; + } + + /// + /// Skip over a block on the input stream. + /// + public void SkipBlock() + { + if (inputStream == null) + { + throw new TarException("no input stream defined"); + } + + if (currentBlockIndex >= BlockFactor) + { + if (!ReadRecord()) + { + throw new TarException("Failed to read a record"); + } + } + + currentBlockIndex++; + } + + /// + /// Read a block from the input stream. + /// + /// + /// The block of data read. + /// + public byte[] ReadBlock() + { + if (inputStream == null) + { + throw new TarException("TarBuffer.ReadBlock - no input stream defined"); + } + + if (currentBlockIndex >= BlockFactor) + { + if (!ReadRecord()) + { + throw new TarException("Failed to read a record"); + } + } + + byte[] result = new byte[BlockSize]; + + Array.Copy(recordBuffer, (currentBlockIndex * BlockSize), result, 0, BlockSize); + currentBlockIndex++; + return result; + } + + /// + /// Read a record from data stream. + /// + /// + /// false if End-Of-File, else true. + /// + private bool ReadRecord() + { + if (inputStream == null) + { + throw new TarException("no input stream stream defined"); + } + + currentBlockIndex = 0; + + int offset = 0; + int bytesNeeded = RecordSize; + + while (bytesNeeded > 0) + { + long numBytes = inputStream.Read(recordBuffer, offset, bytesNeeded); + + // + // NOTE + // We have found EOF, and the record is not full! + // + // This is a broken archive. It does not follow the standard + // blocking algorithm. However, because we are generous, and + // it requires little effort, we will simply ignore the error + // and continue as if the entire record were read. This does + // not appear to break anything upstream. We used to return + // false in this case. + // + // Thanks to 'Yohann.Roussel@alcatel.fr' for this fix. + // + if (numBytes <= 0) + { + break; + } + + offset += (int)numBytes; + bytesNeeded -= (int)numBytes; + } + + currentRecordIndex++; + return true; + } + + /// + /// Get the current block number, within the current record, zero based. + /// + /// Block numbers are zero based values + /// + public int CurrentBlock + { + get { return currentBlockIndex; } + } + + /// + /// Gets or sets a flag indicating ownership of underlying stream. + /// When the flag is true will close the underlying stream also. + /// + /// The default value is true. + public bool IsStreamOwner { get; set; } = true; + + /// + /// Get the current block number, within the current record, zero based. + /// + /// + /// The current zero based block number. + /// + /// + /// The absolute block number = (record number * block factor) + block number. + /// + [Obsolete("Use CurrentBlock property instead")] + public int GetCurrentBlockNum() + { + return currentBlockIndex; + } + + /// + /// Get the current record number. + /// + /// + /// The current zero based record number. + /// + public int CurrentRecord + { + get { return currentRecordIndex; } + } + + /// + /// Get the current record number. + /// + /// + /// The current zero based record number. + /// + [Obsolete("Use CurrentRecord property instead")] + public int GetCurrentRecordNum() + { + return currentRecordIndex; + } + + /// + /// Write a block of data to the archive. + /// + /// + /// The data to write to the archive. + /// + public void WriteBlock(byte[] block) + { + if (block == null) + { + throw new ArgumentNullException(nameof(block)); + } + + if (outputStream == null) + { + throw new TarException("TarBuffer.WriteBlock - no output stream defined"); + } + + if (block.Length != BlockSize) + { + string errorText = string.Format("TarBuffer.WriteBlock - block to write has length '{0}' which is not the block size of '{1}'", + block.Length, BlockSize); + throw new TarException(errorText); + } + + if (currentBlockIndex >= BlockFactor) + { + WriteRecord(); + } + + Array.Copy(block, 0, recordBuffer, (currentBlockIndex * BlockSize), BlockSize); + currentBlockIndex++; + } + + /// + /// Write an archive record to the archive, where the record may be + /// inside of a larger array buffer. The buffer must be "offset plus + /// record size" long. + /// + /// + /// The buffer containing the record data to write. + /// + /// + /// The offset of the record data within buffer. + /// + public void WriteBlock(byte[] buffer, int offset) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (outputStream == null) + { + throw new TarException("TarBuffer.WriteBlock - no output stream stream defined"); + } + + if ((offset < 0) || (offset >= buffer.Length)) + { + throw new ArgumentOutOfRangeException(nameof(offset)); + } + + if ((offset + BlockSize) > buffer.Length) + { + string errorText = string.Format("TarBuffer.WriteBlock - record has length '{0}' with offset '{1}' which is less than the record size of '{2}'", + buffer.Length, offset, recordSize); + throw new TarException(errorText); + } + + if (currentBlockIndex >= BlockFactor) + { + WriteRecord(); + } + + Array.Copy(buffer, offset, recordBuffer, (currentBlockIndex * BlockSize), BlockSize); + + currentBlockIndex++; + } + + /// + /// Write a TarBuffer record to the archive. + /// + private void WriteRecord() + { + if (outputStream == null) + { + throw new TarException("TarBuffer.WriteRecord no output stream defined"); + } + + outputStream.Write(recordBuffer, 0, RecordSize); + outputStream.Flush(); + + currentBlockIndex = 0; + currentRecordIndex++; + } + + /// + /// WriteFinalRecord writes the current record buffer to output any unwritten data is present. + /// + /// Any trailing bytes are set to zero which is by definition correct behaviour + /// for the end of a tar stream. + private void WriteFinalRecord() + { + if (outputStream == null) + { + throw new TarException("TarBuffer.WriteFinalRecord no output stream defined"); + } + + if (currentBlockIndex > 0) + { + int dataBytes = currentBlockIndex * BlockSize; + Array.Clear(recordBuffer, dataBytes, RecordSize - dataBytes); + WriteRecord(); + } + + outputStream.Flush(); + } + + /// + /// Close the TarBuffer. If this is an output buffer, also flush the + /// current block before closing. + /// + public void Close() + { + if (outputStream != null) + { + WriteFinalRecord(); + + if (IsStreamOwner) + { + outputStream.Dispose(); + } + outputStream = null; + } + else if (inputStream != null) + { + if (IsStreamOwner) + { + inputStream.Dispose(); + } + inputStream = null; + } + } + + #region Instance Fields + + private Stream inputStream; + private Stream outputStream; + + private byte[] recordBuffer; + private int currentBlockIndex; + private int currentRecordIndex; + + private int recordSize = DefaultRecordSize; + private int blockFactor = DefaultBlockFactor; + + #endregion Instance Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs.meta new file mode 100644 index 000000000..d10401deb --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarBuffer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 33110a88f15f548499eb81ade1cd2790 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs new file mode 100644 index 000000000..f7d2a493d --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs @@ -0,0 +1,547 @@ +using System; +using System.IO; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// This class represents an entry in a Tar archive. It consists + /// of the entry's header, as well as the entry's File. Entries + /// can be instantiated in one of three ways, depending on how + /// they are to be used. + ///

+ /// TarEntries that are created from the header bytes read from + /// an archive are instantiated with the TarEntry( byte[] ) + /// constructor. These entries will be used when extracting from + /// or listing the contents of an archive. These entries have their + /// header filled in using the header bytes. They also set the File + /// to null, since they reference an archive entry not a file.

+ ///

+ /// TarEntries that are created from files that are to be written + /// into an archive are instantiated with the CreateEntryFromFile(string) + /// pseudo constructor. These entries have their header filled in using + /// the File's information. They also keep a reference to the File + /// for convenience when writing entries.

+ ///

+ /// Finally, TarEntries can be constructed from nothing but a name. + /// This allows the programmer to construct the entry by hand, for + /// instance when only an InputStream is available for writing to + /// the archive, and the header information is constructed from + /// other information. In this case the header fields are set to + /// defaults and the File is set to null.

+ /// + ///
+ public class TarEntry + { + #region Constructors + + /// + /// Initialise a default instance of . + /// + private TarEntry() + { + header = new TarHeader(); + } + + /// + /// Construct an entry from an archive's header bytes. File is set + /// to null. + /// + /// + /// The header bytes from a tar archive entry. + /// + public TarEntry(byte[] headerBuffer) + { + header = new TarHeader(); + header.ParseBuffer(headerBuffer); + } + + /// + /// Construct a TarEntry using the header provided + /// + /// Header details for entry + public TarEntry(TarHeader header) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + this.header = (TarHeader)header.Clone(); + } + + #endregion Constructors + + #region ICloneable Members + + /// + /// Clone this tar entry. + /// + /// Returns a clone of this entry. + public object Clone() + { + var entry = new TarEntry(); + entry.file = file; + entry.header = (TarHeader)header.Clone(); + entry.Name = Name; + return entry; + } + + #endregion ICloneable Members + + /// + /// Construct an entry with only a name. + /// This allows the programmer to construct the entry's header "by hand". + /// + /// The name to use for the entry + /// Returns the newly created + public static TarEntry CreateTarEntry(string name) + { + var entry = new TarEntry(); + TarEntry.NameTarHeader(entry.header, name); + return entry; + } + + /// + /// Construct an entry for a file. File is set to file, and the + /// header is constructed from information from the file. + /// + /// The file name that the entry represents. + /// Returns the newly created + public static TarEntry CreateEntryFromFile(string fileName) + { + var entry = new TarEntry(); + entry.GetFileTarHeader(entry.header, fileName); + return entry; + } + + /// + /// Determine if the two entries are equal. Equality is determined + /// by the header names being equal. + /// + /// The to compare with the current Object. + /// + /// True if the entries are equal; false if not. + /// + public override bool Equals(object obj) + { + var localEntry = obj as TarEntry; + + if (localEntry != null) + { + return Name.Equals(localEntry.Name); + } + return false; + } + + /// + /// Derive a Hash value for the current + /// + /// A Hash code for the current + public override int GetHashCode() + { + return Name.GetHashCode(); + } + + /// + /// Determine if the given entry is a descendant of this entry. + /// Descendancy is determined by the name of the descendant + /// starting with this entry's name. + /// + /// + /// Entry to be checked as a descendent of this. + /// + /// + /// True if entry is a descendant of this. + /// + public bool IsDescendent(TarEntry toTest) + { + if (toTest == null) + { + throw new ArgumentNullException(nameof(toTest)); + } + + return toTest.Name.StartsWith(Name, StringComparison.Ordinal); + } + + /// + /// Get this entry's header. + /// + /// + /// This entry's TarHeader. + /// + public TarHeader TarHeader + { + get + { + return header; + } + } + + /// + /// Get/Set this entry's name. + /// + public string Name + { + get + { + return header.Name; + } + set + { + header.Name = value; + } + } + + /// + /// Get/set this entry's user id. + /// + public int UserId + { + get + { + return header.UserId; + } + set + { + header.UserId = value; + } + } + + /// + /// Get/set this entry's group id. + /// + public int GroupId + { + get + { + return header.GroupId; + } + set + { + header.GroupId = value; + } + } + + /// + /// Get/set this entry's user name. + /// + public string UserName + { + get + { + return header.UserName; + } + set + { + header.UserName = value; + } + } + + /// + /// Get/set this entry's group name. + /// + public string GroupName + { + get + { + return header.GroupName; + } + set + { + header.GroupName = value; + } + } + + /// + /// Convenience method to set this entry's group and user ids. + /// + /// + /// This entry's new user id. + /// + /// + /// This entry's new group id. + /// + public void SetIds(int userId, int groupId) + { + UserId = userId; + GroupId = groupId; + } + + /// + /// Convenience method to set this entry's group and user names. + /// + /// + /// This entry's new user name. + /// + /// + /// This entry's new group name. + /// + public void SetNames(string userName, string groupName) + { + UserName = userName; + GroupName = groupName; + } + + /// + /// Get/Set the modification time for this entry + /// + public DateTime ModTime + { + get + { + return header.ModTime; + } + set + { + header.ModTime = value; + } + } + + /// + /// Get this entry's file. + /// + /// + /// This entry's file. + /// + public string File + { + get + { + return file; + } + } + + /// + /// Get/set this entry's recorded file size. + /// + public long Size + { + get + { + return header.Size; + } + set + { + header.Size = value; + } + } + + /// + /// Return true if this entry represents a directory, false otherwise + /// + /// + /// True if this entry is a directory. + /// + public bool IsDirectory + { + get + { + if (file != null) + { + return Directory.Exists(file); + } + + if (header != null) + { + if ((header.TypeFlag == TarHeader.LF_DIR) || Name.EndsWith("/", StringComparison.Ordinal)) + { + return true; + } + } + return false; + } + } + + /// + /// Fill in a TarHeader with information from a File. + /// + /// + /// The TarHeader to fill in. + /// + /// + /// The file from which to get the header information. + /// + public void GetFileTarHeader(TarHeader header, string file) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + if (file == null) + { + throw new ArgumentNullException(nameof(file)); + } + + this.file = file; + + // bugfix from torhovl from #D forum: + string name = file; + + // 23-Jan-2004 GnuTar allows device names in path where the name is not local to the current directory + if (name.IndexOf(Directory.GetCurrentDirectory(), StringComparison.Ordinal) == 0) + { + name = name.Substring(Directory.GetCurrentDirectory().Length); + } + + /* + if (Path.DirectorySeparatorChar == '\\') + { + // check if the OS is Windows + // Strip off drive letters! + if (name.Length > 2) + { + char ch1 = name[0]; + char ch2 = name[1]; + + if (ch2 == ':' && Char.IsLetter(ch1)) + { + name = name.Substring(2); + } + } + } + */ + + name = name.Replace(Path.DirectorySeparatorChar, '/'); + + // No absolute pathnames + // Windows (and Posix?) paths can start with UNC style "\\NetworkDrive\", + // so we loop on starting /'s. + while (name.StartsWith("/", StringComparison.Ordinal)) + { + name = name.Substring(1); + } + + header.LinkName = String.Empty; + header.Name = name; + + if (Directory.Exists(file)) + { + header.Mode = 1003; // Magic number for security access for a UNIX filesystem + header.TypeFlag = TarHeader.LF_DIR; + if ((header.Name.Length == 0) || header.Name[header.Name.Length - 1] != '/') + { + header.Name = header.Name + "/"; + } + + header.Size = 0; + } + else + { + header.Mode = 33216; // Magic number for security access for a UNIX filesystem + header.TypeFlag = TarHeader.LF_NORMAL; + header.Size = new FileInfo(file.Replace('/', Path.DirectorySeparatorChar)).Length; + } + + header.ModTime = System.IO.File.GetLastWriteTime(file.Replace('/', Path.DirectorySeparatorChar)).ToUniversalTime(); + header.DevMajor = 0; + header.DevMinor = 0; + } + + /// + /// Get entries for all files present in this entries directory. + /// If this entry doesnt represent a directory zero entries are returned. + /// + /// + /// An array of TarEntry's for this entry's children. + /// + public TarEntry[] GetDirectoryEntries() + { + if ((file == null) || !Directory.Exists(file)) + { + return new TarEntry[0]; + } + + string[] list = Directory.GetFileSystemEntries(file); + TarEntry[] result = new TarEntry[list.Length]; + + for (int i = 0; i < list.Length; ++i) + { + result[i] = TarEntry.CreateEntryFromFile(list[i]); + } + + return result; + } + + /// + /// Write an entry's header information to a header buffer. + /// + /// + /// The tar entry header buffer to fill in. + /// + public void WriteEntryHeader(byte[] outBuffer) + { + header.WriteHeader(outBuffer); + } + + /// + /// Convenience method that will modify an entry's name directly + /// in place in an entry header buffer byte array. + /// + /// + /// The buffer containing the entry header to modify. + /// + /// + /// The new name to place into the header buffer. + /// + static public void AdjustEntryName(byte[] buffer, string newName) + { + TarHeader.GetNameBytes(newName, buffer, 0, TarHeader.NAMELEN); + } + + /// + /// Fill in a TarHeader given only the entry's name. + /// + /// + /// The TarHeader to fill in. + /// + /// + /// The tar entry name. + /// + static public void NameTarHeader(TarHeader header, string name) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + bool isDir = name.EndsWith("/", StringComparison.Ordinal); + + header.Name = name; + header.Mode = isDir ? 1003 : 33216; + header.UserId = 0; + header.GroupId = 0; + header.Size = 0; + + header.ModTime = DateTime.UtcNow; + + header.TypeFlag = isDir ? TarHeader.LF_DIR : TarHeader.LF_NORMAL; + + header.LinkName = String.Empty; + header.UserName = String.Empty; + header.GroupName = String.Empty; + + header.DevMajor = 0; + header.DevMinor = 0; + } + + #region Instance Fields + + /// + /// The name of the file this entry represents or null if the entry is not based on a file. + /// + private string file; + + /// + /// The entry's header information. + /// + private TarHeader header; + + #endregion Instance Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs.meta new file mode 100644 index 000000000..3c9378fd8 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarEntry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7679de3b5bf543d4c8428964eb5aca88 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs new file mode 100644 index 000000000..dacdb3267 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs @@ -0,0 +1,54 @@ +using System; +using System.Runtime.Serialization; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// TarException represents exceptions specific to Tar classes and code. + /// + [Serializable] + public class TarException : SharpZipBaseException + { + /// + /// Initialise a new instance of . + /// + public TarException() + { + } + + /// + /// Initialise a new instance of with its message string. + /// + /// A that describes the error. + public TarException(string message) + : base(message) + { + } + + /// + /// Initialise a new instance of . + /// + /// A that describes the error. + /// The that caused this exception. + public TarException(string message, Exception innerException) + : base(message, innerException) + { + } + + /// + /// Initializes a new instance of the TarException class with serialized data. + /// + /// + /// The System.Runtime.Serialization.SerializationInfo that holds the serialized + /// object data about the exception being thrown. + /// + /// + /// The System.Runtime.Serialization.StreamingContext that contains contextual information + /// about the source or destination. + /// + protected TarException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs.meta new file mode 100644 index 000000000..dd61214db --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 612760e41d12f0b468d642358b98489b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs new file mode 100644 index 000000000..d1d438ad0 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs @@ -0,0 +1,99 @@ +using System.Collections.Generic; +using System.Text; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// Reads the extended header of a Tar stream + /// + public class TarExtendedHeaderReader + { + private const byte LENGTH = 0; + private const byte KEY = 1; + private const byte VALUE = 2; + private const byte END = 3; + + private readonly Dictionary headers = new Dictionary(); + + private string[] headerParts = new string[3]; + + private int bbIndex; + private byte[] byteBuffer; + private char[] charBuffer; + + private readonly StringBuilder sb = new StringBuilder(); + private readonly Decoder decoder = Encoding.UTF8.GetDecoder(); + + private int state = LENGTH; + + private static readonly byte[] StateNext = new[] { (byte)' ', (byte)'=', (byte)'\n' }; + + /// + /// Creates a new . + /// + public TarExtendedHeaderReader() + { + ResetBuffers(); + } + + /// + /// Read bytes from + /// + /// + /// + public void Read(byte[] buffer, int length) + { + for (int i = 0; i < length; i++) + { + byte next = buffer[i]; + + if (next == StateNext[state]) + { + Flush(); + headerParts[state] = sb.ToString(); + sb.Clear(); + + if (++state == END) + { + headers.Add(headerParts[KEY], headerParts[VALUE]); + headerParts = new string[3]; + state = LENGTH; + } + } + else + { + byteBuffer[bbIndex++] = next; + if (bbIndex == 4) + Flush(); + } + } + } + + private void Flush() + { + decoder.Convert(byteBuffer, 0, bbIndex, charBuffer, 0, 4, false, out int bytesUsed, out int charsUsed, out bool completed); + + sb.Append(charBuffer, 0, charsUsed); + ResetBuffers(); + } + + private void ResetBuffers() + { + charBuffer = new char[4]; + byteBuffer = new byte[4]; + bbIndex = 0; + } + + /// + /// Returns the parsed headers as key-value strings + /// + public Dictionary Headers + { + get + { + // TODO: Check for invalid state? -NM 2018-07-01 + return headers; + } + } + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs.meta new file mode 100644 index 000000000..1af2cc63a --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarExtendedHeaderReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3437cf044f4463547a2933810792dec1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs new file mode 100644 index 000000000..e29507427 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs @@ -0,0 +1,1161 @@ +using System; +using System.Text; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// This class encapsulates the Tar Entry Header used in Tar Archives. + /// The class also holds a number of tar constants, used mostly in headers. + /// + /// + /// The tar format and its POSIX successor PAX have a long history which makes for compatability + /// issues when creating and reading files. + /// + /// This is further complicated by a large number of programs with variations on formats + /// One common issue is the handling of names longer than 100 characters. + /// GNU style long names are currently supported. + /// + /// This is the ustar (Posix 1003.1) header. + /// + /// struct header + /// { + /// char t_name[100]; // 0 Filename + /// char t_mode[8]; // 100 Permissions + /// char t_uid[8]; // 108 Numerical User ID + /// char t_gid[8]; // 116 Numerical Group ID + /// char t_size[12]; // 124 Filesize + /// char t_mtime[12]; // 136 st_mtime + /// char t_chksum[8]; // 148 Checksum + /// char t_typeflag; // 156 Type of File + /// char t_linkname[100]; // 157 Target of Links + /// char t_magic[6]; // 257 "ustar" or other... + /// char t_version[2]; // 263 Version fixed to 00 + /// char t_uname[32]; // 265 User Name + /// char t_gname[32]; // 297 Group Name + /// char t_devmajor[8]; // 329 Major for devices + /// char t_devminor[8]; // 337 Minor for devices + /// char t_prefix[155]; // 345 Prefix for t_name + /// char t_mfill[12]; // 500 Filler up to 512 + /// }; + /// + public class TarHeader + { + #region Constants + + /// + /// The length of the name field in a header buffer. + /// + public const int NAMELEN = 100; + + /// + /// The length of the mode field in a header buffer. + /// + public const int MODELEN = 8; + + /// + /// The length of the user id field in a header buffer. + /// + public const int UIDLEN = 8; + + /// + /// The length of the group id field in a header buffer. + /// + public const int GIDLEN = 8; + + /// + /// The length of the checksum field in a header buffer. + /// + public const int CHKSUMLEN = 8; + + /// + /// Offset of checksum in a header buffer. + /// + public const int CHKSUMOFS = 148; + + /// + /// The length of the size field in a header buffer. + /// + public const int SIZELEN = 12; + + /// + /// The length of the magic field in a header buffer. + /// + public const int MAGICLEN = 6; + + /// + /// The length of the version field in a header buffer. + /// + public const int VERSIONLEN = 2; + + /// + /// The length of the modification time field in a header buffer. + /// + public const int MODTIMELEN = 12; + + /// + /// The length of the user name field in a header buffer. + /// + public const int UNAMELEN = 32; + + /// + /// The length of the group name field in a header buffer. + /// + public const int GNAMELEN = 32; + + /// + /// The length of the devices field in a header buffer. + /// + public const int DEVLEN = 8; + + /// + /// The length of the name prefix field in a header buffer. + /// + public const int PREFIXLEN = 155; + + // + // LF_ constants represent the "type" of an entry + // + + /// + /// The "old way" of indicating a normal file. + /// + public const byte LF_OLDNORM = 0; + + /// + /// Normal file type. + /// + public const byte LF_NORMAL = (byte)'0'; + + /// + /// Link file type. + /// + public const byte LF_LINK = (byte)'1'; + + /// + /// Symbolic link file type. + /// + public const byte LF_SYMLINK = (byte)'2'; + + /// + /// Character device file type. + /// + public const byte LF_CHR = (byte)'3'; + + /// + /// Block device file type. + /// + public const byte LF_BLK = (byte)'4'; + + /// + /// Directory file type. + /// + public const byte LF_DIR = (byte)'5'; + + /// + /// FIFO (pipe) file type. + /// + public const byte LF_FIFO = (byte)'6'; + + /// + /// Contiguous file type. + /// + public const byte LF_CONTIG = (byte)'7'; + + /// + /// Posix.1 2001 global extended header + /// + public const byte LF_GHDR = (byte)'g'; + + /// + /// Posix.1 2001 extended header + /// + public const byte LF_XHDR = (byte)'x'; + + // POSIX allows for upper case ascii type as extensions + + /// + /// Solaris access control list file type + /// + public const byte LF_ACL = (byte)'A'; + + /// + /// GNU dir dump file type + /// This is a dir entry that contains the names of files that were in the + /// dir at the time the dump was made + /// + public const byte LF_GNU_DUMPDIR = (byte)'D'; + + /// + /// Solaris Extended Attribute File + /// + public const byte LF_EXTATTR = (byte)'E'; + + /// + /// Inode (metadata only) no file content + /// + public const byte LF_META = (byte)'I'; + + /// + /// Identifies the next file on the tape as having a long link name + /// + public const byte LF_GNU_LONGLINK = (byte)'K'; + + /// + /// Identifies the next file on the tape as having a long name + /// + public const byte LF_GNU_LONGNAME = (byte)'L'; + + /// + /// Continuation of a file that began on another volume + /// + public const byte LF_GNU_MULTIVOL = (byte)'M'; + + /// + /// For storing filenames that dont fit in the main header (old GNU) + /// + public const byte LF_GNU_NAMES = (byte)'N'; + + /// + /// GNU Sparse file + /// + public const byte LF_GNU_SPARSE = (byte)'S'; + + /// + /// GNU Tape/volume header ignore on extraction + /// + public const byte LF_GNU_VOLHDR = (byte)'V'; + + /// + /// The magic tag representing a POSIX tar archive. (would be written with a trailing NULL) + /// + public const string TMAGIC = "ustar"; + + /// + /// The magic tag representing an old GNU tar archive where version is included in magic and overwrites it + /// + public const string GNU_TMAGIC = "ustar "; + + private const long timeConversionFactor = 10000000L; // 1 tick == 100 nanoseconds + private static readonly DateTime dateTime1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0); + + #endregion Constants + + #region Constructors + + /// + /// Initialise a default TarHeader instance + /// + public TarHeader() + { + Magic = TMAGIC; + Version = " "; + + Name = ""; + LinkName = ""; + + UserId = defaultUserId; + GroupId = defaultGroupId; + UserName = defaultUser; + GroupName = defaultGroupName; + Size = 0; + } + + #endregion Constructors + + #region Properties + + /// + /// Get/set the name for this tar entry. + /// + /// Thrown when attempting to set the property to null. + public string Name + { + get { return name; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + name = value; + } + } + + /// + /// Get the name of this entry. + /// + /// The entry's name. + [Obsolete("Use the Name property instead", true)] + public string GetName() + { + return name; + } + + /// + /// Get/set the entry's Unix style permission mode. + /// + public int Mode + { + get { return mode; } + set { mode = value; } + } + + /// + /// The entry's user id. + /// + /// + /// This is only directly relevant to unix systems. + /// The default is zero. + /// + public int UserId + { + get { return userId; } + set { userId = value; } + } + + /// + /// Get/set the entry's group id. + /// + /// + /// This is only directly relevant to linux/unix systems. + /// The default value is zero. + /// + public int GroupId + { + get { return groupId; } + set { groupId = value; } + } + + /// + /// Get/set the entry's size. + /// + /// Thrown when setting the size to less than zero. + public long Size + { + get { return size; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException(nameof(value), "Cannot be less than zero"); + } + size = value; + } + } + + /// + /// Get/set the entry's modification time. + /// + /// + /// The modification time is only accurate to within a second. + /// + /// Thrown when setting the date time to less than 1/1/1970. + public DateTime ModTime + { + get { return modTime; } + set + { + if (value < dateTime1970) + { + throw new ArgumentOutOfRangeException(nameof(value), "ModTime cannot be before Jan 1st 1970"); + } + modTime = new DateTime(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second); + } + } + + /// + /// Get the entry's checksum. This is only valid/updated after writing or reading an entry. + /// + public int Checksum + { + get { return checksum; } + } + + /// + /// Get value of true if the header checksum is valid, false otherwise. + /// + public bool IsChecksumValid + { + get { return isChecksumValid; } + } + + /// + /// Get/set the entry's type flag. + /// + public byte TypeFlag + { + get { return typeFlag; } + set { typeFlag = value; } + } + + /// + /// The entry's link name. + /// + /// Thrown when attempting to set LinkName to null. + public string LinkName + { + get { return linkName; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + linkName = value; + } + } + + /// + /// Get/set the entry's magic tag. + /// + /// Thrown when attempting to set Magic to null. + public string Magic + { + get { return magic; } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + magic = value; + } + } + + /// + /// The entry's version. + /// + /// Thrown when attempting to set Version to null. + public string Version + { + get + { + return version; + } + + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + version = value; + } + } + + /// + /// The entry's user name. + /// + public string UserName + { + get { return userName; } + set + { + if (value != null) + { + userName = value.Substring(0, Math.Min(UNAMELEN, value.Length)); + } + else + { + string currentUser = "user"; + if (currentUser.Length > UNAMELEN) + { + currentUser = currentUser.Substring(0, UNAMELEN); + } + userName = currentUser; + } + } + } + + /// + /// Get/set the entry's group name. + /// + /// + /// This is only directly relevant to unix systems. + /// + public string GroupName + { + get { return groupName; } + set + { + if (value == null) + { + groupName = "None"; + } + else + { + groupName = value; + } + } + } + + /// + /// Get/set the entry's major device number. + /// + public int DevMajor + { + get { return devMajor; } + set { devMajor = value; } + } + + /// + /// Get/set the entry's minor device number. + /// + public int DevMinor + { + get { return devMinor; } + set { devMinor = value; } + } + + #endregion Properties + + #region ICloneable Members + + /// + /// Create a new that is a copy of the current instance. + /// + /// A new that is a copy of the current instance. + public object Clone() + { + return this.MemberwiseClone(); + } + + #endregion ICloneable Members + + /// + /// Parse TarHeader information from a header buffer. + /// + /// + /// The tar entry header buffer to get information from. + /// + public void ParseBuffer(byte[] header) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + int offset = 0; + + name = ParseName(header, offset, NAMELEN).ToString(); + offset += NAMELEN; + + mode = (int)ParseOctal(header, offset, MODELEN); + offset += MODELEN; + + UserId = (int)ParseOctal(header, offset, UIDLEN); + offset += UIDLEN; + + GroupId = (int)ParseOctal(header, offset, GIDLEN); + offset += GIDLEN; + + Size = ParseBinaryOrOctal(header, offset, SIZELEN); + offset += SIZELEN; + + ModTime = GetDateTimeFromCTime(ParseOctal(header, offset, MODTIMELEN)); + offset += MODTIMELEN; + + checksum = (int)ParseOctal(header, offset, CHKSUMLEN); + offset += CHKSUMLEN; + + TypeFlag = header[offset++]; + + LinkName = ParseName(header, offset, NAMELEN).ToString(); + offset += NAMELEN; + + Magic = ParseName(header, offset, MAGICLEN).ToString(); + offset += MAGICLEN; + + if (Magic == "ustar") + { + Version = ParseName(header, offset, VERSIONLEN).ToString(); + offset += VERSIONLEN; + + UserName = ParseName(header, offset, UNAMELEN).ToString(); + offset += UNAMELEN; + + GroupName = ParseName(header, offset, GNAMELEN).ToString(); + offset += GNAMELEN; + + DevMajor = (int)ParseOctal(header, offset, DEVLEN); + offset += DEVLEN; + + DevMinor = (int)ParseOctal(header, offset, DEVLEN); + offset += DEVLEN; + + string prefix = ParseName(header, offset, PREFIXLEN).ToString(); + if (!string.IsNullOrEmpty(prefix)) Name = prefix + '/' + Name; + } + + isChecksumValid = Checksum == TarHeader.MakeCheckSum(header); + } + + /// + /// 'Write' header information to buffer provided, updating the check sum. + /// + /// output buffer for header information + public void WriteHeader(byte[] outBuffer) + { + if (outBuffer == null) + { + throw new ArgumentNullException(nameof(outBuffer)); + } + + int offset = 0; + + offset = GetNameBytes(Name, outBuffer, offset, NAMELEN); + offset = GetOctalBytes(mode, outBuffer, offset, MODELEN); + offset = GetOctalBytes(UserId, outBuffer, offset, UIDLEN); + offset = GetOctalBytes(GroupId, outBuffer, offset, GIDLEN); + + offset = GetBinaryOrOctalBytes(Size, outBuffer, offset, SIZELEN); + offset = GetOctalBytes(GetCTime(ModTime), outBuffer, offset, MODTIMELEN); + + int csOffset = offset; + for (int c = 0; c < CHKSUMLEN; ++c) + { + outBuffer[offset++] = (byte)' '; + } + + outBuffer[offset++] = TypeFlag; + + offset = GetNameBytes(LinkName, outBuffer, offset, NAMELEN); + offset = GetAsciiBytes(Magic, 0, outBuffer, offset, MAGICLEN); + offset = GetNameBytes(Version, outBuffer, offset, VERSIONLEN); + offset = GetNameBytes(UserName, outBuffer, offset, UNAMELEN); + offset = GetNameBytes(GroupName, outBuffer, offset, GNAMELEN); + + if ((TypeFlag == LF_CHR) || (TypeFlag == LF_BLK)) + { + offset = GetOctalBytes(DevMajor, outBuffer, offset, DEVLEN); + offset = GetOctalBytes(DevMinor, outBuffer, offset, DEVLEN); + } + + for (; offset < outBuffer.Length;) + { + outBuffer[offset++] = 0; + } + + checksum = ComputeCheckSum(outBuffer); + + GetCheckSumOctalBytes(checksum, outBuffer, csOffset, CHKSUMLEN); + isChecksumValid = true; + } + + /// + /// Get a hash code for the current object. + /// + /// A hash code for the current object. + public override int GetHashCode() + { + return Name.GetHashCode(); + } + + /// + /// Determines if this instance is equal to the specified object. + /// + /// The object to compare with. + /// true if the objects are equal, false otherwise. + public override bool Equals(object obj) + { + var localHeader = obj as TarHeader; + + bool result; + if (localHeader != null) + { + result = (name == localHeader.name) + && (mode == localHeader.mode) + && (UserId == localHeader.UserId) + && (GroupId == localHeader.GroupId) + && (Size == localHeader.Size) + && (ModTime == localHeader.ModTime) + && (Checksum == localHeader.Checksum) + && (TypeFlag == localHeader.TypeFlag) + && (LinkName == localHeader.LinkName) + && (Magic == localHeader.Magic) + && (Version == localHeader.Version) + && (UserName == localHeader.UserName) + && (GroupName == localHeader.GroupName) + && (DevMajor == localHeader.DevMajor) + && (DevMinor == localHeader.DevMinor); + } + else + { + result = false; + } + return result; + } + + /// + /// Set defaults for values used when constructing a TarHeader instance. + /// + /// Value to apply as a default for userId. + /// Value to apply as a default for userName. + /// Value to apply as a default for groupId. + /// Value to apply as a default for groupName. + static internal void SetValueDefaults(int userId, string userName, int groupId, string groupName) + { + defaultUserId = userIdAsSet = userId; + defaultUser = userNameAsSet = userName; + defaultGroupId = groupIdAsSet = groupId; + defaultGroupName = groupNameAsSet = groupName; + } + + static internal void RestoreSetValues() + { + defaultUserId = userIdAsSet; + defaultUser = userNameAsSet; + defaultGroupId = groupIdAsSet; + defaultGroupName = groupNameAsSet; + } + + // Return value that may be stored in octal or binary. Length must exceed 8. + // + static private long ParseBinaryOrOctal(byte[] header, int offset, int length) + { + if (header[offset] >= 0x80) + { + // File sizes over 8GB are stored in 8 right-justified bytes of binary indicated by setting the high-order bit of the leftmost byte of a numeric field. + long result = 0; + for (int pos = length - 8; pos < length; pos++) + { + result = result << 8 | header[offset + pos]; + } + return result; + } + return ParseOctal(header, offset, length); + } + + /// + /// Parse an octal string from a header buffer. + /// + /// The header buffer from which to parse. + /// The offset into the buffer from which to parse. + /// The number of header bytes to parse. + /// The long equivalent of the octal string. + static public long ParseOctal(byte[] header, int offset, int length) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + long result = 0; + bool stillPadding = true; + + int end = offset + length; + for (int i = offset; i < end; ++i) + { + if (header[i] == 0) + { + break; + } + + if (header[i] == (byte)' ' || header[i] == '0') + { + if (stillPadding) + { + continue; + } + + if (header[i] == (byte)' ') + { + break; + } + } + + stillPadding = false; + + result = (result << 3) + (header[i] - '0'); + } + + return result; + } + + /// + /// Parse a name from a header buffer. + /// + /// + /// The header buffer from which to parse. + /// + /// + /// The offset into the buffer from which to parse. + /// + /// + /// The number of header bytes to parse. + /// + /// + /// The name parsed. + /// + static public StringBuilder ParseName(byte[] header, int offset, int length) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset), "Cannot be less than zero"); + } + + if (length < 0) + { + throw new ArgumentOutOfRangeException(nameof(length), "Cannot be less than zero"); + } + + if (offset + length > header.Length) + { + throw new ArgumentException("Exceeds header size", nameof(length)); + } + + var result = new StringBuilder(length); + + for (int i = offset; i < offset + length; ++i) + { + if (header[i] == 0) + { + break; + } + result.Append((char)header[i]); + } + + return result; + } + + /// + /// Add name to the buffer as a collection of bytes + /// + /// The name to add + /// The offset of the first character + /// The buffer to add to + /// The index of the first byte to add + /// The number of characters/bytes to add + /// The next free index in the + public static int GetNameBytes(StringBuilder name, int nameOffset, byte[] buffer, int bufferOffset, int length) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + return GetNameBytes(name.ToString(), nameOffset, buffer, bufferOffset, length); + } + + /// + /// Add name to the buffer as a collection of bytes + /// + /// The name to add + /// The offset of the first character + /// The buffer to add to + /// The index of the first byte to add + /// The number of characters/bytes to add + /// The next free index in the + public static int GetNameBytes(string name, int nameOffset, byte[] buffer, int bufferOffset, int length) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + int i; + + for (i = 0; i < length && nameOffset + i < name.Length; ++i) + { + buffer[bufferOffset + i] = (byte)name[nameOffset + i]; + } + + for (; i < length; ++i) + { + buffer[bufferOffset + i] = 0; + } + + return bufferOffset + length; + } + + /// + /// Add an entry name to the buffer + /// + /// + /// The name to add + /// + /// + /// The buffer to add to + /// + /// + /// The offset into the buffer from which to start adding + /// + /// + /// The number of header bytes to add + /// + /// + /// The index of the next free byte in the buffer + /// + public static int GetNameBytes(StringBuilder name, byte[] buffer, int offset, int length) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + return GetNameBytes(name.ToString(), 0, buffer, offset, length); + } + + /// + /// Add an entry name to the buffer + /// + /// The name to add + /// The buffer to add to + /// The offset into the buffer from which to start adding + /// The number of header bytes to add + /// The index of the next free byte in the buffer + public static int GetNameBytes(string name, byte[] buffer, int offset, int length) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + return GetNameBytes(name, 0, buffer, offset, length); + } + + /// + /// Add a string to a buffer as a collection of ascii bytes. + /// + /// The string to add + /// The offset of the first character to add. + /// The buffer to add to. + /// The offset to start adding at. + /// The number of ascii characters to add. + /// The next free index in the buffer. + public static int GetAsciiBytes(string toAdd, int nameOffset, byte[] buffer, int bufferOffset, int length) + { + if (toAdd == null) + { + throw new ArgumentNullException(nameof(toAdd)); + } + + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + int i; + for (i = 0; i < length && nameOffset + i < toAdd.Length; ++i) + { + buffer[bufferOffset + i] = (byte)toAdd[nameOffset + i]; + } + // If length is beyond the toAdd string length (which is OK by the prev loop condition), eg if a field has fixed length and the string is shorter, make sure all of the extra chars are written as NULLs, so that the reader func would ignore them and get back the original string + for (; i < length; ++i) + buffer[bufferOffset + i] = 0; + return bufferOffset + length; + } + + /// + /// Put an octal representation of a value into a buffer + /// + /// + /// the value to be converted to octal + /// + /// + /// buffer to store the octal string + /// + /// + /// The offset into the buffer where the value starts + /// + /// + /// The length of the octal string to create + /// + /// + /// The offset of the character next byte after the octal string + /// + public static int GetOctalBytes(long value, byte[] buffer, int offset, int length) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + int localIndex = length - 1; + + // Either a space or null is valid here. We use NULL as per GNUTar + buffer[offset + localIndex] = 0; + --localIndex; + + if (value > 0) + { + for (long v = value; (localIndex >= 0) && (v > 0); --localIndex) + { + buffer[offset + localIndex] = (byte)((byte)'0' + (byte)(v & 7)); + v >>= 3; + } + } + + for (; localIndex >= 0; --localIndex) + { + buffer[offset + localIndex] = (byte)'0'; + } + + return offset + length; + } + + /// + /// Put an octal or binary representation of a value into a buffer + /// + /// Value to be convert to octal + /// The buffer to update + /// The offset into the buffer to store the value + /// The length of the octal string. Must be 12. + /// Index of next byte + private static int GetBinaryOrOctalBytes(long value, byte[] buffer, int offset, int length) + { + if (value > 0x1FFFFFFFF) + { // Octal 77777777777 (11 digits) + // Put value as binary, right-justified into the buffer. Set high order bit of left-most byte. + for (int pos = length - 1; pos > 0; pos--) + { + buffer[offset + pos] = (byte)value; + value = value >> 8; + } + buffer[offset] = 0x80; + return offset + length; + } + return GetOctalBytes(value, buffer, offset, length); + } + + /// + /// Add the checksum integer to header buffer. + /// + /// + /// The header buffer to set the checksum for + /// The offset into the buffer for the checksum + /// The number of header bytes to update. + /// It's formatted differently from the other fields: it has 6 digits, a + /// null, then a space -- rather than digits, a space, then a null. + /// The final space is already there, from checksumming + /// + /// The modified buffer offset + private static void GetCheckSumOctalBytes(long value, byte[] buffer, int offset, int length) + { + GetOctalBytes(value, buffer, offset, length - 1); + } + + /// + /// Compute the checksum for a tar entry header. + /// The checksum field must be all spaces prior to this happening + /// + /// The tar entry's header buffer. + /// The computed checksum. + private static int ComputeCheckSum(byte[] buffer) + { + int sum = 0; + for (int i = 0; i < buffer.Length; ++i) + { + sum += buffer[i]; + } + return sum; + } + + /// + /// Make a checksum for a tar entry ignoring the checksum contents. + /// + /// The tar entry's header buffer. + /// The checksum for the buffer + private static int MakeCheckSum(byte[] buffer) + { + int sum = 0; + for (int i = 0; i < CHKSUMOFS; ++i) + { + sum += buffer[i]; + } + + for (int i = 0; i < CHKSUMLEN; ++i) + { + sum += (byte)' '; + } + + for (int i = CHKSUMOFS + CHKSUMLEN; i < buffer.Length; ++i) + { + sum += buffer[i]; + } + return sum; + } + + private static int GetCTime(DateTime dateTime) + { + return unchecked((int)((dateTime.Ticks - dateTime1970.Ticks) / timeConversionFactor)); + } + + private static DateTime GetDateTimeFromCTime(long ticks) + { + DateTime result; + + try + { + result = new DateTime(dateTime1970.Ticks + ticks * timeConversionFactor); + } + catch (ArgumentOutOfRangeException) + { + result = dateTime1970; + } + return result; + } + + #region Instance Fields + + private string name; + private int mode; + private int userId; + private int groupId; + private long size; + private DateTime modTime; + private int checksum; + private bool isChecksumValid; + private byte typeFlag; + private string linkName; + private string magic; + private string version; + private string userName; + private string groupName; + private int devMajor; + private int devMinor; + + #endregion Instance Fields + + #region Class Fields + + // Values used during recursive operations. + static internal int userIdAsSet; + + static internal int groupIdAsSet; + static internal string userNameAsSet; + static internal string groupNameAsSet = "None"; + + static internal int defaultUserId; + static internal int defaultGroupId; + static internal string defaultGroupName = "None"; + static internal string defaultUser; + + #endregion Class Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs.meta new file mode 100644 index 000000000..7cfe7a45e --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarHeader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f632a814155e524bb0afe49b5d2b5c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs new file mode 100644 index 000000000..3c0cd96cd --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs @@ -0,0 +1,726 @@ +using System; +using System.IO; +using System.Text; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// The TarInputStream reads a UNIX tar archive as an InputStream. + /// methods are provided to position at each successive entry in + /// the archive, and the read each entry as a normal input stream + /// using read(). + /// + public class TarInputStream : Stream + { + #region Constructors + + /// + /// Construct a TarInputStream with default block factor + /// + /// stream to source data from + public TarInputStream(Stream inputStream) + : this(inputStream, TarBuffer.DefaultBlockFactor) + { + } + + /// + /// Construct a TarInputStream with user specified block factor + /// + /// stream to source data from + /// block factor to apply to archive + public TarInputStream(Stream inputStream, int blockFactor) + { + this.inputStream = inputStream; + tarBuffer = TarBuffer.CreateInputTarBuffer(inputStream, blockFactor); + } + + #endregion Constructors + + /// + /// Gets or sets a flag indicating ownership of underlying stream. + /// When the flag is true will close the underlying stream also. + /// + /// The default value is true. + public bool IsStreamOwner + { + get { return tarBuffer.IsStreamOwner; } + set { tarBuffer.IsStreamOwner = value; } + } + + #region Stream Overrides + + /// + /// Gets a value indicating whether the current stream supports reading + /// + public override bool CanRead + { + get + { + return inputStream.CanRead; + } + } + + /// + /// Gets a value indicating whether the current stream supports seeking + /// This property always returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Gets a value indicating if the stream supports writing. + /// This property always returns false. + /// + public override bool CanWrite + { + get + { + return false; + } + } + + /// + /// The length in bytes of the stream + /// + public override long Length + { + get + { + return inputStream.Length; + } + } + + /// + /// Gets or sets the position within the stream. + /// Setting the Position is not supported and throws a NotSupportedExceptionNotSupportedException + /// + /// Any attempt to set position + public override long Position + { + get + { + return inputStream.Position; + } + set + { + throw new NotSupportedException("TarInputStream Seek not supported"); + } + } + + /// + /// Flushes the baseInputStream + /// + public override void Flush() + { + inputStream.Flush(); + } + + /// + /// Set the streams position. This operation is not supported and will throw a NotSupportedException + /// + /// The offset relative to the origin to seek to. + /// The to start seeking from. + /// The new position in the stream. + /// Any access + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException("TarInputStream Seek not supported"); + } + + /// + /// Sets the length of the stream + /// This operation is not supported and will throw a NotSupportedException + /// + /// The new stream length. + /// Any access + public override void SetLength(long value) + { + throw new NotSupportedException("TarInputStream SetLength not supported"); + } + + /// + /// Writes a block of bytes to this stream using data from a buffer. + /// This operation is not supported and will throw a NotSupportedException + /// + /// The buffer containing bytes to write. + /// The offset in the buffer of the frist byte to write. + /// The number of bytes to write. + /// Any access + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException("TarInputStream Write not supported"); + } + + /// + /// Writes a byte to the current position in the file stream. + /// This operation is not supported and will throw a NotSupportedException + /// + /// The byte value to write. + /// Any access + public override void WriteByte(byte value) + { + throw new NotSupportedException("TarInputStream WriteByte not supported"); + } + + /// + /// Reads a byte from the current tar archive entry. + /// + /// A byte cast to an int; -1 if the at the end of the stream. + public override int ReadByte() + { + byte[] oneByteBuffer = new byte[1]; + int num = Read(oneByteBuffer, 0, 1); + if (num <= 0) + { + // return -1 to indicate that no byte was read. + return -1; + } + return oneByteBuffer[0]; + } + + /// + /// Reads bytes from the current tar archive entry. + /// + /// This method is aware of the boundaries of the current + /// entry in the archive and will deal with them appropriately + /// + /// + /// The buffer into which to place bytes read. + /// + /// + /// The offset at which to place bytes read. + /// + /// + /// The number of bytes to read. + /// + /// + /// The number of bytes read, or 0 at end of stream/EOF. + /// + public override int Read(byte[] buffer, int offset, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + int totalRead = 0; + + if (entryOffset >= entrySize) + { + return 0; + } + + long numToRead = count; + + if ((numToRead + entryOffset) > entrySize) + { + numToRead = entrySize - entryOffset; + } + + if (readBuffer != null) + { + int sz = (numToRead > readBuffer.Length) ? readBuffer.Length : (int)numToRead; + + Array.Copy(readBuffer, 0, buffer, offset, sz); + + if (sz >= readBuffer.Length) + { + readBuffer = null; + } + else + { + int newLen = readBuffer.Length - sz; + byte[] newBuf = new byte[newLen]; + Array.Copy(readBuffer, sz, newBuf, 0, newLen); + readBuffer = newBuf; + } + + totalRead += sz; + numToRead -= sz; + offset += sz; + } + + while (numToRead > 0) + { + byte[] rec = tarBuffer.ReadBlock(); + if (rec == null) + { + // Unexpected EOF! + throw new TarException("unexpected EOF with " + numToRead + " bytes unread"); + } + + var sz = (int)numToRead; + int recLen = rec.Length; + + if (recLen > sz) + { + Array.Copy(rec, 0, buffer, offset, sz); + readBuffer = new byte[recLen - sz]; + Array.Copy(rec, sz, readBuffer, 0, recLen - sz); + } + else + { + sz = recLen; + Array.Copy(rec, 0, buffer, offset, recLen); + } + + totalRead += sz; + numToRead -= sz; + offset += sz; + } + + entryOffset += totalRead; + + return totalRead; + } + + /// + /// Closes this stream. Calls the TarBuffer's close() method. + /// The underlying stream is closed by the TarBuffer. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + tarBuffer.Close(); + } + } + + #endregion Stream Overrides + + /// + /// Set the entry factory for this instance. + /// + /// The factory for creating new entries + public void SetEntryFactory(IEntryFactory factory) + { + entryFactory = factory; + } + + /// + /// Get the record size being used by this stream's TarBuffer. + /// + public int RecordSize + { + get { return tarBuffer.RecordSize; } + } + + /// + /// Get the record size being used by this stream's TarBuffer. + /// + /// + /// TarBuffer record size. + /// + [Obsolete("Use RecordSize property instead")] + public int GetRecordSize() + { + return tarBuffer.RecordSize; + } + + /// + /// Get the available data that can be read from the current + /// entry in the archive. This does not indicate how much data + /// is left in the entire archive, only in the current entry. + /// This value is determined from the entry's size header field + /// and the amount of data already read from the current entry. + /// + /// + /// The number of available bytes for the current entry. + /// + public long Available + { + get + { + return entrySize - entryOffset; + } + } + + /// + /// Skip bytes in the input buffer. This skips bytes in the + /// current entry's data, not the entire archive, and will + /// stop at the end of the current entry's data if the number + /// to skip extends beyond that point. + /// + /// + /// The number of bytes to skip. + /// + public void Skip(long skipCount) + { + // TODO: REVIEW efficiency of TarInputStream.Skip + // This is horribly inefficient, but it ensures that we + // properly skip over bytes via the TarBuffer... + // + byte[] skipBuf = new byte[8 * 1024]; + + for (long num = skipCount; num > 0;) + { + int toRead = num > skipBuf.Length ? skipBuf.Length : (int)num; + int numRead = Read(skipBuf, 0, toRead); + + if (numRead == -1) + { + break; + } + + num -= numRead; + } + } + + /// + /// Return a value of true if marking is supported; false otherwise. + /// + /// Currently marking is not supported, the return value is always false. + public bool IsMarkSupported + { + get + { + return false; + } + } + + /// + /// Since we do not support marking just yet, we do nothing. + /// + /// + /// The limit to mark. + /// + public void Mark(int markLimit) + { + } + + /// + /// Since we do not support marking just yet, we do nothing. + /// + public void Reset() + { + } + + /// + /// Get the next entry in this tar archive. This will skip + /// over any remaining data in the current entry, if there + /// is one, and place the input stream at the header of the + /// next entry, and read the header and instantiate a new + /// TarEntry from the header bytes and return that entry. + /// If there are no more entries in the archive, null will + /// be returned to indicate that the end of the archive has + /// been reached. + /// + /// + /// The next TarEntry in the archive, or null. + /// + public TarEntry GetNextEntry() + { + if (hasHitEOF) + { + return null; + } + + if (currentEntry != null) + { + SkipToNextEntry(); + } + + byte[] headerBuf = tarBuffer.ReadBlock(); + + if (headerBuf == null) + { + hasHitEOF = true; + } + else if (TarBuffer.IsEndOfArchiveBlock(headerBuf)) + { + hasHitEOF = true; + + // Read the second zero-filled block + tarBuffer.ReadBlock(); + } + else + { + hasHitEOF = false; + } + + if (hasHitEOF) + { + currentEntry = null; + } + else + { + try + { + var header = new TarHeader(); + header.ParseBuffer(headerBuf); + if (!header.IsChecksumValid) + { + throw new TarException("Header checksum is invalid"); + } + this.entryOffset = 0; + this.entrySize = header.Size; + + StringBuilder longName = null; + + if (header.TypeFlag == TarHeader.LF_GNU_LONGNAME) + { + byte[] nameBuffer = new byte[TarBuffer.BlockSize]; + long numToRead = this.entrySize; + + longName = new StringBuilder(); + + while (numToRead > 0) + { + int numRead = this.Read(nameBuffer, 0, (numToRead > nameBuffer.Length ? nameBuffer.Length : (int)numToRead)); + + if (numRead == -1) + { + throw new InvalidHeaderException("Failed to read long name entry"); + } + + longName.Append(TarHeader.ParseName(nameBuffer, 0, numRead).ToString()); + numToRead -= numRead; + } + + SkipToNextEntry(); + headerBuf = this.tarBuffer.ReadBlock(); + } + else if (header.TypeFlag == TarHeader.LF_GHDR) + { // POSIX global extended header + // Ignore things we dont understand completely for now + SkipToNextEntry(); + headerBuf = this.tarBuffer.ReadBlock(); + } + else if (header.TypeFlag == TarHeader.LF_XHDR) + { // POSIX extended header + byte[] nameBuffer = new byte[TarBuffer.BlockSize]; + long numToRead = this.entrySize; + + var xhr = new TarExtendedHeaderReader(); + + while (numToRead > 0) + { + int numRead = this.Read(nameBuffer, 0, (numToRead > nameBuffer.Length ? nameBuffer.Length : (int)numToRead)); + + if (numRead == -1) + { + throw new InvalidHeaderException("Failed to read long name entry"); + } + + xhr.Read(nameBuffer, numRead); + numToRead -= numRead; + } + + if (xhr.Headers.TryGetValue("path", out string name)) + { + longName = new StringBuilder(name); + } + + SkipToNextEntry(); + headerBuf = this.tarBuffer.ReadBlock(); + } + else if (header.TypeFlag == TarHeader.LF_GNU_VOLHDR) + { + // TODO: could show volume name when verbose + SkipToNextEntry(); + headerBuf = this.tarBuffer.ReadBlock(); + } + else if (header.TypeFlag != TarHeader.LF_NORMAL && + header.TypeFlag != TarHeader.LF_OLDNORM && + header.TypeFlag != TarHeader.LF_LINK && + header.TypeFlag != TarHeader.LF_SYMLINK && + header.TypeFlag != TarHeader.LF_DIR) + { + // Ignore things we dont understand completely for now + SkipToNextEntry(); + headerBuf = tarBuffer.ReadBlock(); + } + + if (entryFactory == null) + { + currentEntry = new TarEntry(headerBuf); + if (longName != null) + { + currentEntry.Name = longName.ToString(); + } + } + else + { + currentEntry = entryFactory.CreateEntry(headerBuf); + } + + // Magic was checked here for 'ustar' but there are multiple valid possibilities + // so this is not done anymore. + + entryOffset = 0; + + // TODO: Review How do we resolve this discrepancy?! + entrySize = this.currentEntry.Size; + } + catch (InvalidHeaderException ex) + { + entrySize = 0; + entryOffset = 0; + currentEntry = null; + string errorText = string.Format("Bad header in record {0} block {1} {2}", + tarBuffer.CurrentRecord, tarBuffer.CurrentBlock, ex.Message); + throw new InvalidHeaderException(errorText); + } + } + return currentEntry; + } + + /// + /// Copies the contents of the current tar archive entry directly into + /// an output stream. + /// + /// + /// The OutputStream into which to write the entry's data. + /// + public void CopyEntryContents(Stream outputStream) + { + byte[] tempBuffer = new byte[32 * 1024]; + + while (true) + { + int numRead = Read(tempBuffer, 0, tempBuffer.Length); + if (numRead <= 0) + { + break; + } + outputStream.Write(tempBuffer, 0, numRead); + } + } + + private void SkipToNextEntry() + { + long numToSkip = entrySize - entryOffset; + + if (numToSkip > 0) + { + Skip(numToSkip); + } + + readBuffer = null; + } + + /// + /// This interface is provided, along with the method , to allow + /// the programmer to have their own subclass instantiated for the + /// entries return from . + /// + public interface IEntryFactory + { + /// + /// Create an entry based on name alone + /// + /// + /// Name of the new EntryPointNotFoundException to create + /// + /// created TarEntry or descendant class + TarEntry CreateEntry(string name); + + /// + /// Create an instance based on an actual file + /// + /// + /// Name of file to represent in the entry + /// + /// + /// Created TarEntry or descendant class + /// + TarEntry CreateEntryFromFile(string fileName); + + /// + /// Create a tar entry based on the header information passed + /// + /// + /// Buffer containing header information to create an an entry from. + /// + /// + /// Created TarEntry or descendant class + /// + TarEntry CreateEntry(byte[] headerBuffer); + } + + /// + /// Standard entry factory class creating instances of the class TarEntry + /// + public class EntryFactoryAdapter : IEntryFactory + { + /// + /// Create a based on named + /// + /// The name to use for the entry + /// A new + public TarEntry CreateEntry(string name) + { + return TarEntry.CreateTarEntry(name); + } + + /// + /// Create a tar entry with details obtained from file + /// + /// The name of the file to retrieve details from. + /// A new + public TarEntry CreateEntryFromFile(string fileName) + { + return TarEntry.CreateEntryFromFile(fileName); + } + + /// + /// Create an entry based on details in header + /// + /// The buffer containing entry details. + /// A new + public TarEntry CreateEntry(byte[] headerBuffer) + { + return new TarEntry(headerBuffer); + } + } + + #region Instance Fields + + /// + /// Flag set when last block has been read + /// + protected bool hasHitEOF; + + /// + /// Size of this entry as recorded in header + /// + protected long entrySize; + + /// + /// Number of bytes read for this entry so far + /// + protected long entryOffset; + + /// + /// Buffer used with calls to Read() + /// + protected byte[] readBuffer; + + /// + /// Working buffer + /// + protected TarBuffer tarBuffer; + + /// + /// Current entry being read + /// + private TarEntry currentEntry; + + /// + /// Factory used to create TarEntry or descendant class instance + /// + protected IEntryFactory entryFactory; + + /// + /// Stream used as the source of input data. + /// + private readonly Stream inputStream; + + #endregion Instance Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs.meta new file mode 100644 index 000000000..ae4647375 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarInputStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d59bba1407c356f46b5abb94299ecdb8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs new file mode 100644 index 000000000..cf4663d8c --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs @@ -0,0 +1,480 @@ +using System; +using System.IO; + +namespace ICSharpCode.SharpZipLib.Tar +{ + /// + /// The TarOutputStream writes a UNIX tar archive as an OutputStream. + /// Methods are provided to put entries, and then write their contents + /// by writing to this stream using write(). + /// + /// public + public class TarOutputStream : Stream + { + #region Constructors + + /// + /// Construct TarOutputStream using default block factor + /// + /// stream to write to + public TarOutputStream(Stream outputStream) + : this(outputStream, TarBuffer.DefaultBlockFactor) + { + } + + /// + /// Construct TarOutputStream with user specified block factor + /// + /// stream to write to + /// blocking factor + public TarOutputStream(Stream outputStream, int blockFactor) + { + if (outputStream == null) + { + throw new ArgumentNullException(nameof(outputStream)); + } + + this.outputStream = outputStream; + buffer = TarBuffer.CreateOutputTarBuffer(outputStream, blockFactor); + + assemblyBuffer = new byte[TarBuffer.BlockSize]; + blockBuffer = new byte[TarBuffer.BlockSize]; + } + + #endregion Constructors + + /// + /// Gets or sets a flag indicating ownership of underlying stream. + /// When the flag is true will close the underlying stream also. + /// + /// The default value is true. + public bool IsStreamOwner + { + get { return buffer.IsStreamOwner; } + set { buffer.IsStreamOwner = value; } + } + + /// + /// true if the stream supports reading; otherwise, false. + /// + public override bool CanRead + { + get + { + return outputStream.CanRead; + } + } + + /// + /// true if the stream supports seeking; otherwise, false. + /// + public override bool CanSeek + { + get + { + return outputStream.CanSeek; + } + } + + /// + /// true if stream supports writing; otherwise, false. + /// + public override bool CanWrite + { + get + { + return outputStream.CanWrite; + } + } + + /// + /// length of stream in bytes + /// + public override long Length + { + get + { + return outputStream.Length; + } + } + + /// + /// gets or sets the position within the current stream. + /// + public override long Position + { + get + { + return outputStream.Position; + } + set + { + outputStream.Position = value; + } + } + + /// + /// set the position within the current stream + /// + /// The offset relative to the to seek to + /// The to seek from. + /// The new position in the stream. + public override long Seek(long offset, SeekOrigin origin) + { + return outputStream.Seek(offset, origin); + } + + /// + /// Set the length of the current stream + /// + /// The new stream length. + public override void SetLength(long value) + { + outputStream.SetLength(value); + } + + /// + /// Read a byte from the stream and advance the position within the stream + /// by one byte or returns -1 if at the end of the stream. + /// + /// The byte value or -1 if at end of stream + public override int ReadByte() + { + return outputStream.ReadByte(); + } + + /// + /// read bytes from the current stream and advance the position within the + /// stream by the number of bytes read. + /// + /// The buffer to store read bytes in. + /// The index into the buffer to being storing bytes at. + /// The desired number of bytes to read. + /// The total number of bytes read, or zero if at the end of the stream. + /// The number of bytes may be less than the count + /// requested if data is not avialable. + public override int Read(byte[] buffer, int offset, int count) + { + return outputStream.Read(buffer, offset, count); + } + + /// + /// All buffered data is written to destination + /// + public override void Flush() + { + outputStream.Flush(); + } + + /// + /// Ends the TAR archive without closing the underlying OutputStream. + /// The result is that the EOF block of nulls is written. + /// + public void Finish() + { + if (IsEntryOpen) + { + CloseEntry(); + } + WriteEofBlock(); + } + + /// + /// Ends the TAR archive and closes the underlying OutputStream. + /// + /// This means that Finish() is called followed by calling the + /// TarBuffer's Close(). + protected override void Dispose(bool disposing) + { + if (!isClosed) + { + isClosed = true; + Finish(); + buffer.Close(); + } + } + + /// + /// Get the record size being used by this stream's TarBuffer. + /// + public int RecordSize + { + get { return buffer.RecordSize; } + } + + /// + /// Get the record size being used by this stream's TarBuffer. + /// + /// + /// The TarBuffer record size. + /// + [Obsolete("Use RecordSize property instead")] + public int GetRecordSize() + { + return buffer.RecordSize; + } + + /// + /// Get a value indicating wether an entry is open, requiring more data to be written. + /// + private bool IsEntryOpen + { + get { return (currBytes < currSize); } + } + + /// + /// Put an entry on the output stream. This writes the entry's + /// header and positions the output stream for writing + /// the contents of the entry. Once this method is called, the + /// stream is ready for calls to write() to write the entry's + /// contents. Once the contents are written, closeEntry() + /// MUST be called to ensure that all buffered data + /// is completely written to the output stream. + /// + /// + /// The TarEntry to be written to the archive. + /// + public void PutNextEntry(TarEntry entry) + { + if (entry == null) + { + throw new ArgumentNullException(nameof(entry)); + } + + if (entry.TarHeader.Name.Length > TarHeader.NAMELEN) + { + var longHeader = new TarHeader(); + longHeader.TypeFlag = TarHeader.LF_GNU_LONGNAME; + longHeader.Name = longHeader.Name + "././@LongLink"; + longHeader.Mode = 420;//644 by default + longHeader.UserId = entry.UserId; + longHeader.GroupId = entry.GroupId; + longHeader.GroupName = entry.GroupName; + longHeader.UserName = entry.UserName; + longHeader.LinkName = ""; + longHeader.Size = entry.TarHeader.Name.Length + 1; // Plus one to avoid dropping last char + + longHeader.WriteHeader(blockBuffer); + buffer.WriteBlock(blockBuffer); // Add special long filename header block + + int nameCharIndex = 0; + + while (nameCharIndex < entry.TarHeader.Name.Length + 1 /* we've allocated one for the null char, now we must make sure it gets written out */) + { + Array.Clear(blockBuffer, 0, blockBuffer.Length); + TarHeader.GetAsciiBytes(entry.TarHeader.Name, nameCharIndex, this.blockBuffer, 0, TarBuffer.BlockSize); // This func handles OK the extra char out of string length + nameCharIndex += TarBuffer.BlockSize; + buffer.WriteBlock(blockBuffer); + } + } + + entry.WriteEntryHeader(blockBuffer); + buffer.WriteBlock(blockBuffer); + + currBytes = 0; + + currSize = entry.IsDirectory ? 0 : entry.Size; + } + + /// + /// Close an entry. This method MUST be called for all file + /// entries that contain data. The reason is that we must + /// buffer data written to the stream in order to satisfy + /// the buffer's block based writes. Thus, there may be + /// data fragments still being assembled that must be written + /// to the output stream before this entry is closed and the + /// next entry written. + /// + public void CloseEntry() + { + if (assemblyBufferLength > 0) + { + Array.Clear(assemblyBuffer, assemblyBufferLength, assemblyBuffer.Length - assemblyBufferLength); + + buffer.WriteBlock(assemblyBuffer); + + currBytes += assemblyBufferLength; + assemblyBufferLength = 0; + } + + if (currBytes < currSize) + { + string errorText = string.Format( + "Entry closed at '{0}' before the '{1}' bytes specified in the header were written", + currBytes, currSize); + throw new TarException(errorText); + } + } + + /// + /// Writes a byte to the current tar archive entry. + /// This method simply calls Write(byte[], int, int). + /// + /// + /// The byte to be written. + /// + public override void WriteByte(byte value) + { + Write(new byte[] { value }, 0, 1); + } + + /// + /// Writes bytes to the current tar archive entry. This method + /// is aware of the current entry and will throw an exception if + /// you attempt to write bytes past the length specified for the + /// current entry. The method is also (painfully) aware of the + /// record buffering required by TarBuffer, and manages buffers + /// that are not a multiple of recordsize in length, including + /// assembling records from small buffers. + /// + /// + /// The buffer to write to the archive. + /// + /// + /// The offset in the buffer from which to get bytes. + /// + /// + /// The number of bytes to write. + /// + public override void Write(byte[] buffer, int offset, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset), "Cannot be negative"); + } + + if (buffer.Length - offset < count) + { + throw new ArgumentException("offset and count combination is invalid"); + } + + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count), "Cannot be negative"); + } + + if ((currBytes + count) > currSize) + { + string errorText = string.Format("request to write '{0}' bytes exceeds size in header of '{1}' bytes", + count, this.currSize); + throw new ArgumentOutOfRangeException(nameof(count), errorText); + } + + // + // We have to deal with assembly!!! + // The programmer can be writing little 32 byte chunks for all + // we know, and we must assemble complete blocks for writing. + // TODO REVIEW Maybe this should be in TarBuffer? Could that help to + // eliminate some of the buffer copying. + // + if (assemblyBufferLength > 0) + { + if ((assemblyBufferLength + count) >= blockBuffer.Length) + { + int aLen = blockBuffer.Length - assemblyBufferLength; + + Array.Copy(assemblyBuffer, 0, blockBuffer, 0, assemblyBufferLength); + Array.Copy(buffer, offset, blockBuffer, assemblyBufferLength, aLen); + + this.buffer.WriteBlock(blockBuffer); + + currBytes += blockBuffer.Length; + + offset += aLen; + count -= aLen; + + assemblyBufferLength = 0; + } + else + { + Array.Copy(buffer, offset, assemblyBuffer, assemblyBufferLength, count); + offset += count; + assemblyBufferLength += count; + count -= count; + } + } + + // + // When we get here we have EITHER: + // o An empty "assembly" buffer. + // o No bytes to write (count == 0) + // + while (count > 0) + { + if (count < blockBuffer.Length) + { + Array.Copy(buffer, offset, assemblyBuffer, assemblyBufferLength, count); + assemblyBufferLength += count; + break; + } + + this.buffer.WriteBlock(buffer, offset); + + int bufferLength = blockBuffer.Length; + currBytes += bufferLength; + count -= bufferLength; + offset += bufferLength; + } + } + + /// + /// Write an EOF (end of archive) block to the tar archive. + /// The end of the archive is indicated by two blocks consisting entirely of zero bytes. + /// + private void WriteEofBlock() + { + Array.Clear(blockBuffer, 0, blockBuffer.Length); + buffer.WriteBlock(blockBuffer); + buffer.WriteBlock(blockBuffer); + } + + #region Instance Fields + + /// + /// bytes written for this entry so far + /// + private long currBytes; + + /// + /// current 'Assembly' buffer length + /// + private int assemblyBufferLength; + + /// + /// Flag indicating wether this instance has been closed or not. + /// + private bool isClosed; + + /// + /// Size for the current entry + /// + protected long currSize; + + /// + /// single block working buffer + /// + protected byte[] blockBuffer; + + /// + /// 'Assembly' buffer used to assemble data before writing + /// + protected byte[] assemblyBuffer; + + /// + /// TarBuffer used to provide correct blocking factor + /// + protected TarBuffer buffer; + + /// + /// the destination stream for the archive contents + /// + protected Stream outputStream; + + #endregion Instance Fields + } +} diff --git a/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs.meta b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs.meta new file mode 100644 index 000000000..a47e0c336 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/SharpZipLib/Tar/TarOutputStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cd929355f2c636d46a67e265b6e28a89 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/Threads.meta b/UltraStar Play/Assets/Plugins/Threads.meta new file mode 100644 index 000000000..78700ebb4 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/Threads.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94d38c5517c5a3949b925ab45d2bf26a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/Threads/LICENSE b/UltraStar Play/Assets/Plugins/Threads/LICENSE new file mode 100644 index 000000000..be39f1352 --- /dev/null +++ b/UltraStar Play/Assets/Plugins/Threads/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Ansis Malinš + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/UltraStar Play/Assets/Plugins/Threads/LICENSE.meta b/UltraStar Play/Assets/Plugins/Threads/LICENSE.meta new file mode 100644 index 000000000..f44ad5e3b --- /dev/null +++ b/UltraStar Play/Assets/Plugins/Threads/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f886b57741601f04789048122ac6871d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs b/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs new file mode 100644 index 000000000..a54dc13ae --- /dev/null +++ b/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using UnityEngine; + +// Unity's implementation of ThreadPool allocates 1 KB per call to QueueUserWorkItem, so we have to +// roll our own. + +public static class ThreadPool +{ + private static readonly Queue<(Action, PoolHandle)> queue; + private static int waiterCount; + private static readonly EventWaitHandle waitHandle; + + static ThreadPool() + { + queue = new Queue<(Action, PoolHandle)>(); + waiterCount = Mathf.Max(SystemInfo.processorCount - 1, 1); + waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); + for (int i = 0; i < waiterCount; i++) + { + var thread = new Thread(ThreadProc); + thread.IsBackground = true; + thread.Start(); + } + } + + public static PoolHandle QueueUserWorkItem(Action callBack) + { + if (callBack == null) + throw new ArgumentNullException("callBack"); + PoolHandle handle = new PoolHandle(); + lock (queue) + queue.Enqueue((callBack, handle)); + if (waiterCount > 0) + waitHandle.Set(); + return handle; + } + + private static void ThreadProc() + { + while (true) + { + waitHandle.WaitOne(); + Interlocked.Decrement(ref waiterCount); + while (true) + { + (Action, PoolHandle) callBack; + lock (queue) + { + if (queue.Count == 0) + break; + callBack = queue.Dequeue(); + } + callBack.Item1(callBack.Item2); + } + Interlocked.Increment(ref waiterCount); + } + } + + public class PoolHandle + { + public bool done; + } +} \ No newline at end of file diff --git a/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs.meta b/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs.meta new file mode 100644 index 000000000..e32991eab --- /dev/null +++ b/UltraStar Play/Assets/Plugins/Threads/ThreadPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b10184d196e7f474690b6b9691ea1ea2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Scenes/Options/ContentOptions.meta b/UltraStar Play/Assets/Scenes/Options/ContentOptions.meta new file mode 100644 index 000000000..364c0eff4 --- /dev/null +++ b/UltraStar Play/Assets/Scenes/Options/ContentOptions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca3f3ab95b4ce33449c8076c9b71b17b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity new file mode 100644 index 000000000..836b8a76a --- /dev/null +++ b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity @@ -0,0 +1,2386 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!114 &44401268 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 732203885253972898, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + m_PrefabInstance: {fileID: 332229249} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc66311bf99e9314687631472fc2ad54, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &114326422 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 114326423} + - component: {fileID: 114326425} + - component: {fileID: 114326424} + m_Layer: 5 + m_Name: LogText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &114326423 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114326422} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1405840086} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.013115514, y: 0.049829483} + m_AnchorMax: {x: 0.97988456, y: 0.9620001} + m_AnchoredPosition: {x: -2, y: -1.5} + m_SizeDelta: {x: 0, y: 3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &114326424 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114326422} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 12 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '-' +--- !u!222 &114326425 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 114326422} + m_CullTransparentMesh: 0 +--- !u!1 &249103210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 249103214} + - component: {fileID: 249103213} + - component: {fileID: 249103212} + - component: {fileID: 249103211} + m_Layer: 5 + m_Name: Canvas + m_TagString: Canvas + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &249103211 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249103210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &249103212 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249103210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 +--- !u!223 &249103213 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249103210} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &249103214 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 249103210} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 2005365752} + - {fileID: 841609043} + - {fileID: 402613295} + - {fileID: 413666543} + - {fileID: 1645660214} + - {fileID: 887670916} + - {fileID: 1215599424} + - {fileID: 1571633785} + - {fileID: 1405840086} + - {fileID: 488751090} + - {fileID: 786790213} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1001 &332229249 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1197462286522570267, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_Name + value: CommonSceneObjects + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalPosition.x + value: 310.12363 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalPosition.y + value: 354.77222 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalPosition.z + value: -119.334206 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8069444317427349030, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 526f667f64d4f6949a1aa2bbba7ef376, type: 3} +--- !u!114 &332229250 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 401235768459740558, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + m_PrefabInstance: {fileID: 332229249} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0602c0fdbc0b8f4ca63023ff9472f03, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &402613294 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1107399272158783315, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + m_PrefabInstance: {fileID: 577987562} + m_PrefabAsset: {fileID: 0} +--- !u!224 &402613295 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + m_PrefabInstance: {fileID: 577987562} + m_PrefabAsset: {fileID: 0} +--- !u!114 &402613296 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 402613294} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3267150f140f85f40ae1f020ab602430, type: 3} + m_Name: + m_EditorClassIdentifier: + defaultButton: {fileID: 0} +--- !u!1 &413666542 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 413666543} + - component: {fileID: 413666548} + - component: {fileID: 413666547} + - component: {fileID: 413666546} + - component: {fileID: 413666545} + - component: {fileID: 413666544} + m_Layer: 5 + m_Name: DownloadTargetLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &413666543 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1739055184} + m_Father: {fileID: 249103214} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: -0.0000037583222, y: 0.0000009264265} + m_AnchorMax: {x: 0.44620168, y: 0.99999714} + m_AnchoredPosition: {x: 73.5719, y: 106.97449} + m_SizeDelta: {x: -139.5885, y: -464.40424} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &413666544 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3267150f140f85f40ae1f020ab602430, type: 3} + m_Name: + m_EditorClassIdentifier: + defaultButton: {fileID: 0} +--- !u!114 &413666545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0aaf1d1e493f55e4495a8cd9683ffd1f, type: 3} + m_Name: + m_EditorClassIdentifier: + anchorMin: {x: -0.0000037583222, y: 0.0000009264265} + anchorMax: {x: 0.44620168, y: 0.99999714} + pivot: {x: 0.5, y: 0.5} + localPosition: {x: -215.51277, y: 106.974014, z: 0} + anchoredPosition: {x: 73.5719, y: 106.97449} + position: {x: 306.48724, y: 353.474, z: 0} + sizeDelta: {x: -139.5885, y: -464.40424} + size: {x: 326.24997, y: 28.593903} +--- !u!114 &413666546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.25882354, g: 0.6392157, b: 0.9058824, a: 1} + m_HighlightedColor: {r: 0.4901961, g: 0.77647066, b: 0.91372555, a: 1} + m_PressedColor: {r: 0.38892847, g: 0.60537565, b: 0.7169812, a: 1} + m_SelectedColor: {r: 0.4901961, g: 0.77647066, b: 0.91372555, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 413666547} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &413666547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 55f3e2c7b25af03468f72991504fb124, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &413666548 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 413666542} + m_CullTransparentMesh: 0 +--- !u!1 &488751089 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 488751090} + - component: {fileID: 488751092} + - component: {fileID: 488751091} + m_Layer: 5 + m_Name: StatusLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &488751090 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488751089} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 249103214} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.47700003, y: 0.5307223} + m_AnchorMax: {x: 0.83762497, y: 0.5844445} + m_AnchoredPosition: {x: -0.8999939, y: 0.49996948} + m_SizeDelta: {x: 1.699997, y: -0.8} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &488751091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488751089} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: not started +--- !u!222 &488751092 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 488751089} + m_CullTransparentMesh: 0 +--- !u!1001 &577987562 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 249103214} + m_Modifications: + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_SizeDelta.x + value: -3 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_SizeDelta.y + value: -2.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.66634375 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.035222225 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.8936563 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.101 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783315, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Name + value: BackButton + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 44401268} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument + value: + objectReference: {fileID: 332229250} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: LoadScene + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Interactable + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1107399272322891220, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.x + value: 146.26498 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.y + value: -118.04461 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.x + value: 132.30017 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.y + value: 35.499985 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.x + value: 0.6362499 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.y + value: 0.18123333 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMax.x + value: 0.86125004 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: position.x + value: 440.26498 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: position.y + value: 94.95539 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 3372070600022588915, guid: d25b56f386ff678439032a836c95dd10, type: 3} + - {fileID: 7242503738783058938, guid: d25b56f386ff678439032a836c95dd10, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: d25b56f386ff678439032a836c95dd10, type: 3} +--- !u!1 &786790210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 786790213} + - component: {fileID: 786790212} + - component: {fileID: 786790211} + m_Layer: 5 + m_Name: FileSize + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &786790211 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 786790210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: File size unknown. +--- !u!222 &786790212 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 786790210} + m_CullTransparentMesh: 0 +--- !u!224 &786790213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 786790210} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 249103214} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.13727494, y: 0.60830224} + m_AnchorMax: {x: 0.27163866, y: 0.65914506} + m_AnchoredPosition: {x: 137.3, y: -0.87999725} + m_SizeDelta: {x: 275.5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &841609043 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + m_PrefabInstance: {fileID: 1979197111} + m_PrefabAsset: {fileID: 0} +--- !u!1 &887670915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 887670916} + - component: {fileID: 887670918} + - component: {fileID: 887670917} + m_Layer: 5 + m_Name: DownloadStatusLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &887670916 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887670915} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 249103214} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.13727494, y: 0.5307223} + m_AnchorMax: {x: 0.44134375, y: 0.5844445} + m_AnchoredPosition: {x: -0.7999878, y: 0.5} + m_SizeDelta: {x: -0.8999939, y: -0.79999924} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &887670917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887670915} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Download Status:' +--- !u!222 &887670918 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 887670915} + m_CullTransparentMesh: 0 +--- !u!1 &938464639 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 938464640} + - component: {fileID: 938464642} + - component: {fileID: 938464641} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &938464640 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938464639} + m_LocalRotation: {x: -0, y: -0, z: -0.00034529547, w: 0.99999994} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1571633785} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: -0.040000003} + m_AnchorMin: {x: 0.007883864, y: 0.11100001} + m_AnchorMax: {x: 0.9888387, y: 1} + m_AnchoredPosition: {x: 1.5, y: -3.0000305} + m_SizeDelta: {x: -3, y: -8} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &938464641 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938464639} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &938464642 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 938464639} + m_CullTransparentMesh: 0 +--- !u!1001 &1021353134 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 249103214} + m_Modifications: + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMin.x + value: 0.7838551 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMin.y + value: 0.7562218 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMax.x + value: 0.9741873 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMax.y + value: 0.9462206 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: localPosition.x + value: 156.08313 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: localPosition.y + value: 43.29786 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: size.x + value: 78.37991 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: size.y + value: 23.422684 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: sizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: sizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: position.x + value: 442.70367 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: position.y + value: 244.21683 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: StartDownload + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1787266487} + - target: {fileID: 5124115183525111804, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Name + value: StartDownloadButton + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_RootOrder + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.7200012 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -2 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_SizeDelta.x + value: -1.7369995 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_SizeDelta.y + value: -3.199997 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.66634375 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.5997223 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.83762497 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.67233336 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Text + value: Start Download + objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} + - {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: be0e3235464c346458a464603cce47c0, type: 3} +--- !u!224 &1215599424 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + m_PrefabInstance: {fileID: 1021353134} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1405840085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1405840086} + - component: {fileID: 1405840088} + - component: {fileID: 1405840087} + m_Layer: 5 + m_Name: Log + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1405840086 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405840085} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 114326423} + m_Father: {fileID: 249103214} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.13727494, y: 0.14261115} + m_AnchorMax: {x: 0.83762497, y: 0.50972223} + m_AnchoredPosition: {x: -0.4140625, y: -0.88604736} + m_SizeDelta: {x: 0.44799805, y: -3.86792} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1405840087 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405840085} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 2facc55ac7ad81241ae66e751bd16e6a, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1405840088 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1405840085} + m_CullTransparentMesh: 0 +--- !u!1 &1571633784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1571633785} + - component: {fileID: 1571633788} + - component: {fileID: 1571633787} + - component: {fileID: 1571633786} + m_Layer: 5 + m_Name: DownloadPath + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1571633785 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571633784} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2136862184} + - {fileID: 938464640} + m_Father: {fileID: 249103214} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.13727494, y: 0.77338886} + m_AnchorMax: {x: 0.83762497, y: 0.8386111} + m_AnchoredPosition: {x: -0.1000061, y: 0.5} + m_SizeDelta: {x: -0.5, y: -1.8999996} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1571633786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571633784} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 0.25882354, g: 0.6392157, b: 0.90588236, a: 1} + m_HighlightedColor: {r: 0.7058824, g: 0.8980392, b: 1, a: 1} + m_PressedColor: {r: 0.02158241, g: 0.66841984, b: 0.9150943, a: 1} + m_SelectedColor: {r: 0, g: 0.400629, b: 0.6132076, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1571633787} + m_TextComponent: {fileID: 938464641} + m_Placeholder: {fileID: 2136862185} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1787266487} + m_MethodName: UpdateFileSize + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 +--- !u!114 &1571633787 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571633784} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1571633788 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1571633784} + m_CullTransparentMesh: 0 +--- !u!1001 &1645660213 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 249103214} + m_Modifications: + - target: {fileID: 4090027367327793652, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Text + value: persistentDataPath + objectReference: {fileID: 0} + - target: {fileID: 4090027367327793652, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 6750085590140811385, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: localPosition.x + value: 712.5035 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: localPosition.y + value: 353.974 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.x + value: 324.0539 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.y + value: 27.594025 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchorMin.x + value: 0.5554304 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: sizeDelta.x + value: 324.0539 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: sizeDelta.y + value: 27.594025 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchoredPosition.x + value: 712.5035 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: anchoredPosition.y + value: 353.974 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.x + value: 712.5035 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.y + value: 353.974 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641729, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.z + value: -616.995 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641730, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641730, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: manualRefresh + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641731, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641731, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: manualRefresh + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalPosition.z + value: -616.995 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -99.43115 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 107.474 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_SizeDelta.x + value: -140.07678 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_SizeDelta.y + value: -465.40594 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.5554304 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 6750085590155641733, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_Name + value: DownloadTargetItemSlider + objectReference: {fileID: 0} + - target: {fileID: 6750085590334753845, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: localPosition.x + value: 140.05609 + objectReference: {fileID: 0} + - target: {fileID: 6750085590334753845, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.x + value: 43.928772 + objectReference: {fileID: 0} + - target: {fileID: 6750085590334753845, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.y + value: 27.594025 + objectReference: {fileID: 0} + - target: {fileID: 6750085590334753845, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.x + value: 852.5596 + objectReference: {fileID: 0} + - target: {fileID: 6750085590334753845, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.y + value: 353.974 + objectReference: {fileID: 0} + - target: {fileID: 6750085590708643492, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 6750085590943520806, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: localPosition.x + value: -139.99129 + objectReference: {fileID: 0} + - target: {fileID: 6750085590943520806, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.x + value: 43.92874 + objectReference: {fileID: 0} + - target: {fileID: 6750085590943520806, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.y + value: 27.594025 + objectReference: {fileID: 0} + - target: {fileID: 6750085590943520806, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.x + value: 572.5122 + objectReference: {fileID: 0} + - target: {fileID: 6750085590943520806, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.y + value: 353.974 + objectReference: {fileID: 0} + - target: {fileID: 8793022488296390677, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: localPosition.x + value: 0.035591125 + objectReference: {fileID: 0} + - target: {fileID: 8793022488296390677, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.x + value: 236.1121 + objectReference: {fileID: 0} + - target: {fileID: 8793022488296390677, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: size.y + value: 27.594025 + objectReference: {fileID: 0} + - target: {fileID: 8793022488296390677, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.x + value: 712.53906 + objectReference: {fileID: 0} + - target: {fileID: 8793022488296390677, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + propertyPath: position.y + value: 353.974 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 263498a12963d4f47a8fc3dce7c5912a, type: 3} +--- !u!224 &1645660214 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6750085590155641732, guid: 263498a12963d4f47a8fc3dce7c5912a, + type: 3} + m_PrefabInstance: {fileID: 1645660213} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1739055183 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1739055184} + - component: {fileID: 1739055186} + - component: {fileID: 1739055185} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1739055184 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1739055183} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 413666543} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: -10} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1739055185 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1739055183} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Download Target +--- !u!222 &1739055186 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1739055183} + m_CullTransparentMesh: 0 +--- !u!1 &1787266486 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1787266488} + - component: {fileID: 1787266487} + m_Layer: 0 + m_Name: ContentDownloadSceneController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1787266487 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787266486} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dac1139104eaad942847bb52a3ec3c4c, type: 3} + m_Name: + m_EditorClassIdentifier: + statusLabel: {fileID: 488751091} + logText: {fileID: 114326424} + downloadPath: {fileID: 938464641} + fileSize: {fileID: 786790211} +--- !u!4 &1787266488 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787266486} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 542.9236, y: 302.57495, z: -1605.0468} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1979197111 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 249103214} + m_Modifications: + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.012512207 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.1000061 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.y + value: -0.20000076 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.8637209 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.817341 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3622033094347370611, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_Name + value: SceneTitle + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228108, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: 921e129a3d6748c4aae38b416fbd8a4f, + type: 3} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.056140088 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.3044731 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.108249985 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -0.29450035 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.y + value: 0.58899975 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_Text + value: Content Download + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -0.39999962 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.7510069 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.3044731 + objectReference: {fileID: 0} + - target: {fileID: 3622033095437819812, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 3622033095437819808, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} + - {fileID: 3622033095365871876, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} + - {fileID: 3622033095099228109, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} + - {fileID: 3622033095437819809, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} + - {fileID: 3622033095365871877, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} +--- !u!224 &2005365752 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + m_PrefabInstance: {fileID: 2031964711} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &2031964711 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 249103214} + m_Modifications: + - target: {fileID: 1213786968706131428, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_Name + value: Background + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_SizeDelta.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1213786968706131429, guid: eb9224bf102ee4043b45de46c945dd74, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: eb9224bf102ee4043b45de46c945dd74, type: 3} +--- !u!1 &2136862183 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2136862184} + - component: {fileID: 2136862186} + - component: {fileID: 2136862185} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2136862184 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136862183} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1571633785} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2136862185 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136862183} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 2 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 250 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enter the address of the song package to download +--- !u!222 &2136862186 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2136862183} + m_CullTransparentMesh: 0 diff --git a/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity.meta b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity.meta new file mode 100644 index 000000000..39a730c7b --- /dev/null +++ b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 10cb82cf2be19ee46b443c17c2efc000 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs new file mode 100644 index 000000000..1c315a46e --- /dev/null +++ b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.UI; +using UniInject; +using UniRx; +using System.IO; +using UnityEngine.Networking; +using UnityEngine.UIElements; +using ICSharpCode.SharpZipLib.Tar; +using static ThreadPool; + +// Disable warning about fields that are never assigned, their values are injected. +#pragma warning disable CS0649 + +public class ContentDownloadSceneController : MonoBehaviour, INeedInjection +{ + public Text statusLabel; + public Text logText; + public Text downloadPath; + public Text fileSize; + + public void StartDownload() + { + StartCoroutine(DownloadFile(downloadPath.text, PersistentTempPath())); + } + + private string PersistentTempPath() + { + string path = Path.Combine(Application.persistentDataPath, "Temp"); + //Create Directory if it does not exist + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + return path; + } + + private string PersistentSongsPath() + { + string path = Path.Combine(Application.persistentDataPath, "Songs"); + //Create Directory if it does not exist + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + return path; + } + + private IEnumerator DownloadFile(string url, string targetFolder) + { + Uri uri = new Uri(url); + string filename = Path.GetFileName(uri.LocalPath); + string targetPath = Path.Combine(targetFolder, filename); + + using (UnityWebRequest request = UnityWebRequest.Get(url)) + { + AddToLog($"Starting file download for {uri}."); + DownloadHandlerFile downloadHandler = new DownloadHandlerFile(targetPath); + downloadHandler.removeFileOnAbort = true; + request.downloadHandler = downloadHandler; + + StartCoroutine(TrackProgress(request, targetPath)); + + yield return request.SendWebRequest(); + + if (request.isNetworkError || request.isHttpError) + { + AddToLog("Error downloading the requested file!"); + } + else + { + statusLabel.text = "100%"; + AddToLog($"Download saved to {targetPath}. {request.error}"); + } + } + + yield return null; + } + + private IEnumerator TrackProgress(UnityWebRequest req, string tarPath) + { + while (true) + { + try + { + if (req.downloadHandler.isDone) + { + break; + } + } + catch (Exception ex) + { + AddToLog(ex.Message); + break; + } + statusLabel.text = Math.Round(req.downloadProgress * 100) + "%"; + yield return new WaitForSeconds(0.1f); + } + statusLabel.text = "100%"; + UnpackTar(tarPath); + } + + private void AddToLog(string message) + { + logText.text = message + "\n" + logText.text; + } + + public void UpdateFileSize() + { + StartCoroutine(FileSizeUpdate(downloadPath.text)); + } + + private IEnumerator FileSizeUpdate(string url) + { + using (UnityWebRequest request = UnityWebRequest.Head(url)) + { + yield return request.SendWebRequest(); + + if (request.isNetworkError || request.isHttpError) + { + AddToLog("Error publishing size of the requested file!"); + fileSize.text = "Unknown file size."; + } + else + { + long size = Convert.ToInt64(request.GetResponseHeader("Content-Length")); + fileSize.text = (size / 1024 / 1024) + " MB"; + } + } + + yield return null; + } + + private void UnpackTar(string tarPath) + { + if (!File.Exists(tarPath)) + { + AddToLog("Can not unpack file because it does not exist on the storage! Did the download fail?"); + return; + } + AddToLog("Preparing to unpack the downloaded song package."); + string songsPath = PersistentSongsPath(); + PoolHandle handle = ThreadPool.QueueUserWorkItem(poolHandle => + { + using (Stream tarStream = File.OpenRead(tarPath)) + { + using (TarArchive archive = TarArchive.CreateInputTarArchive(tarStream)) + { + archive.ExtractContents(songsPath); + poolHandle.done = true; + } + } + }); + StartCoroutine(TrackUnpack(handle, tarPath)); + } + + private IEnumerator TrackUnpack(PoolHandle handle, string tarPath) + { + string progress1 = "unpacking file. "; + string progress2 = "unpacking file.. "; + string progress3 = "unpacking file..."; + + while (handle != null && !handle.done) + { + statusLabel.text = progress1; + yield return new WaitForSeconds(0.2f); + if (handle == null || handle.done) + { + break; + } + statusLabel.text = progress2; + yield return new WaitForSeconds(0.2f); + if (handle == null || handle.done) + { + break; + } + statusLabel.text = progress3; + yield return new WaitForSeconds(0.2f); + } + + if (handle == null) + { + AddToLog($"Unpacking the song package failed! Handle was null for {tarPath}!"); + statusLabel.text = "Failed. Handle was null"; + + } + else if (handle.done) + { + AddToLog($"Unpacking the song package finished for {tarPath}."); + statusLabel.text = "Finished."; + downloadPath.text = ""; + } + else + { + AddToLog($"Unpacking the song package failed! Unknown error, check log. File: {tarPath}!"); + statusLabel.text = "Failed."; + } + if (File.Exists(tarPath)) + { + File.Delete(tarPath); + } + } +} diff --git a/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs.meta b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs.meta new file mode 100644 index 000000000..0bfe4652f --- /dev/null +++ b/UltraStar Play/Assets/Scenes/Options/ContentOptions/ContentDownloadSceneController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dac1139104eaad942847bb52a3ec3c4c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Scenes/Options/GameOptions/OptionsGameScene.unity b/UltraStar Play/Assets/Scenes/Options/GameOptions/OptionsGameScene.unity index a56620887..8449ca8bb 100644 --- a/UltraStar Play/Assets/Scenes/Options/GameOptions/OptionsGameScene.unity +++ b/UltraStar Play/Assets/Scenes/Options/GameOptions/OptionsGameScene.unity @@ -552,12 +552,12 @@ RectTransform: - {fileID: 1386089902} - {fileID: 1935100159} m_Father: {fileID: 1511431727} - m_RootOrder: 4 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.13727494, y: 0.32694823} + m_AnchorMin: {x: 0.13727494, y: 0.21162367} m_AnchorMax: {x: 0.83762497, y: 0.6163333} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0.19999695} + m_SizeDelta: {x: 0, y: -0.40000153} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &703909516 MonoBehaviour: @@ -640,22 +640,22 @@ PrefabInstance: - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchoredPosition.x - value: -26 + value: -0.5 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchoredPosition.y - value: 243.23 + value: -0.7700043 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_SizeDelta.x - value: -51.9 + value: -0.9000015 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_SizeDelta.y - value: -486.45 + value: 1.5499878 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} @@ -665,12 +665,12 @@ PrefabInstance: - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.78320515 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchorMax.x - value: 1 + value: 0.9511494 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} @@ -706,7 +706,7 @@ PrefabInstance: - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchorMin.y - value: 0.495074 + value: 0.546531 objectReference: {fileID: 0} - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} @@ -716,13 +716,48 @@ PrefabInstance: - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: 1.2700005 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.000030517578 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.y + value: -3.0651999 + objectReference: {fileID: 0} + - target: {fileID: 3622033095099228146, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.8235666 objectReference: {fileID: 0} - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_Text value: Game Options objectReference: {fileID: 0} + - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 1.2999992 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_SizeDelta.y + value: -2.5 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871882, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.546531 + objectReference: {fileID: 0} - target: {fileID: 3622033095437819812, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_IsActive @@ -741,6 +776,236 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 735281115} m_PrefabAsset: {fileID: 0} +--- !u!1001 &751991972 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 735281116} + m_Modifications: + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -741.8097 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -406.70618 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_SizeDelta.x + value: -225.17285 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_SizeDelta.y + value: -13.74749 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.63529205 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.098000005 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.86125004 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.18665592 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783315, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Name + value: BackButton + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 660269688} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument + value: + objectReference: {fileID: 660269687} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: LoadScene + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Interactable + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.x + value: -590.9017 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.y + value: -444.48044 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.x + value: -87.827545 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.y + value: -4.384407 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.x + value: 0.63529205 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.y + value: 0.098000005 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMax.x + value: 0.86125004 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: position.x + value: -287.03387 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: position.y + value: -17.281189 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMax.y + value: 0.18665592 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchoredPosition.x + value: -741.8097 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchoredPosition.y + value: -406.70618 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: sizeDelta.x + value: -225.17285 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: sizeDelta.y + value: -13.74749 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 3372070600022588915, guid: d25b56f386ff678439032a836c95dd10, type: 3} + - {fileID: 7242503738783058938, guid: d25b56f386ff678439032a836c95dd10, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: d25b56f386ff678439032a836c95dd10, type: 3} +--- !u!1 &751991973 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1107399272158783315, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + m_PrefabInstance: {fileID: 751991972} + m_PrefabAsset: {fileID: 0} +--- !u!114 &751991974 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 751991973} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3267150f140f85f40ae1f020ab602430, type: 3} + m_Name: + m_EditorClassIdentifier: + defaultButton: {fileID: 0} --- !u!1 &828068322 GameObject: m_ObjectHideFlags: 0 @@ -829,6 +1094,31 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 828068322} m_CullTransparentMesh: 0 +--- !u!1 &874611654 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5124115183525111804, guid: be0e3235464c346458a464603cce47c0, + type: 3} + m_PrefabInstance: {fileID: 1608640736} + m_PrefabAsset: {fileID: 0} +--- !u!224 &874611655 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + m_PrefabInstance: {fileID: 1608640736} + m_PrefabAsset: {fileID: 0} +--- !u!114 &874611656 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874611654} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3267150f140f85f40ae1f020ab602430, type: 3} + m_Name: + m_EditorClassIdentifier: + defaultButton: {fileID: 0} --- !u!1 &878467874 GameObject: m_ObjectHideFlags: 0 @@ -929,11 +1219,11 @@ MonoBehaviour: anchorMin: {x: 0, y: 1} anchorMax: {x: 0, y: 1} pivot: {x: 0.5, y: 0.5} - localPosition: {x: 361.5529, y: -26.500004, z: 0} - anchoredPosition: {x: 361.5529, y: -26.500004} - position: {x: 534.61646, y: 256.01926, z: 0} - sizeDelta: {x: 707.1058, y: 37.000008} - size: {x: 707.1058, y: 37.000008} + localPosition: {x: 338.83414, y: -26.500004, z: 0} + anchoredPosition: {x: 338.83414, y: -26.500004} + position: {x: 501.02298, y: 228.21721, z: 0} + sizeDelta: {x: 661.6683, y: 37.000008} + size: {x: 661.6683, y: 37.000008} --- !u!1001 &1051339506 PrefabInstance: m_ObjectHideFlags: 0 @@ -979,7 +1269,7 @@ PrefabInstance: - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_RootOrder - value: 2 + value: 3 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} @@ -999,32 +1289,32 @@ PrefabInstance: - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 0.5 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -1 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_SizeDelta.x - value: 0.000061035156 + value: -0.99993896 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: -4 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_AnchorMin.x - value: 0.6362499 + value: 0.63529205 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_AnchorMin.y - value: 0.18123333 + value: 0.098000005 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} @@ -1034,7 +1324,7 @@ PrefabInstance: - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_AnchorMax.y - value: 0.26456663 + value: 0.18665592 objectReference: {fileID: 0} - target: {fileID: 1107399272158783314, guid: d25b56f386ff678439032a836c95dd10, type: 3} @@ -1051,6 +1341,11 @@ PrefabInstance: propertyPath: m_Name value: BackButton objectReference: {fileID: 0} + - target: {fileID: 1107399272158783315, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target @@ -1063,33 +1358,83 @@ PrefabInstance: objectReference: {fileID: 660269687} - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName - value: LoadScene + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: LoadScene + objectReference: {fileID: 0} + - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_Interactable + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.x + value: 159.39346 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: localPosition.y + value: -172.68257 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.x + value: 143.61316 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: size.y + value: 38.55484 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.x + value: 0.63529205 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMin.y + value: 0.098000005 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: anchorMax.x + value: 0.86125004 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: position.x + value: 479.39346 objectReference: {fileID: 0} - - target: {fileID: 1107399272158783325, guid: d25b56f386ff678439032a836c95dd10, + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: m_Interactable - value: 1 + propertyPath: position.y + value: 67.31743 objectReference: {fileID: 0} - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: localPosition.x - value: 159.2 + propertyPath: anchorMax.y + value: 0.18665592 objectReference: {fileID: 0} - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: localPosition.y - value: -133.00801 + propertyPath: anchoredPosition.x + value: 0.5 objectReference: {fileID: 0} - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: size.x - value: 144.00009 + propertyPath: anchoredPosition.y + value: -1 objectReference: {fileID: 0} - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} - propertyPath: size.y - value: 39.999992 + propertyPath: sizeDelta.x + value: -0.99993896 + objectReference: {fileID: 0} + - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: sizeDelta.y + value: -4 objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 3372070600022588915, guid: d25b56f386ff678439032a836c95dd10, type: 3} @@ -1177,6 +1522,11 @@ PrefabInstance: propertyPath: m_Text value: Language objectReference: {fileID: 0} + - target: {fileID: 2207053362414957233, guid: f7f4dd63810ceeb458e89387485df04a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 2793207500214643716, guid: f7f4dd63810ceeb458e89387485df04a, type: 3} propertyPath: m_Name @@ -1202,6 +1552,11 @@ PrefabInstance: propertyPath: m_Text value: English objectReference: {fileID: 0} + - target: {fileID: 7214891532376088749, guid: f7f4dd63810ceeb458e89387485df04a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7474452301240123628, guid: f7f4dd63810ceeb458e89387485df04a, type: 3} propertyPath: m_LocalPosition.x @@ -1240,7 +1595,7 @@ PrefabInstance: - target: {fileID: 7474452301240123628, guid: f7f4dd63810ceeb458e89387485df04a, type: 3} propertyPath: m_RootOrder - value: 3 + value: 5 objectReference: {fileID: 0} - target: {fileID: 7474452301240123628, guid: f7f4dd63810ceeb458e89387485df04a, type: 3} @@ -1435,10 +1790,10 @@ RectTransform: m_Father: {fileID: 703909514} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.02164491, y: 0.49703127} - m_AnchorMax: {x: 0.97001857, y: 0.5029687} - m_AnchoredPosition: {x: 3.0768738, y: 30.63} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0.02164491, y: 0.75349224} + m_AnchorMax: {x: 0.974187, y: 0.75349224} + m_AnchoredPosition: {x: 1.7370911, y: 0.40000153} + m_SizeDelta: {x: -4, y: 0.5999985} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1386089903 MonoBehaviour: @@ -1452,14 +1807,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0aaf1d1e493f55e4495a8cd9683ffd1f, type: 3} m_Name: m_EditorClassIdentifier: - anchorMin: {x: 0.02164491, y: 0.49703127} - anchorMax: {x: 0.97001857, y: 0.5029687} + anchorMin: {x: 0.02164491, y: 0.75349224} + anchorMax: {x: 0.974187, y: 0.75349224} pivot: {x: 0.5, y: 0.5} - localPosition: {x: -0.1751709, y: 30.63, z: 0} - anchoredPosition: {x: 3.0768738, y: 30.63} - position: {x: 542.8441, y: 284.37274, z: 0} - sizeDelta: {x: 0, y: 0} - size: {x: 739.91156, y: 0.9243927} + localPosition: {x: 0.21331787, y: 51.593987, z: 0} + anchoredPosition: {x: 1.7370911, y: 0.40000153} + position: {x: 509.11105, y: 258.78323, z: 0} + sizeDelta: {x: -4, y: 0.5999985} + size: {x: 692.4658, y: 0.5999985} --- !u!114 &1386089905 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1588,9 +1943,10 @@ RectTransform: m_Children: - {fileID: 1984435379} - {fileID: 735281116} + - {fileID: 703909514} - {fileID: 1051339507} + - {fileID: 874611655} - {fileID: 1369465130} - - {fileID: 703909514} m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1722,6 +2078,264 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1548201890} m_CullTransparentMesh: 0 +--- !u!1001 &1608640736 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1511431727} + m_Modifications: + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMin.x + value: 0.094999924 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMin.y + value: 0.6433333 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMax.x + value: 0.31999993 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchorMax.y + value: 0.7266667 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: localPosition.x + value: 216.62994 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: localPosition.y + value: 342.5 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchoredPosition.x + value: 216.62994 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: anchoredPosition.y + value: 342.5 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: position.x + value: 216.62994 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: position.y + value: 342.5 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: sizeDelta.x + value: 234.9 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: sizeDelta.y + value: 41.666687 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: size.x + value: 234.9 + objectReference: {fileID: 0} + - target: {fileID: -8801961142622241638, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: size.y + value: 41.666687 + objectReference: {fileID: 0} + - target: {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: followSize + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: manualRefresh + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: followPosition + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 660269688} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: LoadScene + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111794, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument + value: + objectReference: {fileID: 1705533156} + - target: {fileID: 5124115183525111804, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Name + value: DownloadSongsButton + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 1.1600037 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_SizeDelta.x + value: -2.2999992 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_SizeDelta.y + value: 1.6566162 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.13727494 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.098000005 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.36311495 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_AnchorMax.y + value: 0.17465593 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Text + value: Download songs + objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: manualRefresh + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} + - {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: be0e3235464c346458a464603cce47c0, type: 3} +--- !u!114 &1705533156 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 4591571610610142511, guid: 526f667f64d4f6949a1aa2bbba7ef376, + type: 3} + m_PrefabInstance: {fileID: 660269686} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0602c0fdbc0b8f4ca63023ff9472f03, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1935100158 GameObject: m_ObjectHideFlags: 0 @@ -1760,8 +2374,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.02581337, y: 0.00000038504356} m_AnchorMax: {x: 0.974187, y: 0.68483317} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 5.1} + m_SizeDelta: {x: 0, y: 10.2} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1935100160 MonoBehaviour: @@ -1986,10 +2600,10 @@ RectTransform: m_Father: {fileID: 703909514} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.021645324, y: 0.6788961} - m_AnchorMax: {x: 0.9700145, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0.021645324, y: 0.794} + m_AnchorMax: {x: 0.7017493, y: 0.9462206} + m_AnchoredPosition: {x: -0.6000061, y: -0.6749954} + m_SizeDelta: {x: -1.2, y: 1.3500004} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2041279442 MonoBehaviour: @@ -2015,7 +2629,7 @@ MonoBehaviour: m_FontStyle: 0 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 25 + m_MaxSize: 250 m_Alignment: 3 m_AlignByGeometry: 0 m_RichText: 1 @@ -2066,7 +2680,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: -0.000000023839817, y: -0.0018482526} m_AnchorMax: {x: 0.97728676, y: 1} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0.000015258789} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &2042198396 @@ -2248,7 +2862,7 @@ PrefabInstance: - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: -0.7000046 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} @@ -2258,7 +2872,7 @@ PrefabInstance: - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 1.3000002 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} @@ -2268,7 +2882,7 @@ PrefabInstance: - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_AnchorMin.y - value: 0.7562218 + value: 0.794 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} @@ -2295,6 +2909,11 @@ PrefabInstance: propertyPath: m_Text value: Add objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} - {fileID: 3224661575443254101, guid: be0e3235464c346458a464603cce47c0, type: 3} @@ -2480,6 +3099,11 @@ PrefabInstance: propertyPath: m_Enabled value: 0 objectReference: {fileID: 0} + - target: {fileID: 3742349459392477305, guid: b74e8cbf6e8d5eb4c93bd82d792bea1a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 3742349459392477310, guid: b74e8cbf6e8d5eb4c93bd82d792bea1a, type: 3} propertyPath: m_AnchoredPosition.y @@ -2510,6 +3134,11 @@ PrefabInstance: propertyPath: size.y value: 37.000008 objectReference: {fileID: 0} + - target: {fileID: 8427357079315617878, guid: b74e8cbf6e8d5eb4c93bd82d792bea1a, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 6152401977617520753, guid: b74e8cbf6e8d5eb4c93bd82d792bea1a, type: 3} - {fileID: 3742349457644551193, guid: b74e8cbf6e8d5eb4c93bd82d792bea1a, type: 3} diff --git a/UltraStar Play/Assets/Scenes/Options/OptionsScene.unity b/UltraStar Play/Assets/Scenes/Options/OptionsScene.unity index 3ef5e6259..ca0db999a 100644 --- a/UltraStar Play/Assets/Scenes/Options/OptionsScene.unity +++ b/UltraStar Play/Assets/Scenes/Options/OptionsScene.unity @@ -277,6 +277,11 @@ PrefabInstance: propertyPath: m_Text value: Game objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh @@ -816,6 +821,11 @@ PrefabInstance: propertyPath: m_Text value: Player Profiles objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh @@ -993,6 +1003,11 @@ PrefabInstance: propertyPath: m_Text value: Sound objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh @@ -1170,6 +1185,11 @@ PrefabInstance: propertyPath: m_Text value: Recording objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh @@ -1453,6 +1473,11 @@ PrefabInstance: propertyPath: m_Text value: Graphics objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh @@ -1736,17 +1761,17 @@ PrefabInstance: - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_AnchoredPosition.y - value: 0 + value: 2.9 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_SizeDelta.x - value: 0.000061035156 + value: 0 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: m_SizeDelta.y - value: 0 + value: 5.7 objectReference: {fileID: 0} - target: {fileID: 5124115183525111805, guid: be0e3235464c346458a464603cce47c0, type: 3} @@ -1783,6 +1808,11 @@ PrefabInstance: propertyPath: m_Text value: Back objectReference: {fileID: 0} + - target: {fileID: 5124115183637839227, guid: be0e3235464c346458a464603cce47c0, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 7390061747104496988, guid: be0e3235464c346458a464603cce47c0, type: 3} propertyPath: manualRefresh diff --git a/UltraStar Play/Assets/Scenes/Options/PlayerProfileSetup/PlayerProfileSetupScene.unity b/UltraStar Play/Assets/Scenes/Options/PlayerProfileSetup/PlayerProfileSetupScene.unity index e71aedd9a..4a8004d05 100644 --- a/UltraStar Play/Assets/Scenes/Options/PlayerProfileSetup/PlayerProfileSetupScene.unity +++ b/UltraStar Play/Assets/Scenes/Options/PlayerProfileSetup/PlayerProfileSetupScene.unity @@ -640,22 +640,22 @@ PrefabInstance: - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchoredPosition.x - value: -26 + value: 0.5 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchoredPosition.y - value: 243.23 + value: 0.22999573 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_SizeDelta.x - value: -51.9 + value: 1.0999985 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_SizeDelta.y - value: -486.45 + value: -0.4500122 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} @@ -665,12 +665,12 @@ PrefabInstance: - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 0.8805554 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_AnchorMax.x - value: 1 + value: 0.94500005 objectReference: {fileID: 0} - target: {fileID: 3622033094347370610, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} @@ -723,6 +723,21 @@ PrefabInstance: propertyPath: m_Text value: Player Profiles objectReference: {fileID: 0} + - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 3622033095365871879, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_FontData.m_BestFit + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3622033095437819811, guid: 176e869a9ab83ce4aa378e24fe6fb891, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 3622033095437819812, guid: 176e869a9ab83ce4aa378e24fe6fb891, type: 3} propertyPath: m_IsActive @@ -1045,6 +1060,11 @@ PrefabInstance: propertyPath: m_Interactable value: 1 objectReference: {fileID: 0} + - target: {fileID: 1107399272322891220, guid: d25b56f386ff678439032a836c95dd10, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 5592310343206075445, guid: d25b56f386ff678439032a836c95dd10, type: 3} propertyPath: localPosition.x @@ -1127,10 +1147,10 @@ RectTransform: m_Father: {fileID: 703909514} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.02164491, y: 0.49703127} - m_AnchorMax: {x: 0.97001857, y: 0.5029687} - m_AnchoredPosition: {x: 3.0769043, y: 145.79} - m_SizeDelta: {x: -0.0000008181478, y: -1.4609635} + m_AnchorMin: {x: 0.02164491, y: 0.8683094} + m_AnchorMax: {x: 0.9741354, y: 0.8736908} + m_AnchoredPosition: {x: 1.0769043, y: -0.21000671} + m_SizeDelta: {x: -4.000001, y: -1.460968} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1386089903 MonoBehaviour: @@ -1144,14 +1164,14 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0aaf1d1e493f55e4495a8cd9683ffd1f, type: 3} m_Name: m_EditorClassIdentifier: - anchorMin: {x: 0.02164491, y: 0.49703127} - anchorMax: {x: 0.97001857, y: 0.5029687} + anchorMin: {x: 0.02164491, y: 0.8683094} + anchorMax: {x: 0.9741354, y: 0.8736908} pivot: {x: 0.5, y: 0.5} - localPosition: {x: -1.2611694, y: 145.79, z: 0} - anchoredPosition: {x: 3.0769043, y: 145.79} - position: {x: 558.3846, y: 421.8418, z: 0} - sizeDelta: {x: -0.0000008181478, y: -1.4609635} - size: {x: 987.0111, y: 0.74570155} + localPosition: {x: -0.6399231, y: 145.61758, z: 0} + anchoredPosition: {x: 1.0769043, y: -0.21000671} + position: {x: 436.9287, y: 437.57568, z: 0} + sizeDelta: {x: -4.000001, y: -1.460968} + size: {x: 771.06146, y: 0.65426636} --- !u!114 &1386089905 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1451,8 +1471,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.025813296, y: -0.00000088354085} m_AnchorMax: {x: 0.974187, y: 0.85470945} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 5.5} + m_SizeDelta: {x: 0, y: -11.1} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1935100160 MonoBehaviour: @@ -1677,10 +1697,10 @@ RectTransform: m_Father: {fileID: 703909514} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.021645268, y: 0.85470986} - m_AnchorMax: {x: 0.9700146, y: 1.0000011} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_AnchorMin: {x: 0.021645268, y: 0.88159955} + m_AnchorMax: {x: 0.81640166, y: 1.0000011} + m_AnchoredPosition: {x: 0.049987793, y: 0.117492676} + m_SizeDelta: {x: 0.099998474, y: -0.24} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2041279442 MonoBehaviour: @@ -1706,7 +1726,7 @@ MonoBehaviour: m_FontStyle: 0 m_BestFit: 1 m_MinSize: 10 - m_MaxSize: 25 + m_MaxSize: 250 m_Alignment: 3 m_AlignByGeometry: 0 m_RichText: 1 @@ -2061,6 +2081,46 @@ PrefabInstance: propertyPath: m_Enabled value: 0 objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -0.38000107 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.y + value: -6.200001 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.15458561 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.38000488 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.x + value: -9.209991 + objectReference: {fileID: 0} + - target: {fileID: 289950956926869075, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 972474118250484983, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 3141695341548029995, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: anchorMin.y @@ -2079,7 +2139,7 @@ PrefabInstance: - target: {fileID: 3141695341548029995, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.y - value: -119.33002 + value: -77.331635 objectReference: {fileID: 0} - target: {fileID: 3141695341548029995, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2101,6 +2161,46 @@ PrefabInstance: propertyPath: size.y value: 103.33 objectReference: {fileID: 0} + - target: {fileID: 3141695341548029995, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 3141695341548029995, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 286.57623 + objectReference: {fileID: 0} + - target: {fileID: 3508731357981788520, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.8984077 + objectReference: {fileID: 0} + - target: {fileID: 3508731357981788520, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -1.5 + objectReference: {fileID: 0} + - target: {fileID: 3508731357981788520, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.x + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 3508731357981788520, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.10439668 + objectReference: {fileID: 0} + - target: {fileID: 5132588399754952112, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_PreserveAspect + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5359969181667847363, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 5359969181667847385, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x @@ -2121,6 +2221,31 @@ PrefabInstance: propertyPath: size.y value: 37.089733 objectReference: {fileID: 0} + - target: {fileID: 5359969181667847385, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 5359969181667847385, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 263.8378 + objectReference: {fileID: 0} + - target: {fileID: 5359969181667847385, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.z + value: -616.995 + objectReference: {fileID: 0} + - target: {fileID: 5359969181717112378, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} + - target: {fileID: 5359969181932025048, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 5359969181934610164, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: m_Name @@ -2234,37 +2359,157 @@ PrefabInstance: - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x - value: 0.000030040741 + value: -0.0000026226044 objectReference: {fileID: 0} - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.x - value: 15.934259 + value: -1.3795166 objectReference: {fileID: 0} - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.y - value: 0.03579712 + value: 0.03545761 objectReference: {fileID: 0} - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.y - value: 87.93495 + value: 87.100716 + objectReference: {fileID: 0} + - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.69803 + objectReference: {fileID: 0} + - target: {fileID: 5359969181950851660, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 288.27225 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -2.619995 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.x + value: -5.75 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 0.14107895 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021232, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.7436032 objectReference: {fileID: 0} - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x - value: 18.693758 + value: 1.0181131 objectReference: {fileID: 0} - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.x - value: 7.586235 + value: -15.496225 objectReference: {fileID: 0} - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.y - value: 87.92741 + value: 86.91769 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchoredPosition.x + value: 1.8800001 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchoredPosition.y + value: 0.14107895 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 38.716156 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 288.4657 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchorMin.y + value: 0.0020158687 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: localPosition.y + value: 0.22891998 + objectReference: {fileID: 0} + - target: {fileID: 5359969182007021234, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: sizeDelta.x + value: -14.75 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMax.x + value: 0.246 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -0.2999878 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.x + value: -2.4699993 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.y + value: 0.10047135 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.y + value: -0.30120087 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.y + value: 0.6029997 + objectReference: {fileID: 0} + - target: {fileID: 5359969182019337382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.0072066477 objectReference: {fileID: 0} - target: {fileID: 5359969182255357904, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2281,25 +2526,55 @@ PrefabInstance: propertyPath: size.y value: 37.089733 objectReference: {fileID: 0} + - target: {fileID: 5359969182255357904, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 5359969182255357904, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 263.8378 + objectReference: {fileID: 0} + - target: {fileID: 5359969182545800884, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x - value: -10.844328 + value: 0.93885326 objectReference: {fileID: 0} - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.x - value: 6.8412876 + value: -0.592288 objectReference: {fileID: 0} - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.y - value: 0.1084404 + value: 0.10741043 objectReference: {fileID: 0} - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.y - value: 87.78969 + value: 86.956825 + objectReference: {fileID: 0} + - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 38.6369 + objectReference: {fileID: 0} + - target: {fileID: 5359969182855542374, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 288.3442 + objectReference: {fileID: 0} + - target: {fileID: 5359969183029662030, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 objectReference: {fileID: 0} - target: {fileID: 5359969183379983270, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2316,6 +2591,21 @@ PrefabInstance: propertyPath: size.y value: 37.089733 objectReference: {fileID: 0} + - target: {fileID: 5359969183379983270, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 5359969183379983270, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 263.8378 + objectReference: {fileID: 0} + - target: {fileID: 5359969183537597182, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 5359969183602893126, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x @@ -2331,6 +2621,16 @@ PrefabInstance: propertyPath: size.y value: 37.089733 objectReference: {fileID: 0} + - target: {fileID: 5359969183602893126, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 5359969183602893126, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 263.8378 + objectReference: {fileID: 0} - target: {fileID: 5745266473556399382, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x @@ -2351,20 +2651,50 @@ PrefabInstance: propertyPath: size.y value: 37.088352 objectReference: {fileID: 0} + - target: {fileID: 5745266473556399382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 37.998047 + objectReference: {fileID: 0} + - target: {fileID: 5745266473556399382, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 263.8374 + objectReference: {fileID: 0} + - target: {fileID: 6146623256398910701, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchorMin.x + value: 0.19341967 + objectReference: {fileID: 0} + - target: {fileID: 6146623256398910701, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -3.6399994 + objectReference: {fileID: 0} + - target: {fileID: 6146623256398910701, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_SizeDelta.x + value: -2.7200012 + objectReference: {fileID: 0} + - target: {fileID: 7780749649504706491, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: m_FontData.m_MaxSize + value: 250 + objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: localPosition.x - value: 0 + value: -1.5 objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: size.x - value: 676 + value: 15 objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: anchorMin.x - value: 0.5 + value: 0.10439668 objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2374,7 +2704,7 @@ PrefabInstance: - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: anchorMax.x - value: 0.5 + value: 0.8984077 objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2384,7 +2714,7 @@ PrefabInstance: - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} propertyPath: sizeDelta.x - value: 676 + value: 15 objectReference: {fileID: 0} - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, type: 3} @@ -2401,6 +2731,26 @@ PrefabInstance: propertyPath: size.y value: 1.2600023 objectReference: {fileID: 0} + - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchoredPosition.y + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.x + value: 36.498047 + objectReference: {fileID: 0} + - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: position.y + value: 236.41122 + objectReference: {fileID: 0} + - target: {fileID: 8229957429999894618, guid: 7f90529b262116549ae681e9354c8486, + type: 3} + propertyPath: anchoredPosition.x + value: -1.5 + objectReference: {fileID: 0} m_RemovedComponents: - {fileID: 285674658972377486, guid: 7f90529b262116549ae681e9354c8486, type: 3} - {fileID: 5359969183602893120, guid: 7f90529b262116549ae681e9354c8486, type: 3} diff --git a/UltraStar Play/ProjectSettings/EditorBuildSettings.asset b/UltraStar Play/ProjectSettings/EditorBuildSettings.asset index 672e2278a..dbdbf9cfa 100644 --- a/UltraStar Play/ProjectSettings/EditorBuildSettings.asset +++ b/UltraStar Play/ProjectSettings/EditorBuildSettings.asset @@ -53,4 +53,7 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/Options/RecordingOptions/RecordingOptionsScene.unity guid: 1d45d77c510b46a4b84e3f412e45766d + - enabled: 1 + path: Assets/Scenes/Options/ContentOptions/ContentDownloadScene.unity + guid: 10cb82cf2be19ee46b443c17c2efc000 m_configObjects: {}