From 615934557c07707d889898d8f9162a11f40d949a Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 22:27:12 +0100 Subject: [PATCH 01/21] Added more audio handling --- MusicPlayer/MusicPlayer/AudioHandler.cs | 122 ++++++++++++++----- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 26 ++++ MusicPlayer/MusicPlayer/MainForm.cs | 12 +- MusicPlayer/MusicPlayer/Song.cs | 2 +- 4 files changed, 130 insertions(+), 32 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index d425356..2dad756 100644 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -12,47 +12,109 @@ namespace MusicPlayer { public class AudioHandler { - public static Stream ms = new MemoryStream(); + public enum AudioState { PLAYING, STOPPED, PAUSED } + public AudioState State { get; set; } - public static void PlayMp3FromUrl(string url) + private Stream ms; + + private Thread network; + private Thread audio; + + private Song CurrentSong; + + public AudioHandler() { - new Thread(delegate (object o) - { - var response = WebRequest.Create(url).GetResponse(); - using (var stream = response.GetResponseStream()) - { - byte[] buffer = new byte[65536]; // 64KB chunks - int read; - while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) - { - var pos = ms.Position; - ms.Position = ms.Length; - ms.Write(buffer, 0, read); - ms.Position = pos; - } - } - }).Start(); + ms = new MemoryStream(); + network = new Thread(LoadAudio); + audio = new Thread(PlayAudio); + network.IsBackground = true; + audio.IsBackground = true; + State = AudioState.STOPPED; + } - new Thread(delegate (object o) + public void Play(Song s) + { + if (CurrentSong == s) + State = AudioState.PLAYING; + else { - // Pre-buffering some data to allow NAudio to start playing - while (ms.Length < 65536 * 10) - Thread.Sleep(1000); + State = AudioState.STOPPED; - ms.Position = 0; - using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) + network = new Thread(LoadAudio); + audio = new Thread(PlayAudio); + + CurrentSong = s; + network.Start(s); + audio.Start(); + } + } + + public void Stop() + { + State = AudioState.STOPPED; + } + + public void Pause() + { + State = AudioState.PAUSED; + } + + private void PlayAudio() + { + while (ms.Length < 65536 * 10) + Thread.Sleep(1000); + + ms.Position = 0; + using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) + { + using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) { - using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) + waveOut.Init(blockAlignedStream); + waveOut.Play(); + while (waveOut.PlaybackState != PlaybackState.Stopped) { - waveOut.Init(blockAlignedStream); - waveOut.Play(); - while (waveOut.PlaybackState == PlaybackState.Playing) + System.Threading.Thread.Sleep(100); + if(State == AudioState.PAUSED && waveOut.PlaybackState == PlaybackState.Playing) { - System.Threading.Thread.Sleep(100); + waveOut.Pause(); + } + if (State == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) + { + waveOut.Play(); + } + if (State == AudioState.STOPPED) + { + waveOut.Stop(); } } + State = AudioState.STOPPED; } - }).Start(); + } } + + private void LoadAudio(object o) + { + Song s = (Song) o; + var response = WebRequest.Create(s.Url).GetResponse(); + State = AudioState.PLAYING; + using (var stream = response.GetResponseStream()) + { + byte[] buffer = new byte[65536]; // 64KB chunks + int read; + while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) + { + var pos = ms.Position; + ms.Position = ms.Length; + ms.Write(buffer, 0, read); + ms.Position = pos; + if(State == AudioState.STOPPED) + { + stream.Close(); + return; + } + } + } + } + } } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 19a4bd8..3f00825 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -41,6 +41,8 @@ this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); this.PlayButton = new System.Windows.Forms.Button(); + this.PauseButton = new System.Windows.Forms.Button(); + this.StopButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -158,6 +160,8 @@ // ControlsPanel // this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame; + this.ControlsPanel.Controls.Add(this.StopButton); + this.ControlsPanel.Controls.Add(this.PauseButton); this.ControlsPanel.Controls.Add(this.PlayButton); this.ControlsPanel.Dock = System.Windows.Forms.DockStyle.Bottom; this.ControlsPanel.Location = new System.Drawing.Point(0, 343); @@ -175,6 +179,26 @@ this.PlayButton.UseVisualStyleBackColor = true; this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); // + // PauseButton + // + this.PauseButton.Location = new System.Drawing.Point(108, 13); + this.PauseButton.Name = "PauseButton"; + this.PauseButton.Size = new System.Drawing.Size(75, 23); + this.PauseButton.TabIndex = 1; + this.PauseButton.Text = "Pause"; + this.PauseButton.UseVisualStyleBackColor = true; + this.PauseButton.Click += new System.EventHandler(this.PauseButton_Click); + // + // StopButton + // + this.StopButton.Location = new System.Drawing.Point(203, 13); + this.StopButton.Name = "StopButton"; + this.StopButton.Size = new System.Drawing.Size(75, 23); + this.StopButton.TabIndex = 2; + this.StopButton.Text = "Stop"; + this.StopButton.UseVisualStyleBackColor = true; + this.StopButton.Click += new System.EventHandler(this.StopButton_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -213,6 +237,8 @@ private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; private System.Windows.Forms.Panel ControlsPanel; private System.Windows.Forms.Button PlayButton; + private System.Windows.Forms.Button StopButton; + private System.Windows.Forms.Button PauseButton; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 6022c64..1a8cae3 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -34,12 +34,22 @@ namespace MusicPlayer private void PlayButton_Click(object sender, EventArgs e) { - AudioHandler.PlayMp3FromUrl("http://imegumii.nl/music/English/Monstercat/Direct%20-%20Eternity.mp3"); + main.audio.Play(new Song("102", "Test", "Test", "Test", main.api)); } private void SongsTableView_SelectionChanged(object sender, EventArgs e) { DataGridViewSelectedRowCollection col = SongsTableView.SelectedRows; } + + private void PauseButton_Click(object sender, EventArgs e) + { + main.audio.Pause(); + } + + private void StopButton_Click(object sender, EventArgs e) + { + main.audio.Stop(); + } } } diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index 3fb4e5b..a44b6cf 100644 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MusicPlayer { - class Song + public class Song { public string SongID { get; set; } public string Name { get; set; } From 1f2983d712f9f865c63c2da1ea3531b2b0a42bea Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 22:48:54 +0100 Subject: [PATCH 02/21] Better Audio Handling --- MusicPlayer/MusicPlayer/AudioHandler.cs | 74 ++++++++++++++++--------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index 2dad756..8b2f9d7 100644 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -12,8 +12,10 @@ namespace MusicPlayer { public class AudioHandler { - public enum AudioState { PLAYING, STOPPED, PAUSED } - public AudioState State { get; set; } + public enum AudioState { PLAYING, WAITING, STOPPED, PAUSED } + public enum BufferState { EMPTY, BUFFERING, DONE } + public AudioState AState { get; set; } + public BufferState BState { get; set; } private Stream ms; @@ -24,24 +26,32 @@ namespace MusicPlayer public AudioHandler() { + CreateThreads(); + } + + private void CreateThreads() + { + AState = AudioState.STOPPED; + BState = BufferState.EMPTY; + ms = new MemoryStream(); + network = new Thread(LoadAudio); audio = new Thread(PlayAudio); + network.IsBackground = true; audio.IsBackground = true; - State = AudioState.STOPPED; + + } public void Play(Song s) { if (CurrentSong == s) - State = AudioState.PLAYING; + AState = AudioState.PLAYING; else { - State = AudioState.STOPPED; - - network = new Thread(LoadAudio); - audio = new Thread(PlayAudio); + Stop(); CurrentSong = s; network.Start(s); @@ -51,20 +61,24 @@ namespace MusicPlayer public void Stop() { - State = AudioState.STOPPED; + CreateThreads(); } public void Pause() { - State = AudioState.PAUSED; + AState = AudioState.PAUSED; } private void PlayAudio() { - while (ms.Length < 65536 * 10) + AState = AudioState.WAITING; + while (ms.Length < 65536 * 10 && BState != BufferState.DONE) Thread.Sleep(1000); + AState = AudioState.PLAYING; - ms.Position = 0; + long position = 0; + + ms.Position = position; using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) { using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) @@ -73,21 +87,25 @@ namespace MusicPlayer waveOut.Play(); while (waveOut.PlaybackState != PlaybackState.Stopped) { - System.Threading.Thread.Sleep(100); - if(State == AudioState.PAUSED && waveOut.PlaybackState == PlaybackState.Playing) - { - waveOut.Pause(); - } - if (State == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) + System.Threading.Thread.Sleep(10); + + if(AState == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) { + ms.Position = position; waveOut.Play(); } - if (State == AudioState.STOPPED) + if (AState == AudioState.PAUSED && waveOut.PlaybackState == PlaybackState.Playing) + { + position = ms.Position; + waveOut.Pause(); + } + if(AState == AudioState.STOPPED) { waveOut.Stop(); } } - State = AudioState.STOPPED; + + AState = AudioState.STOPPED; } } } @@ -96,24 +114,26 @@ namespace MusicPlayer { Song s = (Song) o; var response = WebRequest.Create(s.Url).GetResponse(); - State = AudioState.PLAYING; + + BState = BufferState.EMPTY; + using (var stream = response.GetResponseStream()) { byte[] buffer = new byte[65536]; // 64KB chunks int read; - while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) + BState = BufferState.BUFFERING; + AState = AudioState.WAITING; + + while ((read = stream.Read(buffer, 0, buffer.Length)) > 0 && AState != AudioState.STOPPED) { var pos = ms.Position; ms.Position = ms.Length; ms.Write(buffer, 0, read); ms.Position = pos; - if(State == AudioState.STOPPED) - { - stream.Close(); - return; - } } } + + BState = BufferState.DONE; } } From 85028d04a905dada3a569b210df20e8e77ff0949 Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Thu, 29 Oct 2015 22:29:52 +0100 Subject: [PATCH 03/21] Load data from server into views --- MusicPlayer/MusicPlayer/Main.cs | 41 +++++++++++++------- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 40 ++++++++++--------- MusicPlayer/MusicPlayer/MainForm.cs | 20 ++++++++++ 3 files changed, 70 insertions(+), 31 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs index e49c029..72f650a 100644 --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -31,21 +31,36 @@ namespace MusicPlayer private void Populate() { + form.AlbumListView.Items.Add(" Alle albums"); + foreach (Album a in this.api.GetAlbums()) + { + form.AlbumListView.Items.Add(a.albumnaam); + + } + form.ArtistListBox.Items.Add("Alle artiesten"); + foreach (Artist a in this.api.GetArtists()) + { + form.ArtistListBox.Items.Add(a.naam); + + } + table.Add(new Song("102", "Test Song 1", "Test Album 1", "Test Artist 1", api)); - - form.GenreListBox.Items.Add("Hardcore"); - form.GenreListBox.Items.Add("Hardstyle"); - form.GenreListBox.Items.Add("Pop"); - - form.ArtistListBox.Items.Add("Kygo"); - form.ArtistListBox.Items.Add("Monstercat"); - form.ArtistListBox.Items.Add("Mozart"); - - form.AlbumListView.Items.Add("Album 1"); - form.AlbumListView.Items.Add("Album 2"); - form.AlbumListView.Items.Add("Album 3"); - + table.Add(new Song("104", "Test Song 2", "Test Album 2", "Test Artist 2", api)); } + + public void ArtistFilter(string artist) + { + System.Console.Write(artist); + } + + public void AlbumFilter(string album) + { + System.Console.Write(album); + + } } + } + + diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 3f00825..10556f0 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -40,9 +40,9 @@ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); - this.PlayButton = new System.Windows.Forms.Button(); - this.PauseButton = new System.Windows.Forms.Button(); this.StopButton = new System.Windows.Forms.Button(); + this.PauseButton = new System.Windows.Forms.Button(); + this.PlayButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -69,6 +69,7 @@ this.SongsTableView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.SongsTableView.Size = new System.Drawing.Size(760, 148); this.SongsTableView.TabIndex = 0; + this.SongsTableView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.SongsTableView_CellDoubleClick); this.SongsTableView.SelectionChanged += new System.EventHandler(this.SongsTableView_SelectionChanged); // // GenreListBox @@ -80,6 +81,7 @@ this.GenreListBox.Size = new System.Drawing.Size(124, 134); this.GenreListBox.Sorted = true; this.GenreListBox.TabIndex = 1; + this.GenreListBox.SelectedIndexChanged += new System.EventHandler(this.GenreListBox_SelectedIndexChanged); // // AlbumListView // @@ -92,6 +94,7 @@ this.AlbumListView.Sorting = System.Windows.Forms.SortOrder.Ascending; this.AlbumListView.TabIndex = 2; this.AlbumListView.UseCompatibleStateImageBehavior = false; + this.AlbumListView.SelectedIndexChanged += new System.EventHandler(this.AlbumListView_SelectedIndexChanged); // // ArtistListBox // @@ -102,6 +105,7 @@ this.ArtistListBox.Size = new System.Drawing.Size(124, 134); this.ArtistListBox.Sorted = true; this.ArtistListBox.TabIndex = 3; + this.ArtistListBox.SelectedIndexChanged += new System.EventHandler(this.ArtistListBox_SelectedIndexChanged); // // MainPanel // @@ -169,15 +173,15 @@ this.ControlsPanel.Size = new System.Drawing.Size(784, 119); this.ControlsPanel.TabIndex = 4; // - // PlayButton + // StopButton // - this.PlayButton.Location = new System.Drawing.Point(12, 13); - this.PlayButton.Name = "PlayButton"; - this.PlayButton.Size = new System.Drawing.Size(75, 23); - this.PlayButton.TabIndex = 0; - this.PlayButton.Text = "Play"; - this.PlayButton.UseVisualStyleBackColor = true; - this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); + this.StopButton.Location = new System.Drawing.Point(203, 13); + this.StopButton.Name = "StopButton"; + this.StopButton.Size = new System.Drawing.Size(75, 23); + this.StopButton.TabIndex = 2; + this.StopButton.Text = "Stop"; + this.StopButton.UseVisualStyleBackColor = true; + this.StopButton.Click += new System.EventHandler(this.StopButton_Click); // // PauseButton // @@ -189,15 +193,15 @@ this.PauseButton.UseVisualStyleBackColor = true; this.PauseButton.Click += new System.EventHandler(this.PauseButton_Click); // - // StopButton + // PlayButton // - this.StopButton.Location = new System.Drawing.Point(203, 13); - this.StopButton.Name = "StopButton"; - this.StopButton.Size = new System.Drawing.Size(75, 23); - this.StopButton.TabIndex = 2; - this.StopButton.Text = "Stop"; - this.StopButton.UseVisualStyleBackColor = true; - this.StopButton.Click += new System.EventHandler(this.StopButton_Click); + this.PlayButton.Location = new System.Drawing.Point(12, 13); + this.PlayButton.Name = "PlayButton"; + this.PlayButton.Size = new System.Drawing.Size(75, 23); + this.PlayButton.TabIndex = 0; + this.PlayButton.Text = "Play"; + this.PlayButton.UseVisualStyleBackColor = true; + this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); // // MainForm // diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 1a8cae3..64199b5 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -51,5 +51,25 @@ namespace MusicPlayer { main.audio.Stop(); } + private void GenreListBox_SelectedIndexChanged(object sender, EventArgs e) + { + } + + private void ArtistListBox_SelectedIndexChanged(object sender, EventArgs e) + { + if (ArtistListBox.SelectedItems.Count != 0) + main.ArtistFilter(ArtistListBox.SelectedItems[0].ToString()); + } + + private void AlbumListView_SelectedIndexChanged(object sender, EventArgs e) + { + if(AlbumListView.SelectedItems.Count != 0) + main.AlbumFilter(AlbumListView.SelectedItems[0].ToString()); + } + + private void SongsTableView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) + { + main.audio.Play(SongsTableView.CurrentRow.DataBoundItem as Song); + } } } From 4f5aaee1252601d1606df9363fc50889fead49f0 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 29 Oct 2015 23:43:42 +0100 Subject: [PATCH 04/21] Added visuals for buffering and position --- MusicPlayer/MusicPlayer/AudioHandler.cs | 25 +++++++-- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 53 ++++++++++++++++++++ MusicPlayer/MusicPlayer/MainForm.cs | 15 +++++- MusicPlayer/MusicPlayer/MainForm.resx | 3 ++ 4 files changed, 89 insertions(+), 7 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index 8b2f9d7..72fa6a1 100644 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -17,6 +17,12 @@ namespace MusicPlayer public AudioState AState { get; set; } public BufferState BState { get; set; } + public int Buffered { get { return Math.Min((int)((bufpos / Length) * 100), 100); } } + public int Position { get { return Math.Min((int)((playpos / Length) * 100), 100); } } + public double Length { get; set; } + private long bufpos = 0; + private long playpos = 0; + private Stream ms; private Thread network; @@ -42,12 +48,14 @@ namespace MusicPlayer network.IsBackground = true; audio.IsBackground = true; - + Length = 1; + bufpos = 0; + playpos = 0; } public void Play(Song s) { - if (CurrentSong == s) + if (CurrentSong == s && AState == AudioState.PAUSED) AState = AudioState.PLAYING; else { @@ -85,27 +93,31 @@ namespace MusicPlayer { waveOut.Init(blockAlignedStream); waveOut.Play(); + while (waveOut.PlaybackState != PlaybackState.Stopped) { System.Threading.Thread.Sleep(10); if(AState == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) { - ms.Position = position; + blockAlignedStream.Position = position; waveOut.Play(); } if (AState == AudioState.PAUSED && waveOut.PlaybackState == PlaybackState.Playing) { - position = ms.Position; + position = blockAlignedStream.Position; waveOut.Pause(); } if(AState == AudioState.STOPPED) { waveOut.Stop(); } + + playpos = blockAlignedStream.Position; } AState = AudioState.STOPPED; + playpos = 0; } } } @@ -116,7 +128,7 @@ namespace MusicPlayer var response = WebRequest.Create(s.Url).GetResponse(); BState = BufferState.EMPTY; - + Length = response.ContentLength; using (var stream = response.GetResponseStream()) { byte[] buffer = new byte[65536]; // 64KB chunks @@ -130,6 +142,9 @@ namespace MusicPlayer ms.Position = ms.Length; ms.Write(buffer, 0, read); ms.Position = pos; + + + this.bufpos += buffer.Length; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 3f00825..69aec45 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.SongsTableView = new System.Windows.Forms.DataGridView(); this.GenreListBox = new System.Windows.Forms.ListBox(); @@ -43,6 +44,11 @@ this.PlayButton = new System.Windows.Forms.Button(); this.PauseButton = new System.Windows.Forms.Button(); this.StopButton = new System.Windows.Forms.Button(); + this.BufferBar = new System.Windows.Forms.ProgressBar(); + this.PositionBar = new System.Windows.Forms.ProgressBar(); + this.BufferLabel = new System.Windows.Forms.Label(); + this.PositionLabel = new System.Windows.Forms.Label(); + this.UpdateTimer = new System.Windows.Forms.Timer(this.components); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -160,6 +166,10 @@ // ControlsPanel // this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame; + this.ControlsPanel.Controls.Add(this.PositionLabel); + this.ControlsPanel.Controls.Add(this.BufferLabel); + this.ControlsPanel.Controls.Add(this.PositionBar); + this.ControlsPanel.Controls.Add(this.BufferBar); this.ControlsPanel.Controls.Add(this.StopButton); this.ControlsPanel.Controls.Add(this.PauseButton); this.ControlsPanel.Controls.Add(this.PlayButton); @@ -199,6 +209,43 @@ this.StopButton.UseVisualStyleBackColor = true; this.StopButton.Click += new System.EventHandler(this.StopButton_Click); // + // BufferBar + // + this.BufferBar.Location = new System.Drawing.Point(13, 60); + this.BufferBar.Name = "BufferBar"; + this.BufferBar.Size = new System.Drawing.Size(265, 23); + this.BufferBar.TabIndex = 3; + // + // PositionBar + // + this.PositionBar.Location = new System.Drawing.Point(13, 90); + this.PositionBar.Name = "PositionBar"; + this.PositionBar.Size = new System.Drawing.Size(265, 23); + this.PositionBar.TabIndex = 4; + // + // BufferLabel + // + this.BufferLabel.AutoSize = true; + this.BufferLabel.Location = new System.Drawing.Point(285, 60); + this.BufferLabel.Name = "BufferLabel"; + this.BufferLabel.Size = new System.Drawing.Size(35, 13); + this.BufferLabel.TabIndex = 5; + this.BufferLabel.Text = "Buffer"; + // + // PositionLabel + // + this.PositionLabel.AutoSize = true; + this.PositionLabel.Location = new System.Drawing.Point(285, 90); + this.PositionLabel.Name = "PositionLabel"; + this.PositionLabel.Size = new System.Drawing.Size(44, 13); + this.PositionLabel.TabIndex = 6; + this.PositionLabel.Text = "Position"; + // + // UpdateTimer + // + this.UpdateTimer.Interval = 600; + this.UpdateTimer.Tick += new System.EventHandler(this.UpdateTimer_Tick); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -218,6 +265,7 @@ this.MenuStrip.ResumeLayout(false); this.MenuStrip.PerformLayout(); this.ControlsPanel.ResumeLayout(false); + this.ControlsPanel.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -239,6 +287,11 @@ private System.Windows.Forms.Button PlayButton; private System.Windows.Forms.Button StopButton; private System.Windows.Forms.Button PauseButton; + private System.Windows.Forms.Label PositionLabel; + private System.Windows.Forms.Label BufferLabel; + private System.Windows.Forms.ProgressBar PositionBar; + private System.Windows.Forms.ProgressBar BufferBar; + private System.Windows.Forms.Timer UpdateTimer; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 1a8cae3..81d0438 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -17,6 +17,8 @@ namespace MusicPlayer { public partial class MainForm : Form { + Song testsong; + public Main main { get; set; @@ -29,12 +31,15 @@ namespace MusicPlayer private void MainForm_Load(object sender, EventArgs e) { - + UpdateTimer.Start(); } private void PlayButton_Click(object sender, EventArgs e) { - main.audio.Play(new Song("102", "Test", "Test", "Test", main.api)); + if (testsong == null) + testsong = new Song("917", "Test", "Test", "Test", main.api); + + main.audio.Play(testsong); } private void SongsTableView_SelectionChanged(object sender, EventArgs e) @@ -51,5 +56,11 @@ namespace MusicPlayer { main.audio.Stop(); } + + private void UpdateTimer_Tick(object sender, EventArgs e) + { + BufferBar.Value = main.audio.Buffered; + PositionBar.Value = main.audio.Position; + } } } diff --git a/MusicPlayer/MusicPlayer/MainForm.resx b/MusicPlayer/MusicPlayer/MainForm.resx index 2bbeee3..5faed31 100644 --- a/MusicPlayer/MusicPlayer/MainForm.resx +++ b/MusicPlayer/MusicPlayer/MainForm.resx @@ -120,6 +120,9 @@ 118, 17 + + 230, 22 + From 76f5753a6ede5baba87ab2adddbe270ae252e079 Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Fri, 30 Oct 2015 00:15:41 +0100 Subject: [PATCH 05/21] Finally dubble click on a song plays a song --- .gitattributes | 0 .gitignore | 0 MusicPlayer/MusicPlayer.sln | 0 MusicPlayer/MusicPlayer/APIHandler.cs | 0 MusicPlayer/MusicPlayer/Album.cs | 0 MusicPlayer/MusicPlayer/App.config | 0 MusicPlayer/MusicPlayer/Artist.cs | 0 MusicPlayer/MusicPlayer/AudioHandler.cs | 0 MusicPlayer/MusicPlayer/Form1.Designer.cs | 0 MusicPlayer/MusicPlayer/Form1.resx | 0 MusicPlayer/MusicPlayer/Main.cs | 21 +++++++++++-------- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 1 + MusicPlayer/MusicPlayer/MainForm.cs | 10 ++++++--- MusicPlayer/MusicPlayer/MainForm.resx | 0 MusicPlayer/MusicPlayer/MusicPlayer.csproj | 0 MusicPlayer/MusicPlayer/NetworkHandler.cs | 0 .../MusicPlayer/NotificationPopup.Designer.cs | 0 MusicPlayer/MusicPlayer/NotificationPopup.cs | 0 .../MusicPlayer/NotificationPopup.resx | 0 MusicPlayer/MusicPlayer/Program.cs | 0 .../MusicPlayer/Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 0 .../MusicPlayer/Properties/Resources.resx | 0 .../Properties/Settings.Designer.cs | 0 .../MusicPlayer/Properties/Settings.settings | 0 MusicPlayer/MusicPlayer/Song.cs | 0 MusicPlayer/MusicPlayer/SongsTable.cs | 3 ++- MusicPlayer/MusicPlayer/Year.cs | 0 MusicPlayer/MusicPlayer/packages.config | 0 README.md | 0 30 files changed, 22 insertions(+), 13 deletions(-) mode change 100644 => 100755 .gitattributes mode change 100644 => 100755 .gitignore mode change 100644 => 100755 MusicPlayer/MusicPlayer.sln mode change 100644 => 100755 MusicPlayer/MusicPlayer/APIHandler.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Album.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/App.config mode change 100644 => 100755 MusicPlayer/MusicPlayer/Artist.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/AudioHandler.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Form1.Designer.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Form1.resx mode change 100644 => 100755 MusicPlayer/MusicPlayer/Main.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/MainForm.Designer.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/MainForm.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/MainForm.resx mode change 100644 => 100755 MusicPlayer/MusicPlayer/MusicPlayer.csproj mode change 100644 => 100755 MusicPlayer/MusicPlayer/NetworkHandler.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/NotificationPopup.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/NotificationPopup.resx mode change 100644 => 100755 MusicPlayer/MusicPlayer/Program.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Properties/AssemblyInfo.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Properties/Resources.Designer.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Properties/Resources.resx mode change 100644 => 100755 MusicPlayer/MusicPlayer/Properties/Settings.Designer.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Properties/Settings.settings mode change 100644 => 100755 MusicPlayer/MusicPlayer/Song.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/SongsTable.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/Year.cs mode change 100644 => 100755 MusicPlayer/MusicPlayer/packages.config mode change 100644 => 100755 README.md diff --git a/.gitattributes b/.gitattributes old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer.sln b/MusicPlayer/MusicPlayer.sln old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Album.cs b/MusicPlayer/MusicPlayer/Album.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/App.config b/MusicPlayer/MusicPlayer/App.config old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Artist.cs b/MusicPlayer/MusicPlayer/Artist.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Form1.Designer.cs b/MusicPlayer/MusicPlayer/Form1.Designer.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Form1.resx b/MusicPlayer/MusicPlayer/Form1.resx old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs old mode 100644 new mode 100755 index 72f650a..592723f --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -25,13 +25,13 @@ namespace MusicPlayer audio = new AudioHandler(); table = new SongsTable(); form.SongsTableView.DataSource = table; - + form.SongsTableView.Columns[3].Visible = false; Populate(); } private void Populate() { - form.AlbumListView.Items.Add(" Alle albums"); + form.AlbumListView.Items.Add("Alle albums"); foreach (Album a in this.api.GetAlbums()) { form.AlbumListView.Items.Add(a.albumnaam); @@ -43,21 +43,24 @@ namespace MusicPlayer form.ArtistListBox.Items.Add(a.naam); } - - table.Add(new Song("102", "Test Song 1", "Test Album 1", "Test Artist 1", api)); - - table.Add(new Song("104", "Test Song 2", "Test Album 2", "Test Artist 2", api)); } public void ArtistFilter(string artist) { - System.Console.Write(artist); + table.Clear(); + api.GetSongsByArtist(artist).ForEach(s => + { + table.Add(s); + }); } public void AlbumFilter(string album) { - System.Console.Write(album); - + table.Clear(); + api.GetSongsByAlbum(album).ForEach(s => + { + table.Add(s); + }); } } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs old mode 100644 new mode 100755 index de81826..163f1ea --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -65,6 +65,7 @@ | System.Windows.Forms.AnchorStyles.Right))); this.SongsTableView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.SongsTableView.BackgroundColor = System.Drawing.SystemColors.Control; + this.SongsTableView.AutoGenerateColumns = true; this.SongsTableView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.SongsTableView.Location = new System.Drawing.Point(12, 153); this.SongsTableView.MultiSelect = false; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs old mode 100644 new mode 100755 index 37c82ec..cfaa441 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -77,13 +77,17 @@ namespace MusicPlayer private void AlbumListView_SelectedIndexChanged(object sender, EventArgs e) { if(AlbumListView.SelectedItems.Count != 0) - main.AlbumFilter(AlbumListView.SelectedItems[0].ToString()); + main.AlbumFilter(AlbumListView.SelectedItems[0].Text); } private void SongsTableView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { - main.audio.Play(SongsTableView.CurrentRow.DataBoundItem as Song); - + SongsTable s = new SongsTable(); + var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView; + var row = drv.Row as DataRow; + s.ImportRow(row); + System.Console.WriteLine((s.Rows[0][3] as Song).SongID); + main.audio.Play((s.Rows[0][3] as Song)); } } } diff --git a/MusicPlayer/MusicPlayer/MainForm.resx b/MusicPlayer/MusicPlayer/MainForm.resx old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/NetworkHandler.cs b/MusicPlayer/MusicPlayer/NetworkHandler.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.cs b/MusicPlayer/MusicPlayer/NotificationPopup.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.resx b/MusicPlayer/MusicPlayer/NotificationPopup.resx old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Properties/AssemblyInfo.cs b/MusicPlayer/MusicPlayer/Properties/AssemblyInfo.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Properties/Resources.Designer.cs b/MusicPlayer/MusicPlayer/Properties/Resources.Designer.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Properties/Resources.resx b/MusicPlayer/MusicPlayer/Properties/Resources.resx old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Properties/Settings.Designer.cs b/MusicPlayer/MusicPlayer/Properties/Settings.Designer.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Properties/Settings.settings b/MusicPlayer/MusicPlayer/Properties/Settings.settings old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/SongsTable.cs b/MusicPlayer/MusicPlayer/SongsTable.cs old mode 100644 new mode 100755 index 7c63801..e394711 --- a/MusicPlayer/MusicPlayer/SongsTable.cs +++ b/MusicPlayer/MusicPlayer/SongsTable.cs @@ -15,11 +15,12 @@ namespace MusicPlayer this.Columns.Add("Naam", typeof(string)); this.Columns.Add("Album", typeof(string)); this.Columns.Add("Artiest", typeof(string)); + this.Columns.Add("song", typeof(Song)); } public void Add(Song s) { - this.Rows.Add(s.Name, s.Album, s.Artist); + this.Rows.Add(s.Name, s.Album, s.Artist, s); } } diff --git a/MusicPlayer/MusicPlayer/Year.cs b/MusicPlayer/MusicPlayer/Year.cs old mode 100644 new mode 100755 diff --git a/MusicPlayer/MusicPlayer/packages.config b/MusicPlayer/MusicPlayer/packages.config old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 From 1c8bde4f1ee68628d63ccb300e35ab3edd5c81cb Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 00:17:21 +0100 Subject: [PATCH 06/21] Semi-fix/add seeking. Still a problem when seeking further than ~20% of song. --- MusicPlayer/MusicPlayer/AudioHandler.cs | 27 ++++- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 108 ++++++++++++------- MusicPlayer/MusicPlayer/MainForm.cs | 6 ++ 3 files changed, 98 insertions(+), 43 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index 72fa6a1..871aa1e 100644 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -12,16 +12,17 @@ namespace MusicPlayer { public class AudioHandler { - public enum AudioState { PLAYING, WAITING, STOPPED, PAUSED } + public enum AudioState { PLAYING, WAITING, STOPPED, PAUSED, SEEKING } public enum BufferState { EMPTY, BUFFERING, DONE } public AudioState AState { get; set; } public BufferState BState { get; set; } - public int Buffered { get { return Math.Min((int)((bufpos / Length) * 100), 100); } } - public int Position { get { return Math.Min((int)((playpos / Length) * 100), 100); } } - public double Length { get; set; } + public int Buffered { get { return Math.Min((int)((bufpos / (double)Length) * 100), 100); } } + public int Position { get { return Math.Min((int)((playpos / (double)Length) * 100), 100); } } + public long Length { get; set; } private long bufpos = 0; private long playpos = 0; + private long seek = 0; private Stream ms; @@ -67,6 +68,16 @@ namespace MusicPlayer } } + public void Seek(int position) + { + if (position >= Buffered-1) + return; + + seek = Length / 100 * position; + AState = AudioState.SEEKING; + + } + public void Stop() { CreateThreads(); @@ -108,7 +119,13 @@ namespace MusicPlayer position = blockAlignedStream.Position; waveOut.Pause(); } - if(AState == AudioState.STOPPED) + if (AState == AudioState.SEEKING) + { + blockAlignedStream.Position = seek - (seek % blockAlignedStream.WaveFormat.BlockAlign); + AState = AudioState.PLAYING; + waveOut.Play(); + } + if (AState == AudioState.STOPPED) { waveOut.Stop(); } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index de81826..39ea3f8 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -21,7 +21,7 @@ } #region Windows Form Designer generated code - + bool clicked = false; /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. @@ -41,18 +41,20 @@ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); - this.StopButton = new System.Windows.Forms.Button(); - this.BufferBar = new System.Windows.Forms.ProgressBar(); - this.PositionBar = new System.Windows.Forms.ProgressBar(); - this.BufferLabel = new System.Windows.Forms.Label(); this.PositionLabel = new System.Windows.Forms.Label(); - this.UpdateTimer = new System.Windows.Forms.Timer(this.components); + this.BufferLabel = new System.Windows.Forms.Label(); + this.PositionBar = new System.Windows.Forms.ProgressBar(); + this.BufferBar = new System.Windows.Forms.ProgressBar(); + this.StopButton = new System.Windows.Forms.Button(); this.PauseButton = new System.Windows.Forms.Button(); this.PlayButton = new System.Windows.Forms.Button(); + this.UpdateTimer = new System.Windows.Forms.Timer(this.components); + this.PositionTrackBar = new System.Windows.Forms.TrackBar(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); this.ControlsPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).BeginInit(); this.SuspendLayout(); // // SongsTableView @@ -170,6 +172,7 @@ // ControlsPanel // this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame; + this.ControlsPanel.Controls.Add(this.PositionTrackBar); this.ControlsPanel.Controls.Add(this.PositionLabel); this.ControlsPanel.Controls.Add(this.BufferLabel); this.ControlsPanel.Controls.Add(this.PositionBar); @@ -183,6 +186,38 @@ this.ControlsPanel.Size = new System.Drawing.Size(784, 119); this.ControlsPanel.TabIndex = 4; // + // PositionLabel + // + this.PositionLabel.AutoSize = true; + this.PositionLabel.Location = new System.Drawing.Point(285, 90); + this.PositionLabel.Name = "PositionLabel"; + this.PositionLabel.Size = new System.Drawing.Size(44, 13); + this.PositionLabel.TabIndex = 6; + this.PositionLabel.Text = "Position"; + // + // BufferLabel + // + this.BufferLabel.AutoSize = true; + this.BufferLabel.Location = new System.Drawing.Point(285, 60); + this.BufferLabel.Name = "BufferLabel"; + this.BufferLabel.Size = new System.Drawing.Size(35, 13); + this.BufferLabel.TabIndex = 5; + this.BufferLabel.Text = "Buffer"; + // + // PositionBar + // + this.PositionBar.Location = new System.Drawing.Point(13, 90); + this.PositionBar.Name = "PositionBar"; + this.PositionBar.Size = new System.Drawing.Size(265, 23); + this.PositionBar.TabIndex = 4; + // + // BufferBar + // + this.BufferBar.Location = new System.Drawing.Point(13, 60); + this.BufferBar.Name = "BufferBar"; + this.BufferBar.Size = new System.Drawing.Size(265, 23); + this.BufferBar.TabIndex = 3; + // // StopButton // this.StopButton.Location = new System.Drawing.Point(203, 13); @@ -213,43 +248,38 @@ this.PlayButton.UseVisualStyleBackColor = true; this.PlayButton.Click += new System.EventHandler(this.PlayButton_Click); // - // BufferBar - // - this.BufferBar.Location = new System.Drawing.Point(13, 60); - this.BufferBar.Name = "BufferBar"; - this.BufferBar.Size = new System.Drawing.Size(265, 23); - this.BufferBar.TabIndex = 3; - // - // PositionBar - // - this.PositionBar.Location = new System.Drawing.Point(13, 90); - this.PositionBar.Name = "PositionBar"; - this.PositionBar.Size = new System.Drawing.Size(265, 23); - this.PositionBar.TabIndex = 4; - // - // BufferLabel - // - this.BufferLabel.AutoSize = true; - this.BufferLabel.Location = new System.Drawing.Point(285, 60); - this.BufferLabel.Name = "BufferLabel"; - this.BufferLabel.Size = new System.Drawing.Size(35, 13); - this.BufferLabel.TabIndex = 5; - this.BufferLabel.Text = "Buffer"; - // - // PositionLabel - // - this.PositionLabel.AutoSize = true; - this.PositionLabel.Location = new System.Drawing.Point(285, 90); - this.PositionLabel.Name = "PositionLabel"; - this.PositionLabel.Size = new System.Drawing.Size(44, 13); - this.PositionLabel.TabIndex = 6; - this.PositionLabel.Text = "Position"; - // // UpdateTimer // this.UpdateTimer.Interval = 600; this.UpdateTimer.Tick += new System.EventHandler(this.UpdateTimer_Tick); // + // PositionTrackBar + // + this.PositionTrackBar.Location = new System.Drawing.Point(346, 13); + this.PositionTrackBar.Maximum = 100; + this.PositionTrackBar.Name = "PositionTrackBar"; + this.PositionTrackBar.Size = new System.Drawing.Size(426, 45); + this.PositionTrackBar.TabIndex = 7; + + PositionTrackBar.Scroll += (s,e) => + { + if (clicked) + return; + this.PositionTrackBar_ValueChanged(); + }; + PositionTrackBar.MouseDown += (s,e) => + { + clicked = true; + }; + PositionTrackBar.MouseUp += (s,e) => + { + if (!clicked) + return; + + clicked = false; + this.PositionTrackBar_ValueChanged(); + }; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -270,6 +300,7 @@ this.MenuStrip.PerformLayout(); this.ControlsPanel.ResumeLayout(false); this.ControlsPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.PositionTrackBar)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -296,6 +327,7 @@ private System.Windows.Forms.ProgressBar PositionBar; private System.Windows.Forms.ProgressBar BufferBar; private System.Windows.Forms.Timer UpdateTimer; + private System.Windows.Forms.TrackBar PositionTrackBar; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 37c82ec..7b68106 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -62,6 +62,7 @@ namespace MusicPlayer { BufferBar.Value = main.audio.Buffered; PositionBar.Value = main.audio.Position; + PositionTrackBar.Value = main.audio.Position; } private void GenreListBox_SelectedIndexChanged(object sender, EventArgs e) @@ -85,5 +86,10 @@ namespace MusicPlayer main.audio.Play(SongsTableView.CurrentRow.DataBoundItem as Song); } + + private void PositionTrackBar_ValueChanged() + { + main.audio.Seek(PositionTrackBar.Value); + } } } From 6090937072ba08591bf8aba881a17756129589dd Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Fri, 30 Oct 2015 00:25:27 +0100 Subject: [PATCH 07/21] Audio stops before playing another one --- MusicPlayer/MusicPlayer/MainForm.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 795d16a..0afae97 100755 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -83,6 +83,7 @@ namespace MusicPlayer private void SongsTableView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { + main.audio.Stop(); SongsTable s = new SongsTable(); var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView; var row = drv.Row as DataRow; From 35097e88b937ede78630437253b22011ebdb7f0c Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 00:45:35 +0100 Subject: [PATCH 08/21] Show timestamp. Play selected song with play button --- MusicPlayer/MusicPlayer/MainForm.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 795d16a..f6773c9 100755 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -36,15 +36,7 @@ namespace MusicPlayer private void PlayButton_Click(object sender, EventArgs e) { - if (testsong == null) - testsong = new Song("917", "Test", "Test", "Test", main.api); - - main.audio.Play(testsong); - } - - private void SongsTableView_SelectionChanged(object sender, EventArgs e) - { - DataGridViewSelectedRowCollection col = SongsTableView.SelectedRows; + SongsTableView_CellDoubleClick(sender, new DataGridViewCellEventArgs(0, 0)); } private void PauseButton_Click(object sender, EventArgs e) @@ -63,6 +55,8 @@ namespace MusicPlayer BufferBar.Value = main.audio.Buffered; PositionBar.Value = main.audio.Position; PositionTrackBar.Value = main.audio.Position; + LabelCurrentTime.Text = main.audio.CurrentTime; + LabelTotalTime.Text = main.audio.TotalTime; } private void GenreListBox_SelectedIndexChanged(object sender, EventArgs e) From 2d0b38e2d1548f6ec90f0db7eed9e307521c3d60 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 00:45:57 +0100 Subject: [PATCH 09/21] Display timestamps --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 77 +++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index f994a12..6ee5f5d 100755 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -41,6 +41,7 @@ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); + this.PositionTrackBar = new System.Windows.Forms.TrackBar(); this.PositionLabel = new System.Windows.Forms.Label(); this.BufferLabel = new System.Windows.Forms.Label(); this.PositionBar = new System.Windows.Forms.ProgressBar(); @@ -49,7 +50,8 @@ this.PauseButton = new System.Windows.Forms.Button(); this.PlayButton = new System.Windows.Forms.Button(); this.UpdateTimer = new System.Windows.Forms.Timer(this.components); - this.PositionTrackBar = new System.Windows.Forms.TrackBar(); + this.LabelCurrentTime = new System.Windows.Forms.Label(); + this.LabelTotalTime = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -67,7 +69,6 @@ | System.Windows.Forms.AnchorStyles.Right))); this.SongsTableView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.SongsTableView.BackgroundColor = System.Drawing.SystemColors.Control; - this.SongsTableView.AutoGenerateColumns = true; this.SongsTableView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.SongsTableView.Location = new System.Drawing.Point(12, 153); this.SongsTableView.MultiSelect = false; @@ -79,7 +80,6 @@ this.SongsTableView.Size = new System.Drawing.Size(760, 148); this.SongsTableView.TabIndex = 0; this.SongsTableView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.SongsTableView_CellDoubleClick); - this.SongsTableView.SelectionChanged += new System.EventHandler(this.SongsTableView_SelectionChanged); // // GenreListBox // @@ -173,6 +173,8 @@ // ControlsPanel // this.ControlsPanel.BackColor = System.Drawing.SystemColors.WindowFrame; + this.ControlsPanel.Controls.Add(this.LabelTotalTime); + this.ControlsPanel.Controls.Add(this.LabelCurrentTime); this.ControlsPanel.Controls.Add(this.PositionTrackBar); this.ControlsPanel.Controls.Add(this.PositionLabel); this.ControlsPanel.Controls.Add(this.BufferLabel); @@ -187,6 +189,32 @@ this.ControlsPanel.Size = new System.Drawing.Size(784, 119); this.ControlsPanel.TabIndex = 4; // + // PositionTrackBar + // + this.PositionTrackBar.Location = new System.Drawing.Point(346, 13); + this.PositionTrackBar.Maximum = 100; + this.PositionTrackBar.Name = "PositionTrackBar"; + this.PositionTrackBar.Size = new System.Drawing.Size(426, 45); + this.PositionTrackBar.TabIndex = 7; + PositionTrackBar.Scroll += (s, e) => + { + if (clicked) + return; + this.PositionTrackBar_ValueChanged(); + }; + PositionTrackBar.MouseDown += (s, e) => + { + clicked = true; + }; + PositionTrackBar.MouseUp += (s, e) => + { + if (!clicked) + return; + + clicked = false; + this.PositionTrackBar_ValueChanged(); + }; + // // PositionLabel // this.PositionLabel.AutoSize = true; @@ -254,32 +282,23 @@ this.UpdateTimer.Interval = 600; this.UpdateTimer.Tick += new System.EventHandler(this.UpdateTimer_Tick); // - // PositionTrackBar + // LabelCurrentTime // - this.PositionTrackBar.Location = new System.Drawing.Point(346, 13); - this.PositionTrackBar.Maximum = 100; - this.PositionTrackBar.Name = "PositionTrackBar"; - this.PositionTrackBar.Size = new System.Drawing.Size(426, 45); - this.PositionTrackBar.TabIndex = 7; - - PositionTrackBar.Scroll += (s,e) => - { - if (clicked) - return; - this.PositionTrackBar_ValueChanged(); - }; - PositionTrackBar.MouseDown += (s,e) => - { - clicked = true; - }; - PositionTrackBar.MouseUp += (s,e) => - { - if (!clicked) - return; - - clicked = false; - this.PositionTrackBar_ValueChanged(); - }; + this.LabelCurrentTime.AutoSize = true; + this.LabelCurrentTime.Location = new System.Drawing.Point(358, 60); + this.LabelCurrentTime.Name = "LabelCurrentTime"; + this.LabelCurrentTime.Size = new System.Drawing.Size(49, 13); + this.LabelCurrentTime.TabIndex = 8; + this.LabelCurrentTime.Text = "00:00:00"; + // + // LabelTotalTime + // + this.LabelTotalTime.AutoSize = true; + this.LabelTotalTime.Location = new System.Drawing.Point(693, 60); + this.LabelTotalTime.Name = "LabelTotalTime"; + this.LabelTotalTime.Size = new System.Drawing.Size(49, 13); + this.LabelTotalTime.TabIndex = 9; + this.LabelTotalTime.Text = "00:00:00"; // // MainForm // @@ -329,6 +348,8 @@ private System.Windows.Forms.ProgressBar BufferBar; private System.Windows.Forms.Timer UpdateTimer; private System.Windows.Forms.TrackBar PositionTrackBar; + private System.Windows.Forms.Label LabelTotalTime; + private System.Windows.Forms.Label LabelCurrentTime; } } From 52903849f2f7d59edabe5e1ecd95fbb0f7728d21 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 00:46:11 +0100 Subject: [PATCH 10/21] Timestamps. Attempt to fix seeking --- MusicPlayer/MusicPlayer/AudioHandler.cs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index 871aa1e..350cd13 100755 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -17,9 +17,12 @@ namespace MusicPlayer public AudioState AState { get; set; } public BufferState BState { get; set; } - public int Buffered { get { return Math.Min((int)((bufpos / (double)Length) * 100), 100); } } + public int Buffered { get { return Math.Min((int)((bufpos / (double)LengthBuffer) * 100), 100); } } public int Position { get { return Math.Min((int)((playpos / (double)Length) * 100), 100); } } - public long Length { get; set; } + public string CurrentTime { get; set; } + public string TotalTime { get; set; } + private long LengthBuffer { get; set; } + private long Length { get; set; } private long bufpos = 0; private long playpos = 0; private long seek = 0; @@ -41,6 +44,8 @@ namespace MusicPlayer AState = AudioState.STOPPED; BState = BufferState.EMPTY; + Thread.Sleep(11); + ms = new MemoryStream(); network = new Thread(LoadAudio); @@ -50,6 +55,7 @@ namespace MusicPlayer audio.IsBackground = true; Length = 1; + LengthBuffer = 1; bufpos = 0; playpos = 0; } @@ -98,8 +104,13 @@ namespace MusicPlayer long position = 0; ms.Position = position; - using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(ms)))) + Mp3FileReader mp3fr = new Mp3FileReader(ms); + Length = mp3fr.Length; + CurrentTime = mp3fr.CurrentTime + ""; + TotalTime = mp3fr.TotalTime + ""; + using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(mp3fr))) { + using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) { waveOut.Init(blockAlignedStream); @@ -131,6 +142,9 @@ namespace MusicPlayer } playpos = blockAlignedStream.Position; + Length = mp3fr.Length; + CurrentTime = mp3fr.CurrentTime + ""; + TotalTime = mp3fr.TotalTime + ""; } AState = AudioState.STOPPED; @@ -145,7 +159,7 @@ namespace MusicPlayer var response = WebRequest.Create(s.Url).GetResponse(); BState = BufferState.EMPTY; - Length = response.ContentLength; + LengthBuffer = response.ContentLength; using (var stream = response.GetResponseStream()) { byte[] buffer = new byte[65536]; // 64KB chunks From 5ad0fd72c2c0db81ace341f66e99982566308ae7 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 11:21:12 +0100 Subject: [PATCH 11/21] Fixed trackbar jumping while seeking. --- MusicPlayer/MusicPlayer/MainForm.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index f6773c9..b999e7e 100755 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -16,8 +16,7 @@ using System.Windows.Forms; namespace MusicPlayer { public partial class MainForm : Form - { - Song testsong; + { public Main main { @@ -54,7 +53,10 @@ namespace MusicPlayer { BufferBar.Value = main.audio.Buffered; PositionBar.Value = main.audio.Position; - PositionTrackBar.Value = main.audio.Position; + + if(!clicked) + PositionTrackBar.Value = main.audio.Position; + LabelCurrentTime.Text = main.audio.CurrentTime; LabelTotalTime.Text = main.audio.TotalTime; } From 8c988dd4752c0151963865819702f642ce284b1f Mon Sep 17 00:00:00 2001 From: Janco Kock Date: Fri, 30 Oct 2015 11:46:42 +0100 Subject: [PATCH 12/21] Added fancy notification popup to taskbar --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 63 +- MusicPlayer/MusicPlayer/MainForm.cs | 13 +- MusicPlayer/MusicPlayer/MainForm.resx | 994 ++++++++++++++++++ .../MusicPlayer/NotificationPopup.Designer.cs | 41 +- MusicPlayer/MusicPlayer/NotificationPopup.cs | 17 +- .../MusicPlayer/NotificationPopup.resx | 105 +- 6 files changed, 1146 insertions(+), 87 deletions(-) mode change 100755 => 100644 MusicPlayer/MusicPlayer/MainForm.Designer.cs mode change 100755 => 100644 MusicPlayer/MusicPlayer/MainForm.cs mode change 100755 => 100644 MusicPlayer/MusicPlayer/MainForm.resx mode change 100755 => 100644 MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs mode change 100755 => 100644 MusicPlayer/MusicPlayer/NotificationPopup.cs mode change 100755 => 100644 MusicPlayer/MusicPlayer/NotificationPopup.resx diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs old mode 100755 new mode 100644 index 6ee5f5d..48fcc18 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -41,6 +41,8 @@ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ControlsPanel = new System.Windows.Forms.Panel(); + this.LabelTotalTime = new System.Windows.Forms.Label(); + this.LabelCurrentTime = new System.Windows.Forms.Label(); this.PositionTrackBar = new System.Windows.Forms.TrackBar(); this.PositionLabel = new System.Windows.Forms.Label(); this.BufferLabel = new System.Windows.Forms.Label(); @@ -50,8 +52,7 @@ this.PauseButton = new System.Windows.Forms.Button(); this.PlayButton = new System.Windows.Forms.Button(); this.UpdateTimer = new System.Windows.Forms.Timer(this.components); - this.LabelCurrentTime = new System.Windows.Forms.Label(); - this.LabelTotalTime = new System.Windows.Forms.Label(); + this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -189,6 +190,24 @@ this.ControlsPanel.Size = new System.Drawing.Size(784, 119); this.ControlsPanel.TabIndex = 4; // + // LabelTotalTime + // + this.LabelTotalTime.AutoSize = true; + this.LabelTotalTime.Location = new System.Drawing.Point(693, 60); + this.LabelTotalTime.Name = "LabelTotalTime"; + this.LabelTotalTime.Size = new System.Drawing.Size(49, 13); + this.LabelTotalTime.TabIndex = 9; + this.LabelTotalTime.Text = "00:00:00"; + // + // LabelCurrentTime + // + this.LabelCurrentTime.AutoSize = true; + this.LabelCurrentTime.Location = new System.Drawing.Point(358, 60); + this.LabelCurrentTime.Name = "LabelCurrentTime"; + this.LabelCurrentTime.Size = new System.Drawing.Size(49, 13); + this.LabelCurrentTime.TabIndex = 8; + this.LabelCurrentTime.Text = "00:00:00"; + // // PositionTrackBar // this.PositionTrackBar.Location = new System.Drawing.Point(346, 13); @@ -196,24 +215,6 @@ this.PositionTrackBar.Name = "PositionTrackBar"; this.PositionTrackBar.Size = new System.Drawing.Size(426, 45); this.PositionTrackBar.TabIndex = 7; - PositionTrackBar.Scroll += (s, e) => - { - if (clicked) - return; - this.PositionTrackBar_ValueChanged(); - }; - PositionTrackBar.MouseDown += (s, e) => - { - clicked = true; - }; - PositionTrackBar.MouseUp += (s, e) => - { - if (!clicked) - return; - - clicked = false; - this.PositionTrackBar_ValueChanged(); - }; // // PositionLabel // @@ -282,23 +283,12 @@ this.UpdateTimer.Interval = 600; this.UpdateTimer.Tick += new System.EventHandler(this.UpdateTimer_Tick); // - // LabelCurrentTime + // notifyIcon1 // - this.LabelCurrentTime.AutoSize = true; - this.LabelCurrentTime.Location = new System.Drawing.Point(358, 60); - this.LabelCurrentTime.Name = "LabelCurrentTime"; - this.LabelCurrentTime.Size = new System.Drawing.Size(49, 13); - this.LabelCurrentTime.TabIndex = 8; - this.LabelCurrentTime.Text = "00:00:00"; - // - // LabelTotalTime - // - this.LabelTotalTime.AutoSize = true; - this.LabelTotalTime.Location = new System.Drawing.Point(693, 60); - this.LabelTotalTime.Name = "LabelTotalTime"; - this.LabelTotalTime.Size = new System.Drawing.Size(49, 13); - this.LabelTotalTime.TabIndex = 9; - this.LabelTotalTime.Text = "00:00:00"; + this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); + this.notifyIcon1.Text = "notifyIcon1"; + this.notifyIcon1.Visible = true; + this.notifyIcon1.Click += new System.EventHandler(this.notifyIcon1_Click); // // MainForm // @@ -350,6 +340,7 @@ private System.Windows.Forms.TrackBar PositionTrackBar; private System.Windows.Forms.Label LabelTotalTime; private System.Windows.Forms.Label LabelCurrentTime; + private System.Windows.Forms.NotifyIcon notifyIcon1; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs old mode 100755 new mode 100644 index b999e7e..fa563b7 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -16,8 +16,8 @@ using System.Windows.Forms; namespace MusicPlayer { public partial class MainForm : Form - { - + { + NotificationPopup p; public Main main { get; set; @@ -26,6 +26,7 @@ namespace MusicPlayer public MainForm() { InitializeComponent(); + p = new NotificationPopup(this); } private void MainForm_Load(object sender, EventArgs e) @@ -91,5 +92,13 @@ namespace MusicPlayer { main.audio.Seek(PositionTrackBar.Value); } + + private void notifyIcon1_Click(object sender, EventArgs e) + { + if (p.Visible) + p.Visible = false; + else + p.Visible = true; + } } } diff --git a/MusicPlayer/MusicPlayer/MainForm.resx b/MusicPlayer/MusicPlayer/MainForm.resx old mode 100755 new mode 100644 index 5faed31..ce9ff42 --- a/MusicPlayer/MusicPlayer/MainForm.resx +++ b/MusicPlayer/MusicPlayer/MainForm.resx @@ -123,7 +123,1001 @@ 230, 22 + + 352, 22 + + + + AAABAAEAgHAAAAEAIAAo5wAAFgAAACgAAACAAAAA4AAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABLSEgGUU1NQ1BOTrpQTk76UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/09OTvpPTk64UE9PQUpHRwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0tLFlBOTqdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NpU9J + SRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZS + UgVQTk6mUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NpE5LSwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUU1NQlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE9PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPTk65UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTk62AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NTfpQTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/09OTvkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+ + fv9+fn7/fn5+/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPTU3/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9+fn7/fn5+/35+ + fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/fn5+/35+fv9+fn7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9O + Tu5QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/09OTusAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5OnVBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UU5OmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPT08rUE5O+1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvpSTU0pAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8+PgJRTk53UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01NdUE1NQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk51UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1FNTXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT08ZUE5OiE5N + TcJQTk7QUE5O0VBOTtFQTk7RUE5O0VBOTtFQTk7oUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7oUE5O0VBOTtFQTk7RUE5O0VBOTtFQTk7QTkxMwU9N + TYdTSkoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + TndQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TncAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk5/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk5/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTn9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTn8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAUE5Of1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5OfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk5/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9MTH1QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/05MTH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1NdVBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/3qAgAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPVFQGUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OdAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOTk5rUE5O/FBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/U0xMFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTRdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvxRT09qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5O + TmJQTk75UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9RT083AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAUU1NOlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O+VBO + TmIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT09PUlBOTvRQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/09NTWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQTk5qUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk70UE1NUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABQTk42UE5O61BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NnQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBNTaBQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TupQTk41AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRPTxpQTk7hUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTU3eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT01N4VBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O4VFTUxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTtlQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + TvBPT08pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE9NTStQTk7wUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5Oq1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O+1BNTXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE1NdVBOTvxQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BNTaoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABRT09hUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5OtlBQUAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFhQUAlQTk63UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01NYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1QUBRPTU3/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7xUE1NMQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE9PM1BOTvJQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9STk4TAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBMTNlQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk6TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABQTk6XUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T05O2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUE5OaVBO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9OTk4aAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT05OHU9NTf9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9PTU1nAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABZWVkMT05O/FBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTsUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABPTk7JUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/FlaWgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5b + WwJQTk6kUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/09M + THQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUExMeFBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9RTk6jX1lZAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTkdQTk79UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O609PTzoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAFBOTj1QTk7sUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E5NTUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAT1BQEFBOTsFQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE1Nx1JPTxYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRTk4YUE5OyVBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7BVFBQDwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATkxMalBOTvxQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/T01NtVBMTA4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAASEtLD1BOTrhQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E9OTmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABYWVkBUE5O2lBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/TkxMwFVQUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLSxdQTk7CUE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU3ZOz4+AgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUFAzUE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5OzVFO + ThgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABOTU0aUE5OzlBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1JNTTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPTEyXUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O5E5MTDlFODgDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJUFACUU9PO1BOTudQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU2VAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5N + TRVPTU3aUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01N/VFOToxOS0seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUExMH1BO + To5QTk7+UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/T01N2VFRURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFPT09QTk70UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTuBQTk53AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTXlPTU3iUE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTvRQTk5NAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE5NTZZQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTEzzUE9PblBQUBBKSkoDVkxMAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFSUgFMSkoDUFFREFBNTXBOTEz0UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UExMlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBOTrtQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/E9OTqdRTk5gTUtLNk9NTSJQTU0TU1RUBQAAAAAAAAAAAAAAAAAAAABTVFQFUE1NE09N + TSNNTU02UE9PYVBOTqhQTk78UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/05OTroAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVk5ODE9MTLZQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTU32UE5O2VBO + TsNQTk6vUE5OplBOTp9QTk6fUE5OplBOTq9QTk7DUE5O2VBOTvdQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9OTU21UlJSDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1BQGk9M + TM1QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/Tk1NzFBQUBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVFBQHU5MTNhQTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/05M + TNdRU1McAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVE5OE05MTLtQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9OTEy6TlBQEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVBQD09OTpZQTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE1NlVFS + Ug8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFPT2lQTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1FOTmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFN + TTJOTEzXUE5O/VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/U5MTNdOT08xAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NTQtRTk52T05O6VBOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTuhQTk52UVFRCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABNTk4dUE5OkFBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk6PUU1NHQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUVJSF05O + TqhQTk74UE5O/VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/VBO + TvhOTk6nUU1NFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJMTCNOT0+DUE5OyVBOTu5PTU3/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9PTU3/UE5O7lBOTslOT0+DUkxMIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABTUlILUExMP05MTG1QTk6mUE5O4VBOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BO + Tv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7/UE5O/1BOTv9QTk7hUE5Opk5MTG1QTEw/U1JSCwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBP + TwhRT08QTk1NIlFNTVFQTk6AT05OsU5OTtVPTk7lTk5O9U5MTP9OTEz/Tk5O9U9OTuVOTk7VT05OsVBO + ToBRTU1RTk1NIlFPTxBQT08IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////8AAAf///////4AAA/////8AAAH///////+AAAD////+AAAB////////gAAA + f////gAAAf///////4AAAH////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf////// + /4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH/ + //////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8 + AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAA + P////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf////// + /4AAAD////wAAAH///////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH/ + //////+AAAA////8AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8 + AAAB////////gAAAP////AAAAf///////4AAAD////wAAAH///////+AAAA////8AAAB////////gAAA + P////AAAAf///////4AAAD////4AAAH///////+AAAB/////AAAB////////gAAA/////4AAAf////// + /4AAAf/////AAAH///////+AAAP//////+AB////////gAf////////gAf///////4AH////////4AH/ + //////+AB////////+AB////////gAf////////gAf///////4AH////////4AH///////+AB/////// + /+AB////////gAf////////gAf///////4AH////////4AH///////+AB////////+AB////////gAf/ + ///////gAf///////4AH////////4AH///////+AB////////+AB////////gAf////////gAf////// + /4AH////////4AH///////+AB////////+AB////////gAf////////gAf///////4AH////////4AD/ + //////8AB////////+AA////////AAf////////gAP///////wAH////////4AD///////8AB/////// + //AAf//////+AA/////////wAH///////gAP////////8AA///////wAD/////////gAP//////8AB// + ///////4AB//////+AAf////////+AAf//////gAH/////////wAD//////wAD/////////8AAf///// + 4AA//////////gAD/////8AAf/////////4AAf////+AAH//////////AAD/////AAD//////////wAA + f////gAA//////////+AAB////gAAf//////////wAAP///wAAP//////////8AAA///wAAD//////// + ///gAAB//gAAB///////////8AAAAAAAAA////////////gAAAAAAAAf///////////8AAAAAAAAP/// + /////////gAAAAAAAH////////////8AAAAAAAD/////////////wAAAAAAD/////////////+AAAAAA + B//////////////4AAAAAB///////////////AAAAAA///////////////8AAAAA//////////////// + wAAAA/////////////////wAAD//////////////////wAP///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////8= + + AAABAAEAgHAAAAEAIAAo5wAAFgAAACgAAACAAAAA4AAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs old mode 100755 new mode 100644 index 807c046..d733917 --- a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs +++ b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs @@ -30,18 +30,21 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NotificationPopup)); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); this.groupBox1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); this.SuspendLayout(); // // groupBox1 // this.groupBox1.BackColor = System.Drawing.Color.White; + this.groupBox1.Controls.Add(this.pictureBox4); this.groupBox1.Controls.Add(this.pictureBox3); this.groupBox1.Controls.Add(this.pictureBox2); this.groupBox1.Controls.Add(this.pictureBox1); @@ -49,11 +52,11 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // - // pictureBox1 + // pictureBox3 // - resources.ApplyResources(this.pictureBox1, "pictureBox1"); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.TabStop = false; + resources.ApplyResources(this.pictureBox3, "pictureBox3"); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.TabStop = false; // // pictureBox2 // @@ -61,11 +64,18 @@ this.pictureBox2.Name = "pictureBox2"; this.pictureBox2.TabStop = false; // - // pictureBox3 + // pictureBox1 // - resources.ApplyResources(this.pictureBox3, "pictureBox3"); - this.pictureBox3.Name = "pictureBox3"; - this.pictureBox3.TabStop = false; + resources.ApplyResources(this.pictureBox1, "pictureBox1"); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.TabStop = false; + // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + this.pictureBox4.Click += new System.EventHandler(this.pictureBox4_Click); // // NotificationPopup // @@ -79,10 +89,12 @@ this.Name = "NotificationPopup"; this.ShowIcon = false; this.ShowInTaskbar = false; + this.Shown += new System.EventHandler(this.NotificationPopup_Shown); this.groupBox1.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); this.ResumeLayout(false); } @@ -93,5 +105,6 @@ private System.Windows.Forms.PictureBox pictureBox3; private System.Windows.Forms.PictureBox pictureBox2; private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox4; } } \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.cs b/MusicPlayer/MusicPlayer/NotificationPopup.cs old mode 100755 new mode 100644 index 68d016f..0a0685e --- a/MusicPlayer/MusicPlayer/NotificationPopup.cs +++ b/MusicPlayer/MusicPlayer/NotificationPopup.cs @@ -12,9 +12,24 @@ namespace MusicPlayer { public partial class NotificationPopup : Form { - public NotificationPopup() + MainForm f; + public NotificationPopup(MainForm f) { InitializeComponent(); + this.f = f; + } + + private void NotificationPopup_Shown(object sender, EventArgs e) + { + System.Drawing.Rectangle workingRectangle = Screen.PrimaryScreen.WorkingArea; + this.Left = workingRectangle.Width - this.Width -10; + this.Top = workingRectangle.Height - this.Height -10; + this.Show(); + } + + private void pictureBox4_Click(object sender, EventArgs e) + { + f.WindowState = FormWindowState.Normal; } } } diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.resx b/MusicPlayer/MusicPlayer/NotificationPopup.resx old mode 100755 new mode 100644 index f8e6f4f..843ee94 --- a/MusicPlayer/MusicPlayer/NotificationPopup.resx +++ b/MusicPlayer/MusicPlayer/NotificationPopup.resx @@ -118,21 +118,60 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UITh4zTVoAAABr0lEQVRYR8WXQW7CMBRE - wxVY9AA9D0k4QXqCrqqqaqtKPQOVWHOgcgyWHIHCjPmmcRjiOInISE8B/+/xF9ixnaWoKJYVWINfsAcH - g5/Zxlhl6eMIhnOwAcdE2GduNmlCR/9cmdkQVnXPqJA4Aw9gB5RhH+hFz5kNo8UE8AiUyRjQWxeBAGGV - quOYcAwbtSEExvzZb7Gz4UIh0HfC/Ym2GG5iXoQGLjWVGONJtHXlf4niS/I6z/Pli/WV8Q5s3OCUCMZ4 - ta5DCjh6A75eZcIN3lxHk4inUNGA728VVLzbuBeJnBTWNOAmooINyk8bM5DODWhbJVsacCdTwTpfNl4g - tLe/WqGGT5M9E7idqqDn6mdPkfCrc4gWkOflh3n1kvKs4QqI/gUo4tv8AiE2yl/QaRK2FCHza0QnYedl - qIpQeQm4ZZj0ImoWoXISOJ8fRaCVehEq3hWzcCY9NqNzESrWkWAz6rkdl8+6Pc5iUYQnZjTe80DyY8OG - QmDSIxmZ/FA63bHciwmAVd7/YuKFRP8c42rmJhyezjNZ6Nj7cnq11IYKpv56vgXN6znbEq/nWXYCplmG - 3mQZHZoAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAHFSURBVFhH7ZVpTsMwEIUrwb16gcROgLBehZ2/SEWquAEC + tagcsEUqb+xxmqTjePlLn/Sk1uOZ+bKNJ0pV2wQ/TAIqS/0o5HmdAnDPPYJKgYgCQME7rh2tWIgYgFuu + mawYiACAWnCtbCmlV3Jt61GAolC/WusLrpUspeobqiHVdg4+glyImOZkAUAthompEJ7mGzyO5WBtD8C8 + cNQsF8LXvCj0KcWHL2YLMPzUyrI6xzqod5vhGYe9wlXOuzmAWaPWCYeNuhAOQBwyuJoGMQOBK3jj5aCw + /93mqDUeac3LPTkI2jw6XlHgDHte+W+0kDPzNXciCP550EEH/WeFhgFmySX2fDRNc8RLQU2n02NMzi8a + YrwkyvSmceiDwAy/2h0sakGFOeQV7UHet82hMV43HOoJPZ9ojwEgDyFw8l3vn2rqk8Ne2Svv5lQbOtg4 + bIS1ZxdvAcgOAtSe83z8lpLoiu3efq6DQI+XbqwHYK1Xuc2dqJnN2dWgmlj/6a6RBYA9JzV3kiAkhwCy + mjsRhHA3ew4A6CXXypZ027sOPgLfJxqj4QsnOeYdyIJAXvupjTkKgJwCgb1myMQ4GoAcA0F7pFzZ1fYP + Y4waC45g6MYAAAAASUVORK5CYII= + + NoControl + + + 227, 158 + + + 33, 32 + + + + 3 + + + pictureBox4 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAAd0SU1FB98KHRQhOHjNNWgAAAGvSURBVFhHxZdBbsIwFETDFVj0AD0PSThBeoKu + qqpqq0o9A5VYc6ByDJYcgcKM+aZxGOI4ichITwH/7/EX2LGdpagolhVYg1+wBweDn9nGWGXp4wiGc7AB + x0TYZ242aUJH/1yZ2RBWdc+okDgDD2AHlGEf6EXPmQ2jxQTwCJTJGNBbF4EAYZWq45hwDBu1IQTG/Nlv + sbPhQiHQd8L9ibYYbmJehAYuNZUY40m0deV/ieJL8jrP8+WL9ZXxDmzc4JQIxni1rkMKOHoDvl5lwg3e + XEeTiKdQ0YDvbxVUvNu4F4mcFNY04Caigg3KTxszkM4NaFslWxpwJ1PBOl82XiC0t79aoYZPkz0TuJ2q + oOfqZ0+R8KtziBaQ5+WHefWS8qzhCoj+BSji2/wCITbKX9BpErYUIfNrRCdh52WoilB5CbhlmPQiahah + chI4nx9FoJV6ESreFbNwJj02o3MRKtaRYDPquR2Xz7o9zmJRhCdmNN7zQPJjw4ZCYNIjGZn8UDrdsdyL + CYBV3v9i4oVE/xzjauYmHJ7OM1no2PtyerXUhgqm/nq+Bc3rOdsSr+dZdgKmWYbeZBkdmgAAAABJRU5E + rkJggg== + + NoControl @@ -142,7 +181,6 @@ 33, 32 - 2 @@ -156,20 +194,20 @@ groupBox1 - 0 + 1 - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UIRU9EmkdAAABx0lEQVRYR81XS26DMBDl - EJGSdaXeoLkG0C7KtZIDZJWTdNlK6S2yzA2atu8NM9S4JnyMS5/0NMYzfjOAMXbWh6IotcX2YwUewHfw - Al6VbLOPvkrDGa+tCbDBsBvwCH6NJMdsqJHnPzcxCBhodqdiMdy7mr1gILgCz2BIcAqptSrLJ83SAQSR - dyDfa0gohtSEdkcRcNqdp0hupDZzaFZFnjfvfM7H3sVzndObmHDcmnCfgb4Y7jRt8+j5qYUCXd6Db15f - DNfNU8BF73deR0rsFpyjkKNKimgooEUNlSemloW8mn8KTYjLazDApQQ7QJ/ZmEIqCnD9DjlblGwBwGd2 - SiEHDuRPJORsUbLcAGLMjinkxAH8k4WcLYr6ACDW7APYV8iFgYNWPlEdAYwxyyfyYjoer/+igFSvYMhc - kFew+CRc/DNcciF6NpGQs0UJBNA2G5NYKEIELpb7GaFBLvI7BqUGAS72jtNnug0JYRsDOP5sS1YUheRs - AAeZelP6Af7elBq4ZYYz1bacyamt2TqgRSQ5mICapQcWCDvH0UwmHKxoDoZzVuDnMvVwuq41vAk3Bu4B - AoJ2PD+B/vGcffTVyyuAtra6kGXfchVyMfY7IlMAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAAd0SU1FB98KHRQhFT0SaR0AAAHHSURBVFhHzVdLboMwEOUQkZJ1pd6guQbQLsq1 + kgNklZN02UrpLbLMDZq27w0z1LgmfIxLn/Q0xjN+M4AxdtaHoii1xfZjBR7Ad/ACXpVss4++SsMZr60J + sMGwG/AIfo0kx2yokec/NzEIGGh2p2Ix3LuavWAguALPYEhwCqm1KssnzdIBBJF3IN9rSCiG1IR2RxFw + 2p2nSG6kNnNoVkWeN+98zsfexXOd05uYcNyacJ+BvhjuNG3z6PmphQJd3oNvXl8M181TwEXvd15HSuwW + nKOQo0qKaCigRQ2VJ6aWhbyafwpNiMtrMMClBDtAn9mYQioKcP0OOVuUbAHAZ3ZKIQcO5E8k5GxRstwA + YsyOKeTEAfyThZwtivoAINbsA9hXyIWBg1Y+UR0BjDHLJ/JiOh6v/6KAVK9gyFyQV7D4JFz8M1xyIXo2 + kZCzRQkE0DYbk1goQgQulvsZoUEu8jsGpQYBLvaO02e6DQlhGwM4/mxLVhSF5GwAB5l6U/oB/t6UGrhl + hjPVtpzJqa3ZOqBFJDmYgJqlBxYIO8fRTCYcrGgOhnNW4Ocy9XC6rjW8CTcG7gECgnY8P4H+8Zx99NXL + K4C2trqQZd9yFXIx9jsiUwAAAABJRU5ErkJggg== @@ -194,20 +232,19 @@ groupBox1 - 1 + 2 - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffCh0UHx1yDPpSAAABo0lEQVRYR8WXTW7CMBCF - wxVY9AA9D4ScID1BV1VVFVSpZ6ASaw5Ej8GSI1D63nRME2si/8SQJ30ieMbPI7Bju0pRXTct2IFvcAJn - hc9sY6zV9DJaLOo5TPfgkgj7zNUmTejoPr/UbAzbrmdQSJyBB3AElmEO9KLnTIexxQTwCCyTEtDbLgIB - wiqtjiXhGDqqJwRK/uxDHHW4vhDImXA/RlsMMjGv0qVmJUawerbbg/wvUXzJWecC+y+Xq08rFmAvg1NG - MBq1yCpCOuKBr1czIQYxUWUU0bIAvr+tYBQ69lWJRexYADcRK0iCs1zH7SmhiAML4E5mBQX1HBRyzDdb - ZBEnGnA7tYKC+mUJRawtzw7nmxaA/u++n4cUcJO/AO0fXZ8B5C8oPgnxdtxYuQYyCYsuQ7SFfvYusgyL - vYjw/c2PB/g7PxqBaMQAwvOrHwuhXaXzyM2oebFiAXqb0YjtuHky2mLon5jRsPUSYihzIHFCYNIjGZn8 - UDrdsdyJCYBV3v9i4oRE95kzMX3Srma+0PH+l9MhwdBdzw/Av56zLfF6XlW/G66G3g3Cfq0AAAAASUVO - RK5CYII= + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAAd0SU1FB98KHRQfHXIM+lIAAAGjSURBVFhHxZdNbsIwEIXDFVj0AD0PhJwgPUFX + VVUVVKlnoBJrDkSPwZIjUPredEwTayL/xJAnfSJ4xs8jsGO7SlFdNy3YgW9wAmeFz2xjrNX0Mlos6jlM + 9+CSCPvM1SZN6Og+v9RsDNuuZ1BInIEHcASWYQ70oudMh7HFBPAILJMS0NsuAgHCKq2OJeEYOqonBEr+ + 7EMcdbi+EMiZcD9GWwwyMa/SpWYlRrB6ttuD/C9RfMlZ5wL7L5erTysWYC+DU0YwGrXIKkI64oGvVzMh + BjFRZRTRsgC+v61gFDr2VYlF7FgANxErSIKzXMftKaGIAwvgTmYFBfUcFHLMN1tkEScacDu1goL6ZQlF + rC3PDuebFoD+776fhxRwk78A7R9dnwHkLyg+CfF23Fi5BjIJiy5DtIV+9i6yDIu9iPD9zY8H+Ds/GoFo + xADC86sfC6FdpfPIzah5sWIBepvRiO24eTLaYuifmNGw9RJiKHMgcUJg0iMZmfxQOt2x3IkJgFXe/2Li + hET3mTMxfdKuZr7Q8f6X0yHB0F3PD8C/nrMt8XpeVb8brobeDcJ+rQAAAABJRU5ErkJggg== @@ -229,7 +266,7 @@ groupBox1 - 2 + 3 12, 12 From e6d4eacd1c9f42ebed8a10e924bd445d0dd0f56b Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 15:14:32 +0100 Subject: [PATCH 13/21] Fix seeking after SOMEONE broke it :p --- MusicPlayer/MusicPlayer/MainForm.cs | 34 ++++++++++++++++--- .../MusicPlayer/NotificationPopup.Designer.cs | 21 ++++++------ MusicPlayer/MusicPlayer/NotificationPopup.cs | 5 +++ .../MusicPlayer/NotificationPopup.resx | 20 +++++------ 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index fa563b7..65a27ec 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -26,6 +26,26 @@ namespace MusicPlayer public MainForm() { InitializeComponent(); + + PositionTrackBar.Scroll += (s, e) => + { + if (clicked) + return; + this.PositionTrackBar_ValueChanged(); + }; + PositionTrackBar.MouseDown += (s, e) => + { + clicked = true; + }; + PositionTrackBar.MouseUp += (s, e) => + { + if (!clicked) + return; + + clicked = false; + this.PositionTrackBar_ValueChanged(); + }; + p = new NotificationPopup(this); } @@ -81,11 +101,15 @@ namespace MusicPlayer private void SongsTableView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { SongsTable s = new SongsTable(); - var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView; - var row = drv.Row as DataRow; - s.ImportRow(row); - System.Console.WriteLine((s.Rows[0][3] as Song).SongID); - main.audio.Play((s.Rows[0][3] as Song)); + if(SongsTableView.SelectedRows.Count > 0) + { + var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView; + var row = drv.Row as DataRow; + s.ImportRow(row); + System.Console.WriteLine((s.Rows[0][3] as Song).SongID); + main.audio.Play((s.Rows[0][3] as Song)); + } + } private void PositionTrackBar_ValueChanged() diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs index d733917..2e4d065 100644 --- a/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs +++ b/MusicPlayer/MusicPlayer/NotificationPopup.Designer.cs @@ -30,15 +30,15 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NotificationPopup)); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); this.pictureBox3 = new System.Windows.Forms.PictureBox(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.pictureBox4 = new System.Windows.Forms.PictureBox(); this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); this.SuspendLayout(); // // groupBox1 @@ -52,6 +52,13 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // pictureBox4 + // + resources.ApplyResources(this.pictureBox4, "pictureBox4"); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.TabStop = false; + this.pictureBox4.Click += new System.EventHandler(this.pictureBox4_Click); + // // pictureBox3 // resources.ApplyResources(this.pictureBox3, "pictureBox3"); @@ -70,13 +77,6 @@ this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.TabStop = false; // - // pictureBox4 - // - resources.ApplyResources(this.pictureBox4, "pictureBox4"); - this.pictureBox4.Name = "pictureBox4"; - this.pictureBox4.TabStop = false; - this.pictureBox4.Click += new System.EventHandler(this.pictureBox4_Click); - // // NotificationPopup // resources.ApplyResources(this, "$this"); @@ -90,11 +90,12 @@ this.ShowIcon = false; this.ShowInTaskbar = false; this.Shown += new System.EventHandler(this.NotificationPopup_Shown); + this.Leave += new System.EventHandler(this.NotificationPopup_Leave); this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); this.ResumeLayout(false); } diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.cs b/MusicPlayer/MusicPlayer/NotificationPopup.cs index 0a0685e..28c31c8 100644 --- a/MusicPlayer/MusicPlayer/NotificationPopup.cs +++ b/MusicPlayer/MusicPlayer/NotificationPopup.cs @@ -31,5 +31,10 @@ namespace MusicPlayer { f.WindowState = FormWindowState.Normal; } + + private void NotificationPopup_Leave(object sender, EventArgs e) + { + this.Visible = false; + } } } diff --git a/MusicPlayer/MusicPlayer/NotificationPopup.resx b/MusicPlayer/MusicPlayer/NotificationPopup.resx index 843ee94..4a1b2ed 100644 --- a/MusicPlayer/MusicPlayer/NotificationPopup.resx +++ b/MusicPlayer/MusicPlayer/NotificationPopup.resx @@ -120,16 +120,16 @@ - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAAAHFSURBVFhH7ZVpTsMwEIUrwb16gcROgLBehZ2/SEWquAEC - tagcsEUqb+xxmqTjePlLn/Sk1uOZ+bKNJ0pV2wQ/TAIqS/0o5HmdAnDPPYJKgYgCQME7rh2tWIgYgFuu - mawYiACAWnCtbCmlV3Jt61GAolC/WusLrpUspeobqiHVdg4+glyImOZkAUAthompEJ7mGzyO5WBtD8C8 - cNQsF8LXvCj0KcWHL2YLMPzUyrI6xzqod5vhGYe9wlXOuzmAWaPWCYeNuhAOQBwyuJoGMQOBK3jj5aCw - /93mqDUeac3LPTkI2jw6XlHgDHte+W+0kDPzNXciCP550EEH/WeFhgFmySX2fDRNc8RLQU2n02NMzi8a - YrwkyvSmceiDwAy/2h0sakGFOeQV7UHet82hMV43HOoJPZ9ojwEgDyFw8l3vn2rqk8Ne2Svv5lQbOtg4 - bIS1ZxdvAcgOAtSe83z8lpLoiu3efq6DQI+XbqwHYK1Xuc2dqJnN2dWgmlj/6a6RBYA9JzV3kiAkhwCy - mjsRhHA3ew4A6CXXypZ027sOPgLfJxqj4QsnOeYdyIJAXvupjTkKgJwCgb1myMQ4GoAcA0F7pFzZ1fYP - Y4waC45g6MYAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + EwAACxMBAJqcGAAAAcVJREFUWEftlWlOwzAQhSvBvXqBxE6AsF6Fnb9IRaq4AQK1qBywRSpv7HGapON4 + +Uuf9KTW45n5so0nSlXbBD9MAipL/SjkeZ0CcM89gkqBiAJAwTuuHa1YiBiAW66ZrBiIAIBacK1sKaVX + cm3rUYCiUL9a6wuulSyl6huqIdV2Dj6CXIiY5mQBQC2GiakQnuYbPI7lYG0PwLxw1CwXwte8KPQpxYcv + Zgsw/NTKsjrHOqh3m+EZh73CVc67OYBZo9YJh426EA5AHDK4mgYxA4EreOPloLD/3eaoNR5pzcs9OQja + PDpeUeAMe175b7SQM/M1dyII/nnQQQf9Z4WGAWbJJfZ8NE1zxEtBTafTY0zOLxpivCTK9KZx6IPADL/a + HSxqQYU55BXtQd63zaExXjcc6gk9n2iPASAPIXDyXe+fauqTw17ZK+/mVBs62DhshLVnF28ByA4C1J7z + fPyWkuiK7d5+roNAj5durAdgrVe5zZ2omc3Z1aCaWP/prpEFgD0nNXeSICSHALKaOxGEcDd7DgDoJdfK + lnTbuw4+At8nGqPhCyc55h3IgkBe+6mNOQqAnAKBvWbIxDgagBwDQXukXNnV9g9jjBoLjmDoxgAAAABJ + RU5ErkJggg== From 41dd9951755948c64264895b5849322a6739a1ba Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 16:48:33 +0100 Subject: [PATCH 14/21] New time handling in song --- MusicPlayer/MusicPlayer/APIHandler.cs | 2 +- MusicPlayer/MusicPlayer/AudioHandler.cs | 43 ++++++++++++++++++------- MusicPlayer/MusicPlayer/MainForm.cs | 4 +-- MusicPlayer/MusicPlayer/Program.cs | 8 ++--- MusicPlayer/MusicPlayer/Song.cs | 5 ++- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index a954496..bea2825 100755 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -55,7 +55,7 @@ namespace MusicPlayer dynamic songs = o["songs"]; for (int i = 0; i < songs.Count; i++) { - songslist.Add(new Song(songs[i][0].ToString(), songs[i][3].ToString(), songs[i][5].ToString(), songs[i][4].ToString(), this)); + songslist.Add(new Song(songs[i][0].ToString(), songs[i][3].ToString(), songs[i][5].ToString(), songs[i][4].ToString(), songs[i][1].ToString(), (int)songs[i][9], this)); } } return songslist; diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index 350cd13..b20b580 100755 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -18,13 +18,19 @@ namespace MusicPlayer public BufferState BState { get; set; } public int Buffered { get { return Math.Min((int)((bufpos / (double)LengthBuffer) * 100), 100); } } - public int Position { get { return Math.Min((int)((playpos / (double)Length) * 100), 100); } } - public string CurrentTime { get; set; } - public string TotalTime { get; set; } private long LengthBuffer { get; set; } - private long Length { get; set; } private long bufpos = 0; + + + public int Position { get { return Math.Min((int)((playpos / (double)Length) * 100), 100); } } + private long Length { get; set; } private long playpos = 0; + + + public int CurrentTime { get; set; } + + public int TotalTime { get { return CurrentSong != null ? CurrentSong.Seconds : 0; } } + private long seek = 0; private Stream ms; @@ -44,6 +50,8 @@ namespace MusicPlayer AState = AudioState.STOPPED; BState = BufferState.EMPTY; + CurrentSong = null; + Thread.Sleep(11); ms = new MemoryStream(); @@ -58,6 +66,7 @@ namespace MusicPlayer LengthBuffer = 1; bufpos = 0; playpos = 0; + CurrentTime = 0; } public void Play(Song s) @@ -105,9 +114,6 @@ namespace MusicPlayer ms.Position = position; Mp3FileReader mp3fr = new Mp3FileReader(ms); - Length = mp3fr.Length; - CurrentTime = mp3fr.CurrentTime + ""; - TotalTime = mp3fr.TotalTime + ""; using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(mp3fr))) { @@ -116,6 +122,9 @@ namespace MusicPlayer waveOut.Init(blockAlignedStream); waveOut.Play(); + Length = CurrentSong.Seconds * waveOut.OutputWaveFormat.AverageBytesPerSecond; + CurrentTime = (int)(ms.Position / waveOut.OutputWaveFormat.AverageBytesPerSecond); + while (waveOut.PlaybackState != PlaybackState.Stopped) { System.Threading.Thread.Sleep(10); @@ -142,13 +151,13 @@ namespace MusicPlayer } playpos = blockAlignedStream.Position; - Length = mp3fr.Length; - CurrentTime = mp3fr.CurrentTime + ""; - TotalTime = mp3fr.TotalTime + ""; + CurrentTime = (int)(playpos / waveOut.OutputWaveFormat.AverageBytesPerSecond); + } AState = AudioState.STOPPED; playpos = 0; + CurrentTime = 0; } } } @@ -156,7 +165,19 @@ namespace MusicPlayer private void LoadAudio(object o) { Song s = (Song) o; - var response = WebRequest.Create(s.Url).GetResponse(); + WebResponse response = null; + + try + { + response = WebRequest.Create(s.Url).GetResponse(); + } + catch(Exception e) + { + BState = BufferState.EMPTY; + AState = AudioState.STOPPED; + return; + } + BState = BufferState.EMPTY; LengthBuffer = response.ContentLength; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index 65a27ec..bf8c68e 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -78,8 +78,8 @@ namespace MusicPlayer if(!clicked) PositionTrackBar.Value = main.audio.Position; - LabelCurrentTime.Text = main.audio.CurrentTime; - LabelTotalTime.Text = main.audio.TotalTime; + LabelCurrentTime.Text = main.audio.CurrentTime + ""; + LabelTotalTime.Text = main.audio.TotalTime + ""; } private void GenreListBox_SelectedIndexChanged(object sender, EventArgs e) diff --git a/MusicPlayer/MusicPlayer/Program.cs b/MusicPlayer/MusicPlayer/Program.cs index aca8d84..8e609c8 100755 --- a/MusicPlayer/MusicPlayer/Program.cs +++ b/MusicPlayer/MusicPlayer/Program.cs @@ -27,10 +27,10 @@ namespace MusicPlayer // { // Console.WriteLine(s.Name); // }); - api.GetSongsByGenre("Melodic Death Metal").ForEach(s => - { - Console.WriteLine(s.Name); - }); +// api.GetSongsByGenre("Melodic Death Metal").ForEach(s => +// { +// Console.WriteLine(s.Name); +// }); // api.GetSongsByAlbum("Stronger").ForEach(s => // { // Console.WriteLine(s.Name); diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index a44b6cf..498d5bb 100755 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -12,18 +12,21 @@ namespace MusicPlayer public string Name { get; set; } public string Album { get; set; } public string Artist { get; set; } + public string Genre { get; set; } public string Url { get { return GetURL(); } set { SetURL(value); } } + public int Seconds { get; set; } private APIHandler api; private string url; - public Song(string songid, string name, string album, string artist, APIHandler api) + public Song(string songid, string name, string album, string artist, string genre, int seconds, APIHandler api) { SongID = songid; Name = name; Album = album; Artist = artist; + Seconds = seconds; this.api = api; From 9a01b9e8709b8e52d66f113eba9bf2fd9a7be1c4 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 17:37:53 +0100 Subject: [PATCH 15/21] Attempt fix seeking (Again) --- MusicPlayer/MusicPlayer/AudioHandler.cs | 17 ++++++++++------- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index b20b580..b9ccf9e 100755 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -106,14 +106,14 @@ namespace MusicPlayer private void PlayAudio() { AState = AudioState.WAITING; - while (ms.Length < 65536 * 10 && BState != BufferState.DONE) - Thread.Sleep(1000); + while (ms.Length < 65536 * 4 * 10 && BState != BufferState.DONE) + Thread.Sleep(75); AState = AudioState.PLAYING; long position = 0; - ms.Position = position; Mp3FileReader mp3fr = new Mp3FileReader(ms); + using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(mp3fr))) { @@ -141,15 +141,17 @@ namespace MusicPlayer } if (AState == AudioState.SEEKING) { - blockAlignedStream.Position = seek - (seek % blockAlignedStream.WaveFormat.BlockAlign); + blockAlignedStream.Seek(seek - (seek % blockAlignedStream.WaveFormat.BlockAlign), SeekOrigin.Begin); AState = AudioState.PLAYING; - waveOut.Play(); + //waveOut.Play(); } if (AState == AudioState.STOPPED) { waveOut.Stop(); } + Console.WriteLine(waveOut.PlaybackState + " | " + blockAlignedStream.Position + " | " + ms.Position); + playpos = blockAlignedStream.Position; CurrentTime = (int)(playpos / waveOut.OutputWaveFormat.AverageBytesPerSecond); @@ -183,7 +185,8 @@ namespace MusicPlayer LengthBuffer = response.ContentLength; using (var stream = response.GetResponseStream()) { - byte[] buffer = new byte[65536]; // 64KB chunks + //byte[] buffer = new byte[65536]; // 64KB chunks + byte[] buffer = new byte[65536*4]; // 256KB chunks int read; BState = BufferState.BUFFERING; AState = AudioState.WAITING; @@ -196,7 +199,7 @@ namespace MusicPlayer ms.Position = pos; - this.bufpos += buffer.Length; + this.bufpos = ms.Length; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 48fcc18..549953e 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -280,7 +280,7 @@ // // UpdateTimer // - this.UpdateTimer.Interval = 600; + this.UpdateTimer.Interval = 150; this.UpdateTimer.Tick += new System.EventHandler(this.UpdateTimer_Tick); // // notifyIcon1 From 9bec1974f5b38a406f7fcf888e10bb8983afe2ea Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Fri, 30 Oct 2015 18:25:25 +0100 Subject: [PATCH 16/21] Reload mp3 stream when done buffering --- MusicPlayer/MusicPlayer/AudioHandler.cs | 31 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/MusicPlayer/MusicPlayer/AudioHandler.cs b/MusicPlayer/MusicPlayer/AudioHandler.cs index b20b580..e40d177 100755 --- a/MusicPlayer/MusicPlayer/AudioHandler.cs +++ b/MusicPlayer/MusicPlayer/AudioHandler.cs @@ -103,20 +103,15 @@ namespace MusicPlayer AState = AudioState.PAUSED; } - private void PlayAudio() + private void StreamFromMP3(Stream s, long pos, bool firstrun) { - AState = AudioState.WAITING; - while (ms.Length < 65536 * 10 && BState != BufferState.DONE) - Thread.Sleep(1000); - AState = AudioState.PLAYING; - long position = 0; - ms.Position = position; + Mp3FileReader mp3fr = new Mp3FileReader(ms); using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(mp3fr))) { - + blockAlignedStream.Position = pos; using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) { waveOut.Init(blockAlignedStream); @@ -129,7 +124,7 @@ namespace MusicPlayer { System.Threading.Thread.Sleep(10); - if(AState == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) + if (AState == AudioState.PLAYING && waveOut.PlaybackState == PlaybackState.Paused) { blockAlignedStream.Position = position; waveOut.Play(); @@ -149,6 +144,13 @@ namespace MusicPlayer { waveOut.Stop(); } + if (BState == BufferState.DONE && firstrun ) + { + position = mp3fr.Position; + mp3fr.Close(); + StreamFromMP3(ms,position, false); + break; + } playpos = blockAlignedStream.Position; CurrentTime = (int)(playpos / waveOut.OutputWaveFormat.AverageBytesPerSecond); @@ -162,6 +164,17 @@ namespace MusicPlayer } } + private void PlayAudio() + { + AState = AudioState.WAITING; + while (ms.Length < 65536 * 10 && BState != BufferState.DONE) + Thread.Sleep(1000); + AState = AudioState.PLAYING; + + StreamFromMP3(ms,0, true); + + } + private void LoadAudio(object o) { Song s = (Song) o; From c0d5932f09dec1baf956c4e93a242885afbf89df Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 18:43:53 +0100 Subject: [PATCH 17/21] Disable Trackbar. Add Genre --- MusicPlayer/MusicPlayer/Main.cs | 2 +- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 1 + MusicPlayer/MusicPlayer/MainForm.cs | 8 ++++++-- MusicPlayer/MusicPlayer/SongsTable.cs | 3 ++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs index 592723f..1285c20 100755 --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -25,7 +25,7 @@ namespace MusicPlayer audio = new AudioHandler(); table = new SongsTable(); form.SongsTableView.DataSource = table; - form.SongsTableView.Columns[3].Visible = false; + form.SongsTableView.Columns[4].Visible = false; Populate(); } diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index 549953e..c2febb3 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -210,6 +210,7 @@ // // PositionTrackBar // + this.PositionTrackBar.Enabled = false; this.PositionTrackBar.Location = new System.Drawing.Point(346, 13); this.PositionTrackBar.Maximum = 100; this.PositionTrackBar.Name = "PositionTrackBar"; diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index bf8c68e..a24a128 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -72,6 +72,11 @@ namespace MusicPlayer private void UpdateTimer_Tick(object sender, EventArgs e) { + if (main.audio.BState == AudioHandler.BufferState.DONE) + PositionTrackBar.Enabled = true; + else + PositionTrackBar.Enabled = false; + BufferBar.Value = main.audio.Buffered; PositionBar.Value = main.audio.Position; @@ -106,8 +111,7 @@ namespace MusicPlayer var drv = SongsTableView.SelectedRows[0].DataBoundItem as DataRowView; var row = drv.Row as DataRow; s.ImportRow(row); - System.Console.WriteLine((s.Rows[0][3] as Song).SongID); - main.audio.Play((s.Rows[0][3] as Song)); + main.audio.Play((s.Rows[0][4] as Song)); } } diff --git a/MusicPlayer/MusicPlayer/SongsTable.cs b/MusicPlayer/MusicPlayer/SongsTable.cs index e394711..c532e4c 100755 --- a/MusicPlayer/MusicPlayer/SongsTable.cs +++ b/MusicPlayer/MusicPlayer/SongsTable.cs @@ -15,12 +15,13 @@ namespace MusicPlayer this.Columns.Add("Naam", typeof(string)); this.Columns.Add("Album", typeof(string)); this.Columns.Add("Artiest", typeof(string)); + this.Columns.Add("Genre", typeof(string)); this.Columns.Add("song", typeof(Song)); } public void Add(Song s) { - this.Rows.Add(s.Name, s.Album, s.Artist, s); + this.Rows.Add(s.Name, s.Album, s.Artist, s.Genre, s); } } From 870c67595b6494ad679a97703dc6457f344289fc Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Fri, 30 Oct 2015 18:44:31 +0100 Subject: [PATCH 18/21] Added missing code --- MusicPlayer/MusicPlayer/Song.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MusicPlayer/MusicPlayer/Song.cs b/MusicPlayer/MusicPlayer/Song.cs index 498d5bb..18a3bf4 100755 --- a/MusicPlayer/MusicPlayer/Song.cs +++ b/MusicPlayer/MusicPlayer/Song.cs @@ -27,6 +27,7 @@ namespace MusicPlayer Album = album; Artist = artist; Seconds = seconds; + Genre = genre; this.api = api; From 91893e45e4a03f6f4907548116c7a9fbd7bc6580 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Fri, 30 Oct 2015 19:01:48 +0100 Subject: [PATCH 19/21] Genres added --- MusicPlayer/MusicPlayer/APIHandler.cs | 14 ++++++++++++++ MusicPlayer/MusicPlayer/Genre.cs | 11 +++++++++++ MusicPlayer/MusicPlayer/Main.cs | 10 ++++++++++ MusicPlayer/MusicPlayer/MainForm.cs | 3 +++ MusicPlayer/MusicPlayer/MusicPlayer.csproj | 1 + 5 files changed, 39 insertions(+) create mode 100644 MusicPlayer/MusicPlayer/Genre.cs diff --git a/MusicPlayer/MusicPlayer/APIHandler.cs b/MusicPlayer/MusicPlayer/APIHandler.cs index bea2825..a436322 100755 --- a/MusicPlayer/MusicPlayer/APIHandler.cs +++ b/MusicPlayer/MusicPlayer/APIHandler.cs @@ -104,5 +104,19 @@ namespace MusicPlayer } return yearlist; } + + public List GetGenres() + { + List genreslist = new List(); + JObject o = nw.SendString("getgenres?id=hallo"); + if (o["result"].ToString() == "OK") + { + for (int i = 0; i < o["genres"].Count(); i++) + { + genreslist.Add(new Genre(o["genres"][i][0].ToString())); + } + } + return genreslist; + } } } diff --git a/MusicPlayer/MusicPlayer/Genre.cs b/MusicPlayer/MusicPlayer/Genre.cs new file mode 100644 index 0000000..7d1f8b1 --- /dev/null +++ b/MusicPlayer/MusicPlayer/Genre.cs @@ -0,0 +1,11 @@ +namespace MusicPlayer +{ + public class Genre + { + public string name { get; set; } + public Genre(string name) + { + this.name = name; + } + } +} \ No newline at end of file diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs index 1285c20..ab3365e 100755 --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -43,6 +43,7 @@ namespace MusicPlayer form.ArtistListBox.Items.Add(a.naam); } + this.api.GetGenres().ForEach(g => form.GenreListBox.Items.Add(g.name)); } public void ArtistFilter(string artist) @@ -54,6 +55,15 @@ namespace MusicPlayer }); } + public void GenreFilter(string genre) + { + table.Clear(); + api.GetSongsByGenre(genre).ForEach(s => + { + table.Add(s); + }); + } + public void AlbumFilter(string album) { table.Clear(); diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index a24a128..e8e38ec 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -89,6 +89,9 @@ namespace MusicPlayer private void GenreListBox_SelectedIndexChanged(object sender, EventArgs e) { + if (GenreListBox.SelectedItems.Count != 0) { + main.GenreFilter(GenreListBox.SelectedItems[0].ToString()); + } } private void ArtistListBox_SelectedIndexChanged(object sender, EventArgs e) diff --git a/MusicPlayer/MusicPlayer/MusicPlayer.csproj b/MusicPlayer/MusicPlayer/MusicPlayer.csproj index 1629d5c..ff158a3 100755 --- a/MusicPlayer/MusicPlayer/MusicPlayer.csproj +++ b/MusicPlayer/MusicPlayer/MusicPlayer.csproj @@ -55,6 +55,7 @@ + Form From 7b763bac46bfc040407214ac22dc6fab7f4ef1ce Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Fri, 30 Oct 2015 19:21:58 +0100 Subject: [PATCH 20/21] Lambdas to make things smaller --- MusicPlayer/MusicPlayer/Main.cs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/MusicPlayer/MusicPlayer/Main.cs b/MusicPlayer/MusicPlayer/Main.cs index ab3365e..c791b33 100755 --- a/MusicPlayer/MusicPlayer/Main.cs +++ b/MusicPlayer/MusicPlayer/Main.cs @@ -31,18 +31,8 @@ namespace MusicPlayer private void Populate() { - form.AlbumListView.Items.Add("Alle albums"); - foreach (Album a in this.api.GetAlbums()) - { - form.AlbumListView.Items.Add(a.albumnaam); - - } - form.ArtistListBox.Items.Add("Alle artiesten"); - foreach (Artist a in this.api.GetArtists()) - { - form.ArtistListBox.Items.Add(a.naam); - - } + this.api.GetAlbums().ForEach(a => form.AlbumListView.Items.Add(a.albumnaam)); + this.api.GetArtists().ForEach(a => form.ArtistListBox.Items.Add(a.naam)); this.api.GetGenres().ForEach(g => form.GenreListBox.Items.Add(g.name)); } From b6c90e97bdc0a9add48daf6b51811b0bfc9321b5 Mon Sep 17 00:00:00 2001 From: Yorick Rommers Date: Fri, 30 Oct 2015 19:41:16 +0100 Subject: [PATCH 21/21] View buttonz added --- MusicPlayer/MusicPlayer/MainForm.Designer.cs | 37 ++++++++++++++++++-- MusicPlayer/MusicPlayer/MainForm.cs | 16 +++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/MusicPlayer/MusicPlayer/MainForm.Designer.cs b/MusicPlayer/MusicPlayer/MainForm.Designer.cs index c2febb3..5792ac0 100644 --- a/MusicPlayer/MusicPlayer/MainForm.Designer.cs +++ b/MusicPlayer/MusicPlayer/MainForm.Designer.cs @@ -53,6 +53,9 @@ this.PlayButton = new System.Windows.Forms.Button(); this.UpdateTimer = new System.Windows.Forms.Timer(this.components); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); + this.playlistsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.overviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PlaylistBox = new System.Windows.Forms.ListBox(); ((System.ComponentModel.ISupportInitialize)(this.SongsTableView)).BeginInit(); this.MainPanel.SuspendLayout(); this.MenuStrip.SuspendLayout(); @@ -123,6 +126,7 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.MainPanel.BackColor = System.Drawing.SystemColors.Window; + this.MainPanel.Controls.Add(this.PlaylistBox); this.MainPanel.Controls.Add(this.GenreListBox); this.MainPanel.Controls.Add(this.ArtistListBox); this.MainPanel.Controls.Add(this.AlbumListView); @@ -156,17 +160,20 @@ // openToolStripMenuItem // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.Size = new System.Drawing.Size(103, 22); + this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.openToolStripMenuItem.Text = "Open"; // // saveToolStripMenuItem // this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.Size = new System.Drawing.Size(103, 22); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.saveToolStripMenuItem.Text = "Save"; // // viewToolStripMenuItem // + this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.playlistsToolStripMenuItem, + this.overviewToolStripMenuItem}); this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); this.viewToolStripMenuItem.Text = "View"; @@ -291,6 +298,29 @@ this.notifyIcon1.Visible = true; this.notifyIcon1.Click += new System.EventHandler(this.notifyIcon1_Click); // + // playlistsToolStripMenuItem + // + this.playlistsToolStripMenuItem.Name = "playlistsToolStripMenuItem"; + this.playlistsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.playlistsToolStripMenuItem.Text = "Playlists"; + this.playlistsToolStripMenuItem.Click += new System.EventHandler(this.playlistsToolStripMenuItem_Click); + // + // overviewToolStripMenuItem + // + this.overviewToolStripMenuItem.Name = "overviewToolStripMenuItem"; + this.overviewToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.overviewToolStripMenuItem.Text = "Overview"; + this.overviewToolStripMenuItem.Click += new System.EventHandler(this.overviewToolStripMenuItem_Click); + // + // PlaylistBox + // + this.PlaylistBox.FormattingEnabled = true; + this.PlaylistBox.Location = new System.Drawing.Point(12, 12); + this.PlaylistBox.Name = "PlaylistBox"; + this.PlaylistBox.Size = new System.Drawing.Size(377, 134); + this.PlaylistBox.TabIndex = 4; + this.PlaylistBox.Visible = false; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -342,6 +372,9 @@ private System.Windows.Forms.Label LabelTotalTime; private System.Windows.Forms.Label LabelCurrentTime; private System.Windows.Forms.NotifyIcon notifyIcon1; + private System.Windows.Forms.ToolStripMenuItem playlistsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem overviewToolStripMenuItem; + private System.Windows.Forms.ListBox PlaylistBox; } } diff --git a/MusicPlayer/MusicPlayer/MainForm.cs b/MusicPlayer/MusicPlayer/MainForm.cs index e8e38ec..8617bbf 100644 --- a/MusicPlayer/MusicPlayer/MainForm.cs +++ b/MusicPlayer/MusicPlayer/MainForm.cs @@ -131,5 +131,21 @@ namespace MusicPlayer else p.Visible = true; } + + private void overviewToolStripMenuItem_Click(object sender, EventArgs e) + { + this.PlaylistBox.Visible = false; + this.GenreListBox.Visible = true; + this.ArtistListBox.Visible = true; + this.AlbumListView.Visible = true; + } + + private void playlistsToolStripMenuItem_Click(object sender, EventArgs e) + { + this.PlaylistBox.Visible = true; + this.GenreListBox.Visible = false; + this.ArtistListBox.Visible = false; + this.AlbumListView.Visible = false; + } } }