From e3f0482000787a73a4d86776135c9fc9aa37dfc4 Mon Sep 17 00:00:00 2001 From: Papon Wappen Date: Tue, 13 Apr 2021 17:07:08 +0700 Subject: [PATCH] Fix popup dispose error. Add ability to do JPG 50/80%. Add a lovely icon. --- DLSiteDumperCS/DLSiteDumperCS.csproj | 10 +- DLSiteDumperCS/MainForm.Designer.cs | 43 +- DLSiteDumperCS/MainForm.cs | 50 +- DLSiteDumperCS/MainForm.resx | 582 +++++++++++++++++- DLSiteDumperCS/Properties/AssemblyInfo.cs | 6 +- .../Properties/Resources.Designer.cs | 63 +- DLSiteDumperCS/Properties/Resources.resx | 17 +- DLSiteDumperCS/Resources/dldump_icon.png | Bin 0 -> 4351 bytes DLSiteDumperCS/ViewerDumper.cs | 548 +++++++++-------- DLSiteDumperCS/dldump_icon_kr9_icon.ico | Bin 0 -> 34494 bytes README.md | 5 +- dldump_icon.png | Bin 0 -> 4351 bytes dldump_icon_kr9_icon.ico | Bin 0 -> 34494 bytes 13 files changed, 1001 insertions(+), 323 deletions(-) create mode 100644 DLSiteDumperCS/Resources/dldump_icon.png create mode 100644 DLSiteDumperCS/dldump_icon_kr9_icon.ico create mode 100644 dldump_icon.png create mode 100644 dldump_icon_kr9_icon.ico diff --git a/DLSiteDumperCS/DLSiteDumperCS.csproj b/DLSiteDumperCS/DLSiteDumperCS.csproj index 4c38169..6c8463f 100644 --- a/DLSiteDumperCS/DLSiteDumperCS.csproj +++ b/DLSiteDumperCS/DLSiteDumperCS.csproj @@ -12,6 +12,7 @@ 512 true true + false publish\ true Disk @@ -24,7 +25,6 @@ true 0 1.1.0.%2a - false false true @@ -47,6 +47,9 @@ prompt 4 + + dldump_icon_kr9_icon.ico + @@ -99,6 +102,7 @@ True Resources.resx + True PublicResXFileCodeGenerator @@ -135,5 +139,9 @@ false + + + + \ No newline at end of file diff --git a/DLSiteDumperCS/MainForm.Designer.cs b/DLSiteDumperCS/MainForm.Designer.cs index c854222..0218a1a 100644 --- a/DLSiteDumperCS/MainForm.Designer.cs +++ b/DLSiteDumperCS/MainForm.Designer.cs @@ -67,8 +67,9 @@ private void InitializeComponent( ) this.label14 = new System.Windows.Forms.Label(); this.label15 = new System.Windows.Forms.Label(); this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.label16 = new System.Windows.Forms.Label(); this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.startPageInput)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.betweenPageDelay)).BeginInit(); this.groupBox1.SuspendLayout(); @@ -237,8 +238,9 @@ private void InitializeComponent( ) this.imageExtSelect.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.imageExtSelect.FormattingEnabled = true; this.imageExtSelect.Items.AddRange(new object[] { - "png", - "jpg"}); + "jpg 80%", + "jpg 50%", + "png"}); this.imageExtSelect.Location = new System.Drawing.Point(150, 139); this.imageExtSelect.Name = "imageExtSelect"; this.imageExtSelect.Size = new System.Drawing.Size(74, 21); @@ -340,7 +342,7 @@ private void InitializeComponent( ) this.label13.AutoSize = true; this.label13.Location = new System.Drawing.Point(19, 138); this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(349, 52); + this.label13.Size = new System.Drawing.Size(343, 52); this.label13.TabIndex = 10; this.label13.Text = resources.GetString("label13.Text"); // @@ -409,13 +411,12 @@ private void InitializeComponent( ) // // linkLabel2 // - this.linkLabel2.AutoSize = true; this.linkLabel2.Location = new System.Drawing.Point(13, 478); this.linkLabel2.Name = "linkLabel2"; - this.linkLabel2.Size = new System.Drawing.Size(274, 13); + this.linkLabel2.Size = new System.Drawing.Size(349, 33); this.linkLabel2.TabIndex = 12; this.linkLabel2.TabStop = true; - this.linkLabel2.Text = "https://forums.e-hentai.org/index.php?showtopic=92167"; + this.linkLabel2.Text = "https://forums.e-hentai.org/index.php?s=&showtopic=92167&view=findpost&p=5878056"; this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.OpenUrlFromLinkLabel); // // linkLabel3 @@ -431,6 +432,7 @@ private void InitializeComponent( ) // // groupBox2 // + this.groupBox2.Controls.Add(this.label18); this.groupBox2.Controls.Add(this.label2); this.groupBox2.Controls.Add(this.linkLabel4); this.groupBox2.Controls.Add(this.linkLabel3); @@ -503,6 +505,16 @@ private void InitializeComponent( ) this.groupBox3.TabIndex = 14; this.groupBox3.TabStop = false; this.groupBox3.Text = "Dumper"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(15, 169); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(248, 26); + this.label17.TabIndex = 14; + this.label17.Text = "jpg 50% quality makes 2x smaller file for B&&W page.\r\n10x smaller for color page " + + "vs PNG!"; // // label16 // @@ -513,14 +525,13 @@ private void InitializeComponent( ) this.label16.TabIndex = 13; this.label16.Text = "Viewer PID"; // - // label17 + // label18 // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(15, 169); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(192, 26); - this.label17.TabIndex = 14; - this.label17.Text = "jpg makes 2x smaller file for B&&W page.\r\n10x smaller for color page!"; + this.label18.Image = global::DLSiteDumperCS.Properties.Resources.dldump_icon; + this.label18.Location = new System.Drawing.Point(287, 16); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(81, 74); + this.label18.TabIndex = 15; // // MainForm // @@ -531,11 +542,12 @@ private void InitializeComponent( ) this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Controls.Add(this.label1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "MainForm"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.Text = "DLSite viewer dumper | by K.G. & typcn | C#GUI by Wappen | V1.1"; + this.Text = "DLSite viewer dumper | by K.G. & typcn | C#GUI by Wappen "; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed); this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.startPageInput)).EndInit(); @@ -593,6 +605,7 @@ private void InitializeComponent( ) private System.Windows.Forms.Label label15; private System.Windows.Forms.Label label16; private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; } } diff --git a/DLSiteDumperCS/MainForm.cs b/DLSiteDumperCS/MainForm.cs index 20d250d..36f1343 100644 --- a/DLSiteDumperCS/MainForm.cs +++ b/DLSiteDumperCS/MainForm.cs @@ -13,10 +13,11 @@ namespace DLSiteDumperCS { public partial class MainForm : Form { - const string DefaultExt = "jpg"; - ViewerDumper m_Vd; - string m_UsingImageExt; + + OutputFormat UsingOutputImageFormat => (OutputFormat)imageExtSelect.SelectedIndex; + + string UsingImageExt => Helper.GetOutputExt( UsingOutputImageFormat ); public MainForm( ) { @@ -29,13 +30,14 @@ public MainForm( ) private void Form1_Load( object sender, EventArgs e ) { + this.Text += $"| V {Application.ProductVersion}"; + // Auto detect PID on load int foundPid = _AutoDetectProcess( ); pidTextBox.Text = foundPid.ToString( ); - // Select PNG on start - imageExtSelect.SelectedIndex = imageExtSelect.FindString( DefaultExt ); - m_UsingImageExt = DefaultExt; + // Select default ext on start + imageExtSelect.SelectedIndex = (int)OutputFormat.Jpeg50; // Auto pick some save path string initialSave = Environment.GetFolderPath( Environment.SpecialFolder.MyDocuments ); @@ -97,12 +99,12 @@ void Dump( bool isBatch ) // Resetup if PID changed if( m_Vd.TargetPid != pid ) - m_Vd.Setup( pid ); + m_Vd.SetupTargetPid( pid ); m_Vd.BasePageOffset = (int)startPageInput.Value; m_Vd.BaseSavePath = savePathTextBox.Text; - m_Vd.TargetImageExt = m_UsingImageExt; m_Vd.BetweenPageDelayMs = (int)betweenPageDelay.Value; + m_Vd.SetupOutputEncoder( UsingOutputImageFormat ); if( !m_Vd.IsReady ) { @@ -156,12 +158,12 @@ private void autoDetectPidButton_Click( object sender, EventArgs e ) private void browseButton_Click( object sender, EventArgs e ) { - string forecastFilename = ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, m_UsingImageExt ); + string forecastFilename = ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, UsingImageExt ); var sfd = new SaveFileDialog( ); sfd.InitialDirectory = savePathTextBox.Text; sfd.FileName = forecastFilename; - sfd.DefaultExt = m_UsingImageExt; + sfd.DefaultExt = UsingImageExt; sfd.Filter = "Image file|*.*"; sfd.ValidateNames = false; sfd.CheckFileExists = false; @@ -182,7 +184,6 @@ private void savePathTextBox_TextChanged( object sender, EventArgs e ) private void imageExtSelect_SelectedIndexChanged( object sender, EventArgs e ) { - m_UsingImageExt = imageExtSelect.Text; _UpdateEffectivePath( ); } @@ -193,7 +194,7 @@ private void startPageInput_ValueChanged( object sender, EventArgs e ) private void _UpdateEffectivePath( ) { - effectivePathTextBox.Text = Path.Combine( savePathTextBox.Text, ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, m_UsingImageExt ) ); + effectivePathTextBox.Text = Path.Combine( savePathTextBox.Text, ViewerDumper.GetFileNameForPage( (int)startPageInput.Value, UsingImageExt ) ); } private void OpenUrlFromLinkLabel( object sender, LinkLabelLinkClickedEventArgs e ) @@ -267,7 +268,8 @@ private void BackgroundWorker1_ProgressChanged( object sender, ProgressChangedEv private void BackgroundWorker1_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e ) { - m_Popup.Close( ); + m_Popup.Close( ); // Note: this will dispose, so also set null, credit to ntsa (https://forums.e-hentai.org/index.php?showuser=189943) for this finding + m_Popup = null; if( e.Cancelled ) InfoMsg( "User cancelled operation. Are you joking to me?" ); @@ -326,4 +328,26 @@ private void genHtmlButton_Click( object sender, EventArgs e ) } + // Choice order in imageExtSelect must be by this + enum OutputFormat + { + Jpeg80, + Jpeg50, + Png + } + + static class Helper + { + public static string GetOutputExt( OutputFormat f ) + { + switch( f ) + { + case OutputFormat.Jpeg80: // JPG 80% + case OutputFormat.Jpeg50: // JPG 50% + return "jpg"; + default: + return "png"; + } + } + } } diff --git a/DLSiteDumperCS/MainForm.resx b/DLSiteDumperCS/MainForm.resx index b0377e2..0a68728 100644 --- a/DLSiteDumperCS/MainForm.resx +++ b/DLSiteDumperCS/MainForm.resx @@ -130,7 +130,7 @@ So adjust starting page number in the box below to get the right filename.If image zoom is 45% or below, you get multiple images per row. - 45% is recommended for dual page view - 30% for 3 pages per row -Specify that you want Left2Right (Comic) reading or Right2Left (Manga)? +Specify that you want Left-Right (Comic) reading or Right-Left (Manga)? This will create a reader HTML inside your specified folder. @@ -140,4 +140,584 @@ Here is what it will do: - Generate a reader html named "_reader.html" (under score for filename to appear first) + + + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA + IACoJQAA7h4AAEBAAAABACAAKEIAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAASCwAAEgsAAAAA + AAAAAAAA7N/UEtvHs4nUuqDP07mez9K4n8/SuJ/P0rifz9K4n8/SuJ/P0rifz9K4ns/VvafP18Kvz9S8 + o8nbx7Rn8ejhBdnEr3LZwKj43czI/9/Q0f/s2cb/7djC/+/bxf/u2cP/7dfC/+zWwf/v28P/y8Dc/6mi + 6f/n0br/1byj7dnEr1PTuqHH59G3/5GN9P9cXP//vrjv/9rQ5f+bl/b/yMHu/+fa3v/25dP/2M/p/7y4 + 9f+Vkvb/9OTV/+HJrv/UvKS80redz+bQt/+Sj/T/s7D3/4uK+/+Skfz/rKv8/1hY//+mpPj/oJ73/5+d + +v+amfr/a2r9/5KQ+f+8sNb/2MGnz9G2m8/izLb/i4n4/8zJ8v+Kif3/iYj8/+jg5/9ubfz/d3f+/1xc + /v9jYv7/s7H3/5KR/f/X1fv/gn/z/9jHvc/RtZrP3si1/3Z0+f+Afvv/sa73/8XB8//q4eP/qab3/4qI + +f+Ni/j/a2r8/9zX7/+IiPz/r67+/4+K7f/ZxrfP0LWaz9/Hr//k2+T/0sHL/+TOuv/mz7b/48qx/+3f + 0v/p2Mj/4824/9zKw//m0b3/ubDj/6un9P/Tv7n/1buhz9C1m8/exq//8uXY/+TJq//gw6X/38Km/97C + pv/r28n/59G8/97Cpf/fw6b/38Km/+fRuP/16tz/2r6j/9O5oM/RtZvP38iw//Pq4v/IvNr/1cPI/+HH + q//hyLL/697W/+vYwf/jyKn/4MWp/9/Eqf/lz7n/8ufc/9q/pf/TuaHP0babz+HLsv/EwPP/paP4/4eF + +P/gzcP/v7PZ/3p5/P+loO7/tqzf/93Kw//hx6z/5tG8//Po3v/awaf/07qhz9G2nM/izbX/mpf2/9PH + 2v+RjPH/v7Xc/7Sr4P+bmv3/xr7n/7Or4v/czMv/4sqw/+fTv//z6d//28Kq/9O6oc/RtpzP5M+3/4qI + 9/+6s+f/lJDy/7+24f/Nw9z/m5r8//Tp2P/q1r//5dC6/+TPuv/q2sr/9Ovj/9vDrP/TuqHP0bedz+PO + tv+gnPP/jIv9/5GQ+//s5+v/3djt/4yM/P/x6ub/9Ozk//Pr4//z6+P/9O3l/+/k2f/axKz/07qhz9K5 + oM3gy7P/n5rw/4SC9//Uytv/6dnI/+TWzf+9t+r/49PI/+bUw//o2Mn/59fH/+XUw//k0b//2MGq/9S7 + pMfXwauJ1L2l+tvMwv/h0ML/4M24/97Kt//ey7j/4c+7/9/LuP/ey7j/3su3/97LuP/ey7j/28ay/9O7 + ovjZxK9y49LDE9fBq5fPtJnRzbKWz82yl8/NspfPzbKXz82yls/NspfPzbKXz82yl8/NspfPzbKWz8+2 + nM/bxrKJ697SEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAASCwAAEgsAAAAAAAAAAAAA7uLXAPLn + 3hLj0sJz18CrsdK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5oLDSuaCw0rmgsNK5 + oLDTu6Gw17+ksNO6orHbxbGn5tbHSfz29AP06uMA+O/qB+DOvZbTuqH807id/9i+pP/XvqT/172k/9e9 + pP/XvaT/172k/9e9pP/XvaT/172k/9e9pP/XvaT/172k/9i+pP/Zxrz/zcHT/9rDrv/QtZr/1Lyl6+DN + vF3///8A4M++StO5oe7cxKr/6t3Y/+bd6P/z6OL/+OjX//Xi0P/249D/+ujS//jm0f/14s//9eLP//Xi + 0P/14tD/9uPQ//vq1f+zsPX/XFz///Tn3//s1sH/1Lqf/9O7o9rj0cEo2MKtptO4nf/w28L/vLfy/zY3 + //9aWv//v7v1//np0//u4uH/t7L0/9LM7v/16eL/8uTc//Thy//14sv/7uLe/+Da7//RzfP/YWH+//Tn + 3f/04Mr/5c62/8+0mP/dyLWM07qisNW6n//w28H/savw/yws//+bmvz/X1/+/+Da7v+Eg/r/XFz//1lZ + //+Dg///rar1//Dl3//e1uf/2NPx/2Vl/v/Oy/T/Vlb+/8G88P/k2uL/7dzJ/9G1mf/ZxK+w07qhsNS5 + nf/u2L//r6vz/39+/f/++e7/bm79/7Gw/P9qav7/6ef5/7a1/P8lJf//gYD9/8/N+v9ISf//0M75/19e + /v/Myvj/Pj7//25u//9jY///lpT2/9rFsP/Zwq2w07qhsNO2mv/t2L//q6n3/4KB/P//+u//dHT9/5SV + //90c/7/+/Pn/8jD8v9ISP//YmL+/8HA/P8qKv//iIj//25t/f/Y1vn/YmL///f2/P/T0fr/UVL//8m9 + 0v/eybGw07qhsNK1mP/r2MP/bGv8/3l3+v/a1e7/aGf+/62t/v90c/z/9ejY/8S/7f9iY///Wlr//1hY + //9WVv//LS7//4OB+P/t5ur/WVn//9TT/P/6+Pb/Y2P//7mv2P/hzLOw07mhsNG0l//p1b//iIb6/z9A + //9nZ///q6r6/+3q9P/Tz/T/+PDn/9jT7/+pqfz/urj5/3Z1+v/OzPj/UFD//7m3+f/99+7/b27+/6+v + //+Kiv//amn8/9XFw//bxq+w07mhsNG0lv/kzbb/8evt/9XM4//bzdP/6tbA/+fRuv/o0bn/48qx/+XN + tv/17OL/7+DP/+nTvP/o07z/39HT/+bUyP/q18L/ubPu/25u/v+Qj/v/3M7R/9G1mP/Zw66w07mhsNG0 + l//jzLX/9u7m/+rVvv/gw6b/38Km/9/Cpv/fwqb/38Km/+DFqv/x5tr/6dbD/97Cpf/fwqb/4MSm/9/D + pv/fw6b/5s6z//Hp5f/16+H/38Wp/86wk//ZxK+w07mhsNG0l//jzLX/9u7m/+fTvv/fw6b/38On/9/D + p//fw6f/38On/+DFq//x5tv/6dfE/9/Dp//fw6f/38On/9/Dp//fw6f/38Oo//Dk2P/y59z/3cKo/86x + lP/Zw6+w07mhsNG0mP/kzbf/9u7n/+3dzf/j08z/59O9/+HGq//fxKn/38Sp/+TKrv/06dz/6tfF/9/D + qP/fxKn/38Sp/9/Eqf/fxKn/4MWq//Hl2f/y593/3sSq/86xlP/Zw6+w07qhsNG1mP/kz7j/+fPs/8rI + +f9ub///k5D4/+TUzf/hx6v/5dC+/8vC4v/Y1PL/7uLY/+nSt//o0LT/4smu/+DGrP/gxqz/4cet//Hm + 2v/z6N7/38Ws/86ylf/Zw6+w07qhsNK2mf/o1Lv/xcL0/5OS/P/X0e//X1/+/6un8P/o0bb/39HS/01N + //9MTf//c3P+/5WS9P+emfL/3M/X/+PKsP/hyK7/4cmv//Lm2//z6d//38eu/86ylf/Zw6+w07qhsNK2 + mv/q1r3/r6z2/4F/9//04sf/qaTw/25u/f/q2cn/3dDT/15e///T0vv/xsLy/5aT8v+ZlvT/1s3j/+XO + tf/iybH/4sqy//Ln3f/z6eD/4Miw/86ylv/Zw66w07qhsNK2m//q17//r6z2/3Ny+//v38v/vbfp/0VF + ///g09T/59jO/2Rj/v+9vPv/8+XP/+nUuv/p1br/5c+3/+LLs//iyrP/4suz//Lo3f/z6uH/4Mmy/86y + lv/Zw66w07qhsNK3nP/q2MH/sK32/zk5///p4N7/rqnu/2xs/f/r3dH/7t/K/4GA+f+ysv3/+fHk/+nZ + yf/l0r7/5M+6/+TOuf/k0Lz/5tPA//Ts5P/z6+L/4Mq0/86zl//Zw66w07qhsNK3nf/n1cD/0s7x/1FR + ///h3/j/dnX8/7Gw/P/59Or//Pjw/4WE/v+bm/3//Pjw//j08P/38uz/9e3m//Ts5P/17+j/9/Ls//r2 + 8//x5tz/4Mu1/86zl//Zw66w07qhsNK4nv/l0bz/ysXs/zQ1//9mZ///fn38/+3m5//x593/8eXX/7az + 8v9wb/z/7d/R/+nay//u4tf/8efe//Ho3//v5dv/7eHV/+rbzf/m08L/4Mq1/86zmP/Zw66w1r+osNC2 + nP/k0bv/w77r/11d//+/uu//6t7V/+XUwf/j0b7/5NG+/+HW2v/OyOv/59fH/+PPvf/j0L3/49G//+TR + v//j0L7/49C9/+PQvf/j0L7/3ci0/86yl//cx7Om38u5ctG3nvrWwKr/5dfK/+fe2//o2Mb/4tG//+LR + v//i0cD/4tHA/+TSwf/m1cL/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRv//fzLr/0rqh/9K4 + n+7hz71K69zREtnDr53Qt5790rmg/9W9pf/UvaX/1L2m/9S9pv/Uvab/1L2m/9S9pv/Uvab/1L2m/9S9 + pv/Uvab/1L2m/9S9pv/Uvab/1L2m/9S8pf/Qt53/0rmh/ODNvJb37+oH5dXGAOjZzBbey7iSzbOYssir + jbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmrjbDJq42wyauNsMmr + jrDSuaGx4tHBc/Hl3RLu4dcAgAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAKAAAACAA + AABAAAAAAQAgAAAAAAAAEAAAEgsAABILAAAAAAAAAAAAAAAAAADw5dsA9OvjDenazVjey7mR2MGsj9fB + q4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fBq4/XwauP18Grj9fB + q4/XwauP18Cqj9a/qI/XwKqP2cOukOPSwoPs39Qo+vPwA/Tq4wAAAAAA7uHXAPLn3hfm1sel18Cp886z + mP/NsJX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82xlf/NsZX/zbGV/82x + lf/NsZX/zbGV/82xlf/Uu6H/3sqy/9O6of/MsJX/0bed/dvHs9zm18lV////AOjZzQC3i2YA5NPEf9S8 + pP/Os5b/2sGo/+XPuf/m0bv/5s+6/+XPuf/lz7r/5c+6/+XPuv/lz7n/5c+5/+XPuv/lz7r/5c+6/+XP + uv/lz7r/5c+6/+XPuv/lz7n/6NTA/9rT5v+VlPv/5Nvg/+LLtP/UuZ//zLCU/9fAq+nl1shK4tHBAOfZ + yyfWwKraz7OY/+TNtv/06N//5+Lx//Dr8f/78+n//O/e//jm1f/45dP/+ObU//ro1v/66Nb/+ObU//jl + 0//45dP/+OXU//jl1P/45dT/+OXT//nn1P/+8eD/k5L9/x4f///h2/L/+ujV//Dbx//ZwKb/zbGV/9nE + sLDu49kN4M68g9C2nP7ZvqT/8d7I/+Lc7/9BQf//S0v//21t/v+/vfr/+uzZ//TgzP/47eH/493w/+Pd + 8P/47eL/+uvZ//nq2P/04c3/89/K//Pfyv/25tT/8urs//ry6P/U0Pb/NDT//97Y7//2483/89/L/+rU + vv/QtZj/0rif8ubWx1fYwq2PzrKX/9/Grf/w3MX/3tjt/xsb//8XF///YGD//1hY///k3u//9+zf/6em + +/8xMf//MDH//6qp/f+8u/z/u7n4//Xm1P/15dH/9+jT//Do6P9vcP//srD5/+Hd8v84OP//4Nrw//rs + 1//z4cz/7tnC/9e9ov/Nspb/49HBj9fAqo/Ospb/38Ws/+7Ywf/d1uz/KCj//6Wj+//y7/T/TU3//4iG + +//n4/P/MzP//6Kh/v+lpf3/PT3//1ZX//98e/3///jo/7u4+P+wr/n/+vXv/25u/f98evv/49/y/ykp + //9qav3/hoX8/9LO8//r4uX/3sev/82xlf/iz7+P2MGqj86ylv/dwqj/7dnC/93Y8f84OP//39v1///3 + 6f96ev7/fn7//7Ky/v9ZWf//8e/4///99/94eP//Dg7//1FR///39fv/fn3+/yIi///m5Pn/cnH9/3x7 + /f/l4vf/KSn//2xs//90df//OTn//15f///i2Nj/0LWa/+HPvo/YwaqPzrGV/9u/pP/s2ML/3tr1/zg4 + ///f3fn///3y/3p6/v+AgP//gID//3p6/v/++vD//ffs/3x8/f9SUv//OTn//+Xj+v9/f/3/FRX//7+/ + //80NP//sLD9/+Pi+/84OP//4uL9///+/P/Nzfz/Li7//6uo9f/cx6//4c68j9fBqo/NsZT/2b2h/+/e + yP+urfv/KCj//93X7P/78uP/dHP+/4uL//9/f///enn8//Tl0f/05dH/e3r8/2Ji//84OP//o6P+/2Fh + //8vL///YGD//zk5///e2fD/4t3v/zIz//+vrv7///74//768v9ycv7/eHf5/+HOt//gzbyP18Cqj82x + lP/YvJ//8eDK/318/f8UFP//ycf3/6Kg+v84OP//3tz7/4uK/v+IiP3/+vHk//z26v96ev7/fHz//4OD + //8tLf//Ojr//5iY//8VFf//KSn//+Hc7//68uj/cHD//3t7//////z/6Ob5/0lJ//+Eg/n/4M21/+DN + vI/XwKqPzbCU/9i7nv/t28X/srH6/ygo//8zM///WFj//7Sz/P/79/T/7er2/+zo8//38Oj/+O/l/7q4 + +P+9vf3/5+T3/4SD+/+ysPn/8O33/1dY//+AgP///Pj0///68f97ev7/bW3//9zc//9RUv//U1T//9rS + 4f/UvKL/4c69j9fAqo/NsJP/17ud/+bQuv/28e7/4t7z/9fP5v/n3N7/793H/+jTv//o1L//59G7/+TM + tP/hyK7/7NrF//r17P/w49T/7drC/+vXv//p1b//5tze/+Xb3v/p1sL/7t3J/7279v9ZWf//PT3//39/ + /v/g2Of/28Km/8ywlP/iz7+P18Cqj82wk//Xup3/5c+4//fv6f/z5tj/5Mqv/+HFqf/fwqb/38Km/9/C + pv/fwqb/38Om/9/Cpv/jy7P/9e7l/+zbyv/fw6b/38Km/9/Cpv/hxqn/4cap/9/Cpv/gxKn/6ta+/+jg + 5P/j4vv/9e3k/+TMs//StZf/zbGV/+LPv4/XwKqPzbCU/9e6nv/lz7j/9u/p//Dj1v/gxav/38Om/9/D + p//fw6f/38On/9/Dp//fw6f/38Om/+PMs//27ub/7NvK/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//ewqX/6NO9//v38f/v4dT/38Sp/9K1mP/NsZX/4s+/j9fAqo/NsJT/17ue/+XPuf/28On/8OPX/+DF + q//ewqb/38On/9/DqP/fw6j/38Oo/9/DqP/fw6f/48y0//bu5v/s28v/38Oo/9/Dp//fw6j/38Oo/9/D + qP/fw6j/38Oo/9/Cp//m0bz/+fXw/+/i1P/gxav/0rWZ/82xlf/iz7+P18Cqj82wlP/Xu5//5dC6//fw + 6f/x5Nj/59G5/+zZwv/lzrX/38Sp/9/Eqf/fxKn/38Sp/9/Dp//jzLT/9u7m/+zczP/fxKr/38Sp/9/E + qf/fxKn/38Sp/9/Eqf/fxKn/38Oo/+fSvf/69fH/7+LV/+DGrP/Stpn/zbGV/+LPv4/XwaqPzbGU/9i8 + oP/m0bv/+PDp//fx7f/SzfD/j477/9TP7//s28v/4ces/+DFqv/hx63/6dW+//Hizf/89u3/7+DP/+HG + rP/gxan/4MWq/+DFqv/gxav/4MWr/+DFq//gxar/59O///r18f/w49b/4ceu/9O3mv/NsZX/4s+/j9fB + qo/NsZT/2L2h/+fSvf/28e7/4N/+/3l6//9qav//Ojr//7Kw+P/s2sP/4Mar/+rXwP+8ufX/eHf8/66t + /f/h3O//8OLT/+/dxf/u3MX/5s+3/+HHrP/hx63/4cet/+HGrP/o1MD/+vXx//Dj1//hyK//07eb/82x + lf/iz7+P18Gqj82xlP/ZvqL/6dXA/+Dd8/9OTv//1dLz//nx6P97ev3/TU3//+jf4P/iya//793H/317 + +/8tLf//NDT//z9A//9zc/3/eXj8/4SD/P/c1en/5tC4/+HIrv/hyK//4ceu/+jVwv/69fH/8OTY/+HJ + sf/TuJz/zbGV/+LPv4/XwaqPzbGV/9m+pP/q1sH/3dr0/zg5///Z0eb/7Ne//9LN8P8xMf//0c3x/+jS + u//v3sj/eXj8/3h3///p6Pv/1NL5/4SD+/94d/z/e3r8/8bE9v/r2MP/4siw/+LJsf/iyLD/6dbD//r2 + 8v/w5Nn/4sqz/9S4nf/NsZX/4s+/j9fBqo/NsZX/2b+l/+rXw//d2vT/ODn//9nS6f/o0rn/5t3k/0JC + //+FhPv/797I/+/eyP+GhPv/TU3///Lx+v/06Nn/79/J//Dfyv/v38r/69nF/+PMtf/iyrL/4sqy/+LK + sv/p18T/+vby//Hl2f/izLT/1Lme/82xlf/iz7+P18Gqj82xlf/Zv6b/6tfE/97b9P8oKP//rav4/+/f + yP/d1ub/KCj//4aF+//v3sn/6NS9/9HN8f80Nf//4N/7//Dj1P/izLX/4cqz/+HKsv/iyrP/4suz/+LL + s//iy7P/4sqz/+nXxf/69vL/8eXa/+LMtv/UuZ7/zbGV/+LPv4/XwaqPzbGV/9nAp//q2MX/39z1/xcX + //98e/z/9enV/9rU6/81Nf//0c7z/+rZxv/p18P/2tXt/zg4///h4P3/+vXu/+/j1//o18b/5dK//+TQ + u//kzrn/5M+7/+XRvf/l0r//7N7R//v49f/x5tv/4s23/9S6n//NsZX/4s+/j9fBqo/NsZb/2cGp/+jX + xf/u6vH/Skr//3x8/v////T/oqH8/1la///u6/T/9e3k//n17v/g3/v/NDT//9bV/f/9+vX/+/j2//r2 + 8//28Or/9Ovi//Lo3v/z6eD/9e3m//fx6//69/P//Pr4//Dl2f/izrn/1Lqg/82xlf/iz7+P18Gqj82x + lv/Zwar/5NG+//bv5v9ycv//b2///6en//8pKf//s7P9//369P/49PD/9/Hq/+7q8v9MTP//hYT8//Tp + 2v/t4dX/8+vj//fx7f/59PH/+fXy//n18P/38+7/9vDq//Pr4//v49n/6NbG/+LNuf/Uu6H/zbGV/+LP + v4/YwauPzbGW/9nCq//m0r7/3dfq/yQk//8YGf//WVn//7Ox+v/y6N3/6drM/+jYyP/l08L/8eXU/4iH + /P+Hhvz/7+HP/+PPvP/l0sH/5tXE/+jYyf/p2sz/6NnJ/+bVxf/m1MP/5dLA/+PQvv/jz7z/4s26/9S6 + of/NsZX/4tC/j9zItI/Os5j/1b2l/+PRvv/n4Ob/ZGX//6Gg+//r5ej/7uHQ/+TSwP/j0L7/49C+/+PQ + vf/n18b/5t7m/+bf5v/n18b/49C+/+PQvv/j0L7/49C+/+PQvv/j0L7/49C+/+PQvv/j0L7/49C+/+PR + vv/gzbn/0Lab/8+0mv7k1MWD5NTFV9S8pPLOtJr/28iz/+fZyf/s5ef/7ePa/+XUw//j0cD/49LA/+PS + wf/j0sH/49LB/+PSwf/l1ML/5dTC/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS + wf/j0sD/4M+9/9fAqv/MsJT/18Cq2ujZyyfw5NsN3su5pc+1m//PtZv/18Ks/93Kt//dyrf/3cm2/93J + tv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93Jtv/dybb/3cm2/93J + tv/dybb/3cm2/9rHsv/UvaX/zLCU/9O7o//j08N/r4hgAOLRwQDl1sgW3cm2qdO7o/7Nspb/zbGW/82y + lv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82ylv/Nspb/zbKW/82y + lv/Nspb/zbKW/82ylv/Nspb/zLGV/860mf/XwKrz5dTFpfDl3Bfs39QAAAAAAOrd0QDs4NUc4tLCg9C2 + nJDIq4yPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iq + jI/IqoyPyKqMj8iqjI/IqoyPyKqMj8iqjI/JrI+P2MKskefZy1j06uMN7+TbAAAAAADAAAADgAAAA4AA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAABwAAAAygA + AAAwAAAAYAAAAAEAIAAAAAAAACQAABILAAASCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AO7i + 1zfm1shM3827S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97L + uEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97LuEvey7hL3su4S97L + uEvey7hL3su4S97LuEvey7lL5NHBS+ze00Tv5doG7uLXAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APDl + 2wDx590i697Rf+PSwdzaxLD/07uk/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5 + oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5 + oP7SuaD+0rmg/tK5oP7SuaD+0rmg/tK5oP7SuaH+18Cq/uDOvPPm18mN7+PaP+/j2gD///8AAAAAAAAA + AAAAAAAA7eHVAPLo4Bzq3dC/3Mi1/86zmf/KrI//yauP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qs + j//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qsj//KrI//yqyP/8qs + j//KrI//yqyP/8qsj//KrI//yq2Q/9S8pP/j0br/3cmy/82yl//Jq47/yayO/8yvk//Vvab/49LD3erd + 0T7s3tIA6NnNAAAAAAAAAAAA////AOrc0K3Yw63/zbGV/8uukf/Rtpv/2sGp/+DIsf/hybL/4Mmy/+HJ + sv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJsv/hybL/4cmy/+HJ + sv/hybL/4cmy/+HJsv/hybL/4cmy/+DJsv/hybP/59TC//Tw7v+9vfz/2tn6/+/h0//dxa3/1Lqf/8yw + k//JrI//0Lac/97LuePq3dFA3Me0AAAAAADp3M8A6dzPQNzHtODNspf/zrKW/9vCqP/q1cH/8+PU//bo + 2f/25tf/9ufY//Xj0v/14tD/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi + 0f/14tH/9eLR//Xi0f/14tH/9eLR//Xi0f/14tH/9eLR//Ti0P/15NT//Pbw/5eX//8CAv//f3/////6 + 7P/04dD/7trG/+HJsv/RtZn/yqyP/9K5of/i0cG6////AP///wA1AAAA4dC/itG3nv/Mr5L/28Go/+7Z + xf/67eH/8/H5/+vp+v/39vn/9PP5///56//+8+T/+ura//nm1P/55tT/+ebU//nm1P/559X/+efV//nn + 1f/55tT/+ebT//nm0//55tP/+ebU//nm1P/55tT/+ebU//nm1P/55tT/+ebU//nm1P/56dn//fj0/05O + //8AAP//f3/////77f/559X/+OXS//Lfy//jzLT/z7OW/8qtkP/Vvqjy59jLXefYywDp2s1E3cm288uv + k//Ttpv/5s+4//PfzP//+er/ior//yEh//98fP//aWn//729/v/NzP7/+/Ps//Xiz//04Mz/9eHN//ns + 3v//+ev///rr///56//57N7/9eLP//bk0v/25NL/9eHN//TgzP/04cz/9OHM//TgzP/04cz/9+jZ//32 + 6f/67uD/+/Lp/9vb/v8NDf//f3/////56v/14s7/9OHM//TgzP/u2cT/3MKp/8uukP/PtJr/38y5ofbu + 6A/iz75L1b6n/suukf/Zv6T/6tW+//Heyf//+Oj/gID//wAA//8AAP//AAD//wAA//9FRf///fv4//Xm + 1//x3cj/9+vd//Py+v+Kiv//fn7//4qK///z8fr/+/Tr//v18P/79vH/9urd//HdyP/w3Mf/8NzH//Dc + x//05dX/+/j1/6yt///w7vr/+vLn/+fl9/8PD///f3/////36P/x3sn/8NzH//Dcx//w3Mb/5M21/8+z + l//KrI7/3ci0/u7i2EveyrhL0rmh/suukf/cw6n/6tS9/+7axP//9ub/gID//wAA//8BAf//aWn//66u + //8eHv//lpf///r28//26tv/8/H5/2pq//8HB///Dg7//wcH//9qav//9PT//3R0//9zdP//+vTu//De + yv/05NL/+u3b//Tl1P/78uP/rKz//xYW//9vcP///Pbw/+fk9v8PD///f3/////86v/67tz/9ujW/+/c + x//u2sT/5s+3/9O4nf/IqYv/2cKt/uzg1UveyrdL0rmg/syukf/cw6n/6NG6/+zXwf/+9eX/f3///wAA + //9qa///9fT5//Hw+/9BQf//Cgr//8C/+///++n/ior//wIC//9ra///6ur//2tr//8CAv//ior//0ZG + //9AQP//+/by//bq3f/r6Pj/urn9/+vq+f/68eb/8O/6/zg4//9AQf//+/Xv/+bj9f8REf//XFz//7++ + /f+4t/3/3Nz8///66//88uL/6tjG/9S5nf/IqYv/2MKs/uzf00veyrdL0rmg/syukf/bwaf/58+3/+zX + wv//9+n/f3///w8P///p6P3/9+zg//316P+6uv//AAD//7q5/f////T/f3///w8P///p6Pz//fnz//b0 + +/9lZf//Pz///yEh//9CQv///fv6///68P+6uf3/AAD//2hp///08fb/+vXv/0BA//9AQP//+/bw/+fk + 9v8WFv//AAD//wAA//8AAP//QED//4CA//+iov//+fTw/93Isv/Iqov/2MKs/uzf00veyrdL0rmg/syu + kP/av6T/5c20/+3Zxv///PD/f3///w8P///o5/v/+PHp//737P+6uv7/AAD//76+///U1P//IiL//4yN + ///7+vv/+/bw////+v+7u///AAD//w0N//8QEP//oqL/////+/+6uv7/AAD//xYW///p6P3/9PL7/zk5 + //9AQP///fr3/+jm+v8REf//XFz//7+///+/v///ZWX//wgI//8PD///oqL///Dk0//KrZD/2MKs/uzf + 00veyrdL0rmg/sytkP/ZvaL/5Mqx/+zZxf///fL/f3///w8P///p6P7//fr3////+P+6uv//AAD//8DA + ///AwP//AAD//7q6//////j/+vbw///89P+6uv7/AQH//5eX//8SEv//f3//////9/+6uv7/AAD//xYW + ///w8P//i4v//wIC//9wcP////78/+no/f8PD///f3///////P////3/9PT9/9XU/v8PD///XV3//+3r + 9v/Ywar/2MKs/uzf00veyrdL0rmg/sutj//YvKD/4smu/+3byf////f/f3///w8P///o5vr/9ezi//z0 + 6P+6uv7/AAD//8DA///AwP//AAD//7q6/v/78+b/7+DQ//nv3/+6uf3/AQH//6Wl//8UFP//f3////// + +P+6uv7/AAD//wgI//+env//f3///w8P///o5/z//Pfw/+jm+v8PD///f3///////P/9+/r//Pr2//X0 + +v9oaP//AAD//7m4+//i0Ln/2MKs/uzf00veyrdL0rmg/sutj//Xu5//4ces//Tm1P/Ozf3/IiL//xQU + ///m4/X/8OLR//336v+srf//Cwv//8bG//+/v///AAD//7q5/f/159P/5c62//Xo1v+6uf3/AQH//6en + //8nJ///IiL//8DA//9BQf//XV3//zIy//9BQf//dHT//xAQ///m4/b/9Onc/+jl9f8iIv//IiL//87O + /v////r/+vby//336/+6uv7/AAH//7m4+//i0Ln/2MKs/uzf00veyrdL0rmg/sqtj//Wup7/4MWr//Xo + 1v+6uf3/AAD//xYW///p5/j///zw/8DA/v8WFv//dHT/////+v+7uv7/AAD//7q5/f/57+D/7+HT//z2 + 6v+6uv7/AAD//729//+ysv//AQH//3l5//8NDf//f3///3d3//8ICP//Cgr//xUW///m4/b/8eTW//z2 + 7v+trf//AAD//7q6/v////z//Pn3//v6+f+Ojv//AAD//7m4+//j0Ln/2MKs/uzf00veyrdL0rig/sqt + j//WuZ3/38Sp//Xn1f+6uf3/AAD//wsL//90dP//f3///yAg//8cHP//v7/////+9f/c3P3/gID//93c + /v///Pf//Pn3////+/+6uv//AQH//729///l5f//QED//wAA//8fH///wMD//+3t//8WFv//AAD//2ho + ///19Pv/+fPs///68f+6uv7/AAD//7q6//////7//////5eX//8FBf//QED//97c+v/cx7D/2MKs/uzf + 00veyrdL0rig/sqsj//WuZz/38So/+7ezf/v7vv/aGj//xER//8QEP//DxD//4uM///Q0P7//fv4//r2 + 8v/8+fT////2//r17//17OT/8ufb//To2//q6Pj/urr+/+zr/f/++/L/3Nz7/7a1/P/MzPz//Pjz//r3 + 9/+Ulf//Fhb//8DA/////fb/+fPu///78/+6uv7/AAD//6ur///y8v//lJT//wsL//89Pf//3d38/+ve + zf/Lr5P/2MKs/uzf00veyrdL0rif/sqsjv/WuZv/3sOo/+fTvv/48uz/9PT9/+bk+P/m4/X/5uL0//fx + 7v/059b/7NvL/+rYxv/q2Mf/6tjG/+jTwP/mz7r/48qx/+HHrf/q1sH/+fDh//z59P/x5dn/7t3J//Lh + y//w38r/6NTA/+3byf/28O3/5uL1//Pt7f/u3s//6dbD//Tm1v/My/z/RUX//x0d//8NDf//Jyf//1JT + ///i4vz/8OPS/9K3m//HqYr/2MKs/uzf00veyrdL0rif/sqsjv/VuZv/3sOn/+bSvP/17OX/+/j1//Hl + 1//p1cH/6NO9/+TMtP/fw6j/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//gxar/7N3M//r2 + 8f/v4tT/4cet/9/Dp//fw6f/38On/9/DqP/kzLT/6NO9/+TMtP/fw6j/38On/+PLs//z6N3/+/f0/6Gi + //95ef//v7////769P/w49X/3cKo/9CylP/HqYv/2MKs/uzf00veyrdL0rif/sqsjv/VuJv/3sOn/+fS + vP/17OX/+vby/+zayf/gxqv/38Km/9/Dpv/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//gxar/7N3M//r28f/v4tT/4cet/9/Dp//fw6f/38On/9/Dp//fw6b/38Km/9/Dpv/fw6f/38On/9/D + p//hxqz/6NTA//nx4/////n//Pn3/+7f0v/iyK7/276i/9Czlf/HqYv/2MKs/uzf00veyrdL0rig/sqs + j//VuJz/3sOo/+fSvP/17OX/+vby/+zbyv/hxqz/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//gxar/7N3M//r28f/v4tT/4cet/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6b/38On/+nXxP/59fH/+fXx/+vZyP/gxav/276i/9Czlf/HqYv/2MKs/uzf + 00veyrdL0rig/sqsj//VuZz/3sOo/+fSvf/17eX/+vbz/+zbyv/hxqz/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//gxar/7N3N//r28f/v4tT/4ceu/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/+nWw//59fH/+fXx/+vayf/gxqv/276i/9Cz + lf/HqYv/2MKs/uzf00veyrdL0rig/sqsj//VuZz/3sOp/+bSvf/17eX/+vfz/+zbyv/hxq3/38On/9/D + p//fw6f/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/Dp//gxav/7N3N//r28f/v4tX/4civ/9/D + qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/+nWw//59fH/+fXx/+va + yv/gxqz/27+j/9Czlv/HqYv/2MKs/uzf00veyrdL0rig/sqsj//VuZ3/3sSq/+fTvv/17eX/+vfz/+zb + y//hyK7/4smw/+PLs//gxqz/38Oo/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/gxqz/7d3O//r2 + 8f/v4tb/4smw/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/+nW + xP/69fH/+vXx/+vbyv/hx67/27+k/9Czlv/HqYv/2MKs/uzf00veyrdL0rig/sqsj//WuZ3/38Wq/+jU + v//27eX/+/fz/+7h0v/s3Mv/9e3k//fw6v/x5dj/5tC6/+DGrP/fxKn/38Wp/9/Fqf/fxKn/38Sp/9/E + qf/hx63/7d7O//r28f/v49b/4smx/+DEqf/fxKn/38Wp/9/Fqf/fxan/38Wp/9/Fqf/fxan/38Wp/9/F + qf/fxan/38Sp/+rXxP/69fH/+vXx/+zby//iyK7/28Cl/9Czl//HqYv/2MKs/uzf00veyrdL0rmg/sqt + j//Wup7/38ar/+jUwP/27ub/+/j0//j08//q6Pj/lJX//0pK///a2fz/8u7y/+7ey//hx63/4Mar/+DG + q//gxqv/5M62/+/eyv/y48//+fDj//369v/x5Nf/48uz/+DFqv/gxar/4MWq/+DFqv/gxqv/4Mar/+DG + q//gxqv/4Mar/+DGq//gxqv/4Mar/+rYxv/69fH/+vXx/+zczP/iybD/3MGm/9C0l//HqYv/2MKs/uzf + 00veyrdL0rmg/sqtj//Wu5//4Met/+jVwf/37+j///75//Pz/f9TU///Jyf//zw8//8REf//aGn//+7s + 9//q18P/4ces/+HHrP/jy7L/9Org/8zM/f+4t/z/urn9/+3s/v///O//9ena/+fSvf/kzbb/5c63/+TN + tv/iybD/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+rYxv/69fH/+vby/+zczf/iybH/3MKn/9G0 + l//IqYv/2MKs/uzf00veyrdL0rmg/sqtj//Xu5//4Meu/+jWw//99+//v7///4mJ///Ozv//wMD///r6 + //9oaP//AAD//7q6/v/47t//48uz/+HHrP/lzrf/9/Hr/0VF//8AAP//AAD//11d//9+fv//v7////34 + 8P/38er/9/Hr//fx6v/x5Nf/48uz/+HHrf/hyK7/4ciu/+HIrv/hyK7/4cet/+rZx//69fH/+vby/+zc + zf/iyrL/3MOo/9G1mP/IqYv/2MKs/uzf00veyrdL0rmg/sqtj//Xu6D/4Mev/+jXxP///fH/f3///w8P + ///p5vj/9ena//ft3//Av/3/Cgr//0JC///s6fT/6NTA/+DHrf/lz7n/9/Hr/0FC//8xMf//aGj//wwM + //8ODv//Jyf//0FB//9AQP//P0D//01O///d3Pz/8eXY/+LKsv/hyK//4civ/+HIr//hyK//4civ/+rZ + yP/69fL/+vby/+zdzv/iy7P/3cOp/9G1mP/IqYv/2MKs/uzf00veyrdL0rmg/sqtj//XvKH/4ciw/+nX + xf///fL/f3///w8P///m4/X/6tfE/+jUwP/79/P/dHT//xAQ///n5fn/7d3M/+LIsP/lz7r/9/Hr/0BA + //9AQP//8/P9/+jn/f/t7Pz/lZX//zs8//9AQP//QED//z8///+Fhf//9+/p/+XOuf/iyLD/4smx/+LJ + sf/iybH/4smx/+vayf/69vL/+vby/+zdz//jzLX/3cSq/9G1mf/IqYv/2MKs/uzf00veyrdL0rmg/sqt + j//XvKH/4cmx/+nXxf///fL/f3///w8P///m4/b/6tfF/+LKs//68N//gID//wIC//+XmP//9u/n/+TN + t//l0Lr/9/Hs/0BA//8/P////v38//37+P/38en/9/Dp//fx7P/38ev/9/Hr//fx7P/28Or/7d7P/+PL + s//iybH/4sqy/+LKsv/iyrL/4smx/+vayf/69vL/+vby/+zez//jzLX/3cSr/9G1mf/IqYv/2MKs/uzf + 00veyrdL0rmg/sqtkP/XvKL/4cmy/+nYxv///fL/f3///w8P///m5Pf/69rI/+LLs//z59j/0tL//yUl + //9CQv//9/Ls/+XRu//l0Lv/9/Hr/1JS//8LC///oqL/////+v/x5tr/5tO//+XRvP/l0bz/5dG8/+XR + vP/l0Lv/48y0/+LLsv/iy7P/4suz/+LLs//iy7P/4suz/+vbyv/69vL/+vbz/+3f0P/jzbf/3cWs/9G1 + mf/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaP/4cqz/+nYx////fL/f3///wgI//+9vf//9ezj/+XQ + uv/4797/jY3//wAA//9ERf//9/Ls/+XRvP/jzbX/8ujc/9va/v8NDf//f3//////+//w5tv/5M+5/+HK + sv/iyrP/4sqy/+LKsv/iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+vby//69vL/+vbz/+3f + 0f/jzrj/3cWt/9G1mv/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaT/4cq0/+nYyP///fL/gID//wAA + //9FRf//9/Ls/+bTwP/58OD/f3///wIC//+XmP//9u/o/+TQu//hyrT/6trI/+bj9v8PD///f3////// + /P/07OT/6dnI/+XRvf/jzbf/4sy1/+LLtf/iy7X/4su1/+LLtP/iy7X/4su1/+LLtf/iy7X/4su1/+vc + zf/69vL/+vbz/+3f0f/jzrj/3cWt/9G2mv/IqYv/2MKs/uzf00veyrdL0rmg/sqtkP/XvaT/4cu1/+nZ + yf///fL/gID//wAA//9FRf//+PTv/+nayv/78+X/f3///w8P///n5fn/7uHU/+XSvv/m1ML/7+PV/+fl + +f8PD///f3///////v/8+vf/9/Ls//Dm2//q28v/59XE/+bTwP/l0b3/5M+7/+TPuv/k0Lz/5dG9/+bS + v//m1MH/59XE/+/j2P/7+Pb/+vfz/+3g0v/jz7r/3cav/9G2m//IqYv/2MKs/uzf00veyrdL0rmg/squ + kP/XvqX/4cy2/+nZyv/++/L/oqL//wgI//9DQ////Pv5//n07f/x8Pv/XV3//z09///u7fn/8+rg//Ho + 3f/17+j/+/j0/+np/v8PD///f3///////f/8+/j//fz6//z7+f/7+PX/9/Lt//Ts4//x59z/7+PW/+7h + 0//v49b/8ebc//Pq4f/17ub/9/Lt//v49v/+/f3/+vby/+3g0v/j0Lv/3cew/9G2m//IqYv/2MKs/uzf + 00veyrdL0rmg/squkf/Xv6b/4My3/+fWxf/z7OP//fz7/0BA//8/P//////+//f2/v9oaP//AAD//7u7 + //////z/+/j2//v59v/7+ff//fr4/+no/v8SEv//Pz///9/f/f/48un/9e7n//j08P/6+PX/+/n3//z5 + 9//7+Pb/+/j1//v49P/7+PX/+/j2//v59//7+vf/+vn1//r39P/59fL/9e3m/+rbzP/jz7v/3cix/9G3 + m//IqYv/2MKs/uzf00veyrdL0rmg/squkf/Xv6f/4cu3/+TQvf/w5dr/8/L9/zo6//86Ov//6en//2dn + //8DA///aGj///Dv/f/7+PT/+PTw//fy7f/17uf/8+vj//n29v+Ojv//AAD//7q5/f/16dr/59XE/+vc + zv/v5dr/8+zl//bw6//48+7/+PXx//j18f/49PD/9/Pu//bx6//07+j/8urh/+/l2v/s39P/6NjI/+TR + v//jzrv/3siy/9G3nP/IqYv/2MKs/uzf00veyrdL0rmg/suukf/Xv6j/4cy4/+TQvf/58eL/ior//wAA + //8EBP//Dw///zAw//9xcf//9PP5//Pq3v/r3M//6tzO/+jYyP/m1MT/5dPC//Xr2/+6uf3/AAD//7q5 + /f/z59f/4867/+TQvf/l0sH/5tTD/+bVxf/o2cr/6tzP/+rcz//q283/6NjJ/+fVxf/m1cT/5dTC/+XS + wP/k0b7/48+8/+POu//jz7z/3siz/9G2nP/HqYv/2MKt/uzf1EvfzLlL07ui/sqtkf/VvqX/4Mu3/+TR + v//68uT/gID//wAA//8iIv//f3///9zc/v/79u//7uPX/+XSwf/k0b//5NG//+PQvf/jz7z/48+8/+/i + 0v/b2/z/gID//9vb/P/v4tL/48+8/+PPvP/jz7z/48+8/+PPvP/j0b7/5NG//+TRv//k0b//49C+/+PP + vP/jz7z/48+8/+PPvP/jz7z/48+8/+PQvf/j0L3/3cey/8+0mv/Iqoz/2cSv/u3g1Uvj0sJL18Gr/sqt + kP/RuJ7/3cm1/+PRv//x59z/3Nv9/01N//+8vP///frw//Hn3P/m1sf/5NLA/+PQvv/j0b7/49G+/+PR + v//j0b//49G+/+XUw//x59z/+vPl//Hn3P/l1MP/49G+/+PRv//j0b//49G//+PRv//j0b7/49G+/+PR + vv/j0b7/49G+/+PRv//j0b//49G//+PRv//j0b//49G//+PRv//iz73/2cKs/8yvk//KrZH/3cm28+7j + 2UTq3dI138y63M2xlv/MsZb/18Gr/+DOu//k1MT/9Ozi//Du+P/38ev/59jJ/+PSwf/j0cD/49HA/+PR + wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0sH/5NPC/+PSwf/j0cD/49HA/+PRwP/j0cD/49HA/+PR + wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+HQvv/cyLT/0bie/8mt + j//SuaD/4c+9ihMAAADl1ccA5tbHf9fAqv/Lr5P/z7ac/9jDrf/ezbr/49PD/+jbzf/l1sf/4tHA/+LR + wP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LR + wP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/i0cD/4tHA/+LRwP/h0b//4M+9/9vI + s//SuqL/y66S/82yl//bxrLg6tzPQOrczwDs3tMA7N/UIuHPv8HRuJ//yq6S/82yl//TvKT/2MOu/9rG + sv/bxrP/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vH + s//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vHs//bx7P/28ez/9vH + s//ZxbD/1b+o/8+2nP/KrpH/yq6R/9jDrf/q3NCt////AAAAAAAAAAAA4M69AObYyxzfzby/1b6n/8yw + lf/Lr5P/zbKX/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860 + mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860mf/OtJn/zrSZ/860 + mf/OtJn/zrSZ/860mf/Ospj/y7CU/8uvkv/PtZv/3cm2/+nazb/x5t4c6tzPAAAAAAAAAAAA////AOfY + ygDo2csf5dbHvtzItf/Qtpz+yq2Q/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sir + jf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Iq43+yKuN/sir + jf7Iq43+yKuN/sirjf7Iq43+yKuN/sirjf7Jq47+zLGW/tfBq//i0cDc6tzQf/Hm3iLw5NsA////AAAA + AAAAAAAAAAAAAAAAAADv5dwA7+XcJeXWx03Tu6RLyq6RS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iq + jEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iq + jEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqoxLyKqMS8iqjEvIqo1Lz7SaS9/Nukzt4dY3////AAAA + AAAAAAAAAAAAAAAAAAD4AAAAAB8AAOAAAAAADwAAwAAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAAB + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAIAA + AAAAAQAAgAAAAAADAADAAAAAAAMAAOAAAAAABwAA8AAAAAAfAAAoAAAAQAAAAIAAAAABACAAAAAAAABA + AAASCwAAEgsAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wDt4NX/5NTF/9/Muv/cyLX/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI + tP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI + tP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zItP/cyLT/3Mi0/9zI + tP/cyLX/3sq3/+XTxP/s39P/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////APDl2//m1sf/28Ww/9G3nv/LrpP/yKqN/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqN/8qsj//Rt53/2cOu/+PSwv/v49r/////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////APDl2//fzLr/0Lad/8iqjP/Iqoz/yKuN/8mrj//JrI//yayP/8ms + j//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8ms + j//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8msj//JrI//yayP/8ms + j//JrI//yayP/8msj//Xwqz/5NXH/+TVx//Xwqz/yayP/8msjv/Iq43/yKqM/8iqjP/MsJT/2sWx/+zf + 1P////8A////AP///wD///8A////AP///wD///8A////APDk2//axbH/z7Wa/8qtkP/Iq43/zK+S/9O4 + nv/awan/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97F + rv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/exa7/3sWu/97F + rv/exa7/3sWu/97Frv/exa7/3sWu/97Frv/n1MP//////////////////////+fUw//bwqn/07ie/8yw + kv/Jq47/yKuO/8ywlP/UvKX/5dXH/////wD///8A////AP///wD///8A////AP///wDi0MD/z7Wb/8qt + kP/NsJP/1Lqf/9/HsP/o0r3/7dnG/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/c + yf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/c + yf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/v3Mn/79zJ/+/cyf/z5df///////////8AAP//AAD///// + ///37eT/7trG/+nUv//hybL/1ryi/8ywk//Iqoz/yq6S/9jCrf/r3tP/////AP///wD///8A////AP// + /wDp3M//07uj/8qtkf/NsJP/1ryh/+XPuP/y3sz/+u3g//zz6//88+v/++7i//zz6//77uL/+ujY//ro + 2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro + 2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj/+ujY//ro2P/66Nj//PPr//// + //8AAP//AAD//wAA/////////PPr//ro2P/66Nf/9OHP/+fRu//YvqT/zK+R/8mrjf/Os5n/3Mi1//// + /wD///8A////AP///wD///8A3su5/8iqjf/KrI//1bqg/+XOt//14s//+evd//////////////////// + //////////////vy6P/78uj/+uze//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl + 0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl0v/45dL/+OXS//jl + 0v/45dL/+OXS//vy6P//////AAD//wAA//8AAP////////vy6P/45dL/+OXS//fk0f/14s//7NfC/9S5 + nv/LrpH/yKqM/86zmf/o2s3/////AP///wD///8A6drN/9W+p//Iqo3/z7KW/97Frf/s18L/9ODN//rw + 5v//////AAD//wAA////////AAD////////////////////////46dr/9eHN//Xhzf/14c3/9eHN//jp + 2v/68Ob/+vDm//rw5v/68Ob/+Ona//Xhzf/14c3/9eHN//Xhzf/14c3/9eHN//Xhzf/14c3/9eHN//Xh + zf/14c3/9eHN//Xhzf/46dr/+vDm//jp2v/46dr///////////8AAP//AAD////////68Ob/9eHN//Xh + zf/14c3/9ODN//Dbx//kzbX/0bWZ/8irjf/Mr5P/3ci0/////wD///8A////AOLQv//Os5n/yayO/9S4 + nf/kzLT/79vG//Leyf/47uT//////wAA//8AAP//AAD//wAA//8AAP//AAD//wAA////////+O7k//Le + yf/y3sn/8t7J//Xn1//////////////////////////////////159f/9efX//ju5P/47uT/9efX//Le + yf/y3sn/8t7J//Leyf/y3sn/8t7J//Leyf/159f/////////////////9efX//ju5P//////AAD//wAA + ////////+O7k//Leyf/y3sn/8t7J//Leyf/x3Mf/7djC/9e9ov/LrpD/yqyP/9K4nv/t4NX/////AP// + /wDdybX/yayP/8uukf/YvqP/5tC4/+/bxf/v28X/9+3i//////8AAP//AAD//wAA//8AAP//AAD//wAA + //8AAP/////////////z5NT/79vF//Pk1P///////////wAA//8AAP//AAD//wAA//////////////// + ///////////////////z5NT/79vF/+/bxf/v28X/79vF/+/bxf/z5NT///////////8AAP////////// + ///37eL//////wAA//8AAP////////ft4v/v28X/79vF/+/bxf/v28X/79vF/+/bxf/cw6n/zrKW/8iq + jP/KrI//6tvP/////wD///8A3Me0/8mrjf/Mr5P/28Go/+fQuP/t2MH/7djB//br4P//////AAD//wAA + //8AAP//AAD/////////////AAD//wAA//////////////Li0f///////////wAA//8AAP//AAD//wAA + //8AAP//AAD/////////////AAD//wAA////////9uvg/+3Ywf/y4tH/9uvg//br4P/y4tH/9uvg//// + //8AAP//AAD//wAA////////9uvg//////8AAP//AAD////////26+D/9uvg//br4P/y4tH/7djB/+3Y + wf/t2MH/38eu/9K2mv/Iqoz/yKqM/+nbzv////8A////ANzHs//Jq43/zK+S/9vBp//mzrb/69W+/+zW + v//16t///////wAA//8AAP//AAD//////////////////wAA//8AAP//AAD////////16t7//////wAA + //8AAP//AAD/////////////AAD//wAA//8AAP///////wAA//8AAP////////ft4//y49P///////// + //////////////Dgz////////////wAA//8AAP////////Xq3v//////AAD//wAA//////////////// + //////////////Xq3//16t7/8ODP/9/Grf/Stpr/yKqM/8iqjP/p2s3/////AP///wDcx7P/yauN/8yv + kv/awKb/5My0/+rTvP/s1b//9uzh//////8AAP//AAD/////////////8eHR////////////AAD//wAA + ////////9ene//////8AAP//AAD///////////////////////8AAP//AAD///////8AAP//AAD///// + ///58uz/+O/n//////8AAP//AAD/////////////9ere//////8AAP//AAD////////16t///////wAA + //8AAP//AAD//wAA//8AAP//AAD////////////////////////n1MH/0bWZ/8iqjP/Iqoz/6drN//// + /wD///8A3Mez/8mrjf/Mr5L/2b+k/+PKsf/p0rr/7NfD//fw6P//////AAD//wAA////////9+7m/+7d + y//27uX//////wAA//8AAP//////////////////AAD//wAA////////+PHp//ft5f///////////wAA + //8AAP//AAD//wAA//////////////v38v//////AAD//wAA//8AAP////////Xr4f//////AAD//wAA + ////////9u3j//////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/////////////93I + s//Iqoz/yKqM/+nazf////8A////ANzHs//Jq43/zK6R/9m9ov/hyK7/6NG5/+3ax//69fD//////wAA + //8AAP////////v49P/37+f/+/by//////8AAP//AAD/////////////AAD//wAA//////////////v4 + 8//8+PX//v38//////8AAP//AAD//wAA//8AAP//AAD////////+/fz//////wAA//8AAP//AAD///// + /////////////wAA//8AAP////////r28f//////AAD//wAA////////////////////////AAD//wAA + //8AAP//AAD////////o2cv/yKqM/8iqjP/p2s3/////AP///wDcx7P/yauN/8yukf/YvKH/4cas/+fP + t//s2cb/+vby//////8AAP//AAD////////9/Pv//Pn3//38+v//////AAD//wAA/////////////wAA + //8AAP////////38+v/7+fX/+/fz//z59///////AAD//wAA////////AAD//wAA/////////Pn2//// + //8AAP//AAD//wAA/////////////wAA//8AAP//AAD////////9+/r//////wAA//8AAP////////78 + +//+/v3/////////////////AAD//wAA/////////////9bAqv/Iqoz/6drN/////wD///8A3Mez/8mr + jf/MrpD/17uf/+DFqv/mzrX/69jE//r28f//////AAD//wAA////////+/j1//n07v/8+fb//////wAA + //8AAP////////////8AAP//AAD////////7+PX/9u7m//Tq3//48er//////wAA//8AAP///////wAA + //8AAP////////jx6v//////AAD//wAA//8AAP////////////8AAP//AAD//////////////Pr3//// + //8AAP//AAD////////8+ff//fv5//7+/v/69vL//////wAA//8AAP//AAD////////j1MX/yKqM/+na + zf////8A////ANzHs//Jq43/zK6Q/9e6nv/fxKj/5cyz//Di0////////////wAA//8AAP////////Tr + 4f/q18T/9Ovh//////8AAP//AAD/////////////AAD//wAA////////9Ovg/+nVwP/o0rz/8ufb//// + //8AAP//AAD///////8AAP//AAD//////////////////wAA//8AAP//AAD//wAA////////AAD//wAA + ////////9+/n//bt5P//////AAD//wAA//////////////v49f/+/v7/+PLr////////////AAD//wAA + ////////49TF/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukP/Wup3/3sKn/+TLsf/06uD//////wAA + //8AAP//AAD////////x5dj/69nF////////////AAD//wAA/////////////wAA//8AAP////////Hl + 2P/ky7H/5Myz//Po3f//////AAD//wAA////////AAD//wAA//8AAP///////wAA//8AAP///////wAA + //8AAP///////wAA//8AAP////////Ln2//y5tn//////wAA//8AAP//AAD////////8+ff//v7+//Xt + 5P/17OL//////wAA//8AAP///////+PUxf/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1bmd/93B + pv/jyrD/9Org//////8AAP//AAD//wAA////////9Orf////////////AAD//wAA//////////////// + //8AAP//AAD////////06uD/7NrI/+7f0P/48uz//////wAA//8AAP////////////8AAP//AAD///// + //8AAP//AAD///////8AAP//AAD//wAA//8AAP//AAD////////y5tv/7dzM////////////AAD//wAA + /////////fv5//7+/v/48ev///////////8AAP//AAD////////j1MX/yKqM/+nazf////8A////ANzH + s//Iqo3/y66Q/9W5nP/cwKX/4siv//Pp3///////AAD//wAA//8AAP//////////////////AAD//wAA + //8AAP////////bt5P//////AAD//wAA////////+vXx//jy7P/7+fb//f37//////8AAP//AAD///// + ////////AAD//wAA//8AAP//AAD//wAA/////////////wAA//8AAP//AAD//wAA////////9u7m//Di + 1P/48ev//////wAA//8AAP////////79/P/+/v7///////////8AAP//AAD//wAA////////49TF/8iq + jP/p2s3/////AP///wDcx7P/yKqN/8utkP/VuJv/3MCj/+LIrv/z6d///////wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8AAP/////////////+/Pv///////////////////////7+/f/+/f3//v39//37 + +f//////AAD//wAA//////////////////8AAP//AAD//wAA//////////////////8AAP//AAD//wAA + //////////////79+//9/Pv//v39//////8AAP//AAD////////+/v7///////////8AAP//AAD//wAA + /////////////9bAqv/Iqoz/6drN/////wD///8A3Mez/8iqjf/LrZD/1bib/9zAo//iyK7/7d/Q//// + ////////AAD//wAA//8AAP//AAD//wAA///////////////////79/P/+fTv//v38//8+ff/+/j2//jw + 6v/z6N7/8eTY/+3dzP/v4dP///////////////////////fw6P////////////////////////////fv + 5////////////wAA//8AAP////////z59//48+3/9+/o//r18f//////AAD//wAA//////////////// + //8AAP//AAD//wAA/////////////9vFsP/Iqoz/yKqM/+nazf////8A////ANzHs//Iqoz/y62P/9W4 + mv/cv6P/4cet/+fTvv/38Or///////////////////////////////////////Xs4//x5dn/7d3O/+3d + zv/t3c7/7d3O/+zczP/p1cP/6NO//+XPuP/iyK7/4MSp/+fTvv/y5tv/+fXw//37+f/y59z/69nI/+/h + 0//v4dP/8OPV/+vayP/o1L//79/R///////////////////////y5tv/7NzM/+vZyP/06uH//////wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA/////////////+LMt//OsZT/yKqM/8iqjP/p2s3/////AP// + /wDcx7P/yKqM/8utj//UuJr/27+i/+HHrf/n077/9Ori//z6+P/8+fb/8+ne//Dj1v/v4dP/7+HT/+fT + vv/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/5M63//Tr + 4f/8+vf/8ufc/+TMtP/fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/7+HT/+/h0//n077/38On/9/D + p//fw6f/59O+/////////////////wAA//8AAP//AAD//////////////////+fTvv/Xup3/zrGT/8iq + jP/Iqoz/6drN/////wD///8A3Mez/8iqjP/LrY//1Lia/9u/ov/hx63/59O+//Tq4v/7+Pb/+fTu/+jT + vv/hx63/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/+TOt//06+H//Pr3//Ln3P/kzLT/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/7+HT////////////////////////////9Orh/+jU + wP/fw6f/17qd/86xk//Iqoz/yKqM/+nazf////8A////ANzHs//Iqoz/y62P/9S3mv/bv6L/4cet/+fT + vv/06uL/+/j2//n07v/o077/4cet/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//kzrf/9Ovh//z69//y59z/5My0/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//n077/9ezk//v5 + 9v/+/v7/9/Dq/+nVw//gxar/38On/9e6nf/OsZP/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8ut + kP/Ut5v/27+j/+HHrf/n077/9Ori//v49v/59O7/6NO+/+HHrf/fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/5M63//Tr4f/8+vf/8ufc/+TM + tP/fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/+vayf/48+7//v7+//Tr4//p1cP/4MWq/9/Dp//Xup3/zrGT/8iqjP/Iqoz/6drN//// + /wD///8A3Mez/8iqjf/LrZD/1Lib/9u/o//hx63/59O+//Tq4v/7+Pb/+fTv/+jTv//hx63/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/+TO + t//06+H//Pr3//Ln3P/kzLT/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//r2sn/+PPu//7+/v/06+P/6dbD/+DFqv/fw6f/17qd/86x + k//Iqoz/yKqM/+nazf////8A////ANzHs//Iqo3/y62Q/9S4m//bv6P/4ceu/+fTv//06+L/+/n2//n0 + 7//o07//4ceu/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//kzrj/9Ovi//z69//y59z/5My1/9/DqP/fw6f/38On/9/Dp//fw6f/38On/9/D + p//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/38On/9/Dp//fw6f/69rJ//jz7v/+/v7/9Ozj/+nW + xP/gxav/38On/9e6nv/OsZT/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8utkP/UuJv/27+k/+HH + rv/n07//9Ovi//v59v/59O//6NO//+HHrv/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/D + qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/5M64//Tr4v/8+vf/8ufd/+TMtv/fw6j/38Oo/9/D + qP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/9/DqP/fw6j/38Oo/+va + yf/48+7//v7+//Ts4//p1sT/4MWs/9/DqP/Xup//zrGU/8iqjP/Iqoz/6drN/////wD///8A3Mez/8iq + jf/LrZD/1Lic/9vApP/hyK//59S///Tr4v/7+fb/+fTv/+jUwP/hyK//38Sp/9/Eqf/fxKn/38Sp/9/E + qf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/+XPuf/06+L//Pr3//Ln + 3f/kzbb/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E + qf/fxKn/38Sp/9/Eqf/r2sr/+fPu//7+/v/17OP/6dfE/+DGrf/fxKn/17uf/86xlP/Iqoz/yKqM/+na + zf////8A////ANzHs//Iqo3/y62Q/9W4nP/cwKX/4smw/+jVwP/16+L//Pn2//n07//o1cH/4smw/+fU + wP/v4dT/7+HU/+fUwP/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E + qf/lz7n/9ezi//z69//y6N3/5M63/+DFqv/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/E + qf/fxKn/38Sp/9/Eqf/fxKn/38Sp/9/Eqf/fxKn/7NvK//nz7v/+/v7/9ezk/+rXxf/hx63/4MWq/9e7 + oP/OsZT/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKqN/8utkP/VuJz/3MGl/+LJsP/o1cH/9evj//z5 + 9v/59O//7uDS//Dk1///////////////////////7+LU/+jUwP/gxar/4MWq/+DFqv/gxar/4MWq/+DF + qv/gxar/4MWq/+DFqv/gxar/5dC6//Xs4//8+vj/8ujd/+XOt//gxav/4MWq/+DFqv/gxar/4MWq/+DF + qv/gxar/4MWq/+DFqv/gxar/4MWq/+DFqv/gxar/4MWq/+DFqv/gxar/4MWq/+zcy//58+7//v7+//Xs + 5P/q2Mb/4ciu/+DFqv/XvKD/zrKV/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1bmd/9zC + pv/iyrH/6NXC//Xs4//8+fb/+/fz/////////////////wAA//8AAP//////////////////6NXB/+DG + q//gxqv/4Mar/+DGq//gxqv/4Mar/+jVwf/v4tX/7+LV//Ln3f/69fH//fv6//Po3f/lz7j/4Mas/+DG + q//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DGq//gxqv/4Mar/+DG + q//s3Mz/+fPu//7+/v/17eT/6tjG/+HIr//gxqz/2L2h/86ylf/Iqoz/yKqM/+nazf////8A////ANzH + s//Iq43/y66Q/9W6nf/dwqf/48uz/+jWwv/17OP//fv4//z59///////AAD//wAA//8AAP//AAD//wAA + //8AAP/////////////p1sP/4cet/+HHrf/hx63/4cet/+nWw/////////////////////////////// + ///58+7/8ufc/+nWw//hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+HH + rf/hx63/4cet/+HHrf/hx63/7NzM//nz7v/+/v7/9e3l/+rYx//iyLD/4cet/9i9of/PspX/yKqM/8iq + jP/p2s3/////AP///wDcx7P/yKuN/8uukP/Wup7/3cOo/+PLs//o1sP/+PHr//////////////////// + //8AAP////////////8AAP//AAD//wAA////////8OPW/+HHrf/hx63/4cet/+HHrf/w49b//////wAA + //8AAP//AAD//wAA////////////////////////8OPW//Dj1v/w49b/8OPW//Dj1v/p1sP/4cet/+HH + rf/hx63/4cet/+HHrf/hx63/4cet/+HHrf/hx63/4cet/+zdzf/58+7//v7+//Xt5f/q2Mj/4smw/+HH + rv/YvqL/z7KW/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1rqe/93Dqf/jzLT/6NbE//r1 + 8f//////AAD//wAA/////////////////////////////wAA//8AAP/////////////p1sP/4ciu/+HI + rv/hyK7/8OPW//////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP////////////////////////// + /////////////+nWw//hyK7/4ciu/+HIrv/hyK7/4ciu/+HIrv/hyK7/4ciu/+HIrv/s3c3/+fPv//7+ + /v/17eX/6tnI/+LKsf/hyK7/2L6i/8+zlv/Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66Q/9a6 + nv/dw6n/48y1/+jXxP/69vH//////wAA//8AAP////////Dj1//p1sT/8OPX//////8AAP//AAD//wAA + ////////8OPX/+HIr//hyK//4civ//Dj1///////AAD//wAA////////AAD//wAA//8AAP//AAD//wAA + //8AAP//AAD//wAA//8AAP//AAD/////////////6dbE/+HIr//hyK//4civ/+HIr//hyK//4civ/+HI + r//hyK//7N3O//n07//+/v7/9e3l/+rayf/iyrL/4civ/9i+o//Ps5b/yKqM/8iqjP/p2s3/////AP// + /wDcx7P/yKuN/8uukP/Wu5//3sSq/+TMtv/p18X/+vby//////8AAP//AAD////////w5Nj/4smx/+rX + xf///////////wAA//8AAP////////Dk2P/iybH/4smx/+LJsf/w5Nj//////wAA//8AAP////////// + //////////////////8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP////////Dk2P/iybH/4smx/+LJ + sf/iybH/4smx/+LJsf/iybH/4smx/+3ez//59O///v7+//Xt5v/q2sr/4su0/+LJsf/YvqT/z7OW/8iq + jP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpD/1rug/97Eq//kzbb/6dfF//r28v//////AAD//wAA + ////////8OTY/+LJsf/iybH/8OTY//////8AAP//AAD/////////////6tfF/+LJsf/iybH/8OTY//// + //8AAP//AAD////////69vL//fz7//n07/////////////////////////////////////////////// + ///q18X/4smx/+LJsf/iybH/4smx/+LJsf/iybH/4smx/+LJsf/t3s//+fTv//7+/v/17eb/6trK/+LM + tP/iybH/2L+k/8+zl//Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66Q/9a7oP/exaz/5M63/+nY + xv/69vL//////wAA//8AAP////////Dk2P/iyrL/4sqy//Dk2P//////AAD//wAA//8AAP////////Dk + 2P/iyrL/4sqy//Dk2P//////AAD//wAA//////////////37+v/z6uD/7d7P//Dk2P/w5Nj/8OTY//Dk + 2P/w5Nj/8OTY//Dk2P/q2Mb/4sqy/+LKsv/iyrL/4sqy/+LKsv/iyrL/4sqy/+LKsv/iyrL/7d7P//n0 + 7//+/v7/9e7m/+vbyv/jzLX/4sqy/9i/pf/Ps5f/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uu + kf/Wu6H/3sWt/+TOuP/p2Mf/+vby//////8AAP//AAD////////w5dn/4suz/+LLs//q2cf///////// + //8AAP//AAD////////w5dn/4suz/+LLs//w5dn//////wAA//8AAP//AAD////////9/Pv/8+rh/+bT + v//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LL + s//iy7P/4suz/+3f0P/59PD//v7+//bu5//r28v/4822/+LLs//Yv6X/z7OX/8iqjP/Iqoz/6drN//// + /wD///8A3Mez/8irjf/LrpH/1rui/97Frf/kzrn/6djH//r28v//////AAD//wAA/////////////+rZ + x//iy7P/8OXZ//////8AAP//AAD//wAA////////8OXZ/+LLs//iy7P/6tnH////////////AAD//wAA + /////////fz7//Pq4f/m07//4su0/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LLs//iy7P/4suz/+LL + s//iy7P/4suz/+LLs//iy7P/4suz/+LLs//t39H/+fTw//7+/v/27uf/69vM/+PNt//iy7T/2L+m/8+z + l//Iqoz/yKqM/+nazf////8A////ANzHs//Iq43/y66R/9a8ov/exq7/5M66/+nYyP/69vL//////wAA + //8AAP//AAD////////w5dn/4su0//Dl2f//////AAD//wAA//8AAP////////Dl2f/iy7T/4su0/+LL + tP/w5dn//////wAA//8AAP////////38/P/06+P/59XD/+LMtv/iy7X/4su1/+LLtP/iy7T/4su0/+LL + tP/iy7T/4su0/+LLtP/iy7T/4su0/+LLtP/iy7T/4su0/+LLtP/iy7T/7d/R//n08P/+/v7/9u7n/+vb + zP/jzbf/4su0/9jApv/Ps5f/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukf/WvKL/3sau/+TP + uv/p2cj/+vby//////8AAP//AAD//wAA////////8OXa/+LMtv/w5dr//////wAA//8AAP////////// + ///q2cn/4sy2/+LMt//izbj/8efc//////8AAP//AAD////////+/f3/+fTv//Hm2//r3c7/59XD/+TP + u//izbf/4sy2/+LMtv/izLb/4su2/+LLtf/iy7X/4su2/+LLtv/izLb/4sy2/+LMtv/izLf/4sy3/+3g + 0//59fD//v7+//bu5//r3M3/4824/+LLtf/YwKf/z7SY/8iqjP/Iqoz/6drN/////wD///8A3Mez/8ir + jf/LrpH/1ryj/97Gr//kz7v/6dnJ//r28v//////AAD//wAA//8AAP////////Lp4P/l08D/8ujf//// + //8AAP//AAD////////x593/5NC9/+XSv//m1ML/6NfG//Tt5f//////AAD//wAA/////////v7+//79 + /P/8+vf/9/Lt//Dm2//r3c7/6NfG/+bUwv/m08D/5dK+/+XQvf/k0Lv/5NC7/+TQvP/l0b3/5dK+/+bT + wP/m1MH/5tTD/+jWxf/x5tz/+vf0//7+/v/27+f/693N/+POuf/izLb/2MCo/8+0mP/Iqoz/yKqM/+na + zf////8A////ANzHs//Iq43/y66R/9a9o//ex7D/5NC8/+nZyv/69vP//////wAA//8AAP//AAD///// + ///59vL/9e3m////////////AAD//wAA////////9e7m/+zg0v/w5tv/9O3l//jz7//9/Pv//////wAA + //8AAP////////79/P/9/fv//v38//79/f/9/Pv//Pr4//n28//17uj/8unf//Dk2P/t4NP/693N/+vc + zP/s3s//7uHV//Dl2v/y6N7/9Ozj//bw6f/59fH//Pr5//7+/f/+/v7/9u/n/+vdzv/jz7r/4s23/9jB + qP/PtJj/yKqM/8iqjP/p2s3/////AP///wDcx7P/yKuN/8uukv/WvaT/3six/+PQvf/o2cn/9vHq//// + ////////AAD//wAA/////////fz7////////////AAD//wAA//////////////r28v/49PD/+vfz//v5 + 9//8+/n//v39//////8AAP//AAD/////////////9/Ls//j07//8+ff//Pv6//38+//9/Pv//Pn3//v3 + 9P/69vL/+fTw//jz7v/48+3/+PPu//n18f/69vP/+vf0//v59v/7+vf//Pv5//38+//9/Pv//fv5//Ts + 5P/q3M3/48+6/+LNuP/Ywqn/z7SY/8iqjP/Iqoz/6drN/////wD///8A3Mez/8irjf/LrpL/1r2k/97I + sv/jz7z/5tTD/+3h1P/49PD//////wAA//8AAP//////////////////AAD//wAA//8AAP////////79 + /f/9/Pv//fv7//z7+f/7+ff/+vb0//v49v//////AAD//wAA//8AAP////////Xt5v/u4tf/8ujg//Xu + 5//38u3/+fby//v59//8+vn//fv6//38+//9/Pv//fz7//38+//9+/r//Pv5//z7+f/7+vj/+vj0//j1 + 8P/38u3/9u/q//Ts5f/u4dX/59bF/+LOuv/izrn/2cKp/8+0mf/Iqoz/yKqM/+nazf////8A////ANzH + s//Iq43/y66S/9a9pf/eyLP/4866/+POuv/r3M////////////8AAP//AAD/////////////AAD//wAA + //8AAP/////////////69/T/+PTw//jz7//38ez/9e7n//Lp4P/y6eH///////////8AAP//AAD///// + ///x5tz/4867/+TRv//p2cr/7eDU//Hn3v/07ef/9vDq//fy7f/49PD/+PTw//j08P/49O//9/Pu//bx + 7P/28Or/9O7o//Lr4v/w5dv/7eHV/+rczv/n1sb/5NC+/+POu//jzrr/4866/9nCqv/PtJn/yKqM/8iq + jP/p2s3/////AP///wDcx7P/yKuN/8uukv/Wvqb/3sm0/+POu//jzrv/8efd//////8AAP//AAD//wAA + //8AAP//AAD//wAA//8AAP/////////////w5tz/693Q/+vdz//q3M7/59bG/+bUxP/l08L/5dLA//Ho + 3v//////AAD//wAA////////8ebd/+POu//jz7z/5NC+/+TSwP/l08L/5tTE/+bVxP/o2Mn/693Q/+vd + 0P/r3dD/6tzO/+nay//n1sb/5tXE/+bUxP/l1MP/5dPB/+TSwP/k0b//49C9/+PPvP/jzrv/4867/+PO + u//Zwqv/z7SZ/8iqjP/Iqoz/6drN/////wD///8A3Mi0/8mrjv/LrpL/1b2k/97JtP/jz7z/48+8//Hn + 3f//////AAD//wAA//8AAP//AAD//wAA///////////////////s39H/5dPC/+XTwv/l08L/5NPB/+PQ + vf/jz7z/48+8/+PPvP/x593//////wAA//8AAP////////Hn3f/jz7z/48+8/+PPvP/jz7z/48+8/+PP + vP/jz7z/49G+/+XTwv/l08L/5dPC/+XTwf/k0cD/48+9/+PPvP/jz7z/48+8/+PPvP/jz7z/48+8/+PP + vP/jz7z/48+8/+PPvP/jz7z/2MGq/86zmP/Iqoz/yKqN/+nbzv////8A////AN7Kt//KrpH/yq2Q/9O6 + oP/cx7L/4s+8/+PQvf/x597//////wAA//8AAP//AAD///////////////////Hn3v/q3M7/49C9/+PQ + vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/6tzO///////////////////////q3M7/49C9/+PQ + vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/j0L3/49C9/+PQ + vf/j0L3/49C9/+PQvf/j0L3/49C9/+PQvf/i0L3/4s+8/9a+pv/NsZX/yKqN/8uukv/q3ND/////AP// + /wDhz77/zrOY/8mrjv/PtJn/2cOt/+HOvP/i0b//6t3Q////////////AAD/////////////8ejf/+rd + 0P/j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//q3dD/8ejf//Ho + 3//q3dD/49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PR + v//j0b//49G//+PRv//j0b//49G//+PRv//j0b//49G//+PRv//i0b//4tC9/9/Muf/Rt57/yqyP/8ms + j//Qt57/7ODU/////wD///8A6dvP/9bAqf/Iqoz/y6+T/9S8pf/dybX/4tG//+LRwP/q3dH///////// + ////////6t3R/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PR + wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PR + wP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/49HA/+PRwP/j0cD/4tG//9/N + uv/XwKr/zbKW/8irjf/MsJT/3sq2/////wD///8A////AP///wDgzr3/zbGW/8qtkf/OtZr/1sCp/93L + uP/h0L7/4tLB/+re0f/x6OD/6t7R/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS + wf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS + wf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PSwf/j0sH/49LB/+PS + wf/i0sH/4dC//97Muf/Yw63/z7Wb/8qtkP/KrpH/07uj/+rcz/////8A////AP///wD///8A693R/9a/ + qf/LsJT/yq6S/861mv/WwKn/28m1/9/Nu//g0L7/4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ + v//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ + v//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQv//h0L//4dC//+HQ + v//h0L//4dC//+HQv//g0L7/38+8/9zKtv/Xwav/0Led/8msj//JrI7/0Led/9/Mu/////8A////AP// + /wD///8A////AP///wDm1sn/0bif/8qtkf/JrI//y7CU/9C3nv/Vvqf/2cOv/9rFsf/axbH/2sWx/9rF + sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rF + sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2sWx/9rF + sf/axbH/2sWx/9rFsf/axbH/2sWx/9rFsf/axbH/2cSv/9W/qP/RuJ//zLGW/8msj//Iqoz/y7CU/9zI + tP/w5dz/////AP///wD///8A////AP///wD///8A////AOPTxP/XwKr/zbKX/8mrjv/KrpH/zbGW/860 + mf/PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1 + m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1 + m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+1m//PtZv/z7Wb/8+0mv/MsZb/yq6S/8ms + jv/KrpH/07qi/+DNu//t4NX/////AP///wD///8A////AP///wD///8A////AP///wD///8A59jK/9zH + tP/SuaH/zbKW/8qukf/JrI//yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms + jv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms + jv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8msjv/JrI7/yayO/8ms + jv/JrI//yayP/8yxlf/RuJ//2cOu/+TUxf/w5Nv/////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wDt4tj/4dC//9S8pf/MsZX/yKuN/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iqjP/Iqoz/yKqM/8iq + jP/Iqoz/yKqM/8iqjP/Iqoz/yKqN/8qtkP/Tu6P/4M67/+zg1f////8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///////////gAAAAAAAP/4AAAAAAAAP/AAAAAAAAAf4AAAAAAA + AA/gAAAAAAAAB8AAAAAAAAAHwAAAAAAAAAOAAAAAAAAAA4AAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA + AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA + AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA + AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA + AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAA + AAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAA + AAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAGAAAAAAAAAA8AA + AAAAAAADwAAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/8AAAAAAAAf/////////// + + \ No newline at end of file diff --git a/DLSiteDumperCS/Properties/AssemblyInfo.cs b/DLSiteDumperCS/Properties/AssemblyInfo.cs index 5645abe..235fb1b 100644 --- a/DLSiteDumperCS/Properties/AssemblyInfo.cs +++ b/DLSiteDumperCS/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration( "" )] [assembly: AssemblyCompany( "" )] [assembly: AssemblyProduct( "DLSiteDumperCS" )] -[assembly: AssemblyCopyright( "Copyright © 2021" )] +[assembly: AssemblyCopyright( "Copyright © Wappen 2021" )] [assembly: AssemblyTrademark( "" )] [assembly: AssemblyCulture( "" )] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion( "1.0.0.0" )] -[assembly: AssemblyFileVersion( "1.0.0.0" )] +[assembly: AssemblyVersion( "1.2.0.0" )] +[assembly: AssemblyFileVersion( "1.2.0.0" )] diff --git a/DLSiteDumperCS/Properties/Resources.Designer.cs b/DLSiteDumperCS/Properties/Resources.Designer.cs index 8a6bfb0..2f00fc0 100644 --- a/DLSiteDumperCS/Properties/Resources.Designer.cs +++ b/DLSiteDumperCS/Properties/Resources.Designer.cs @@ -8,9 +8,10 @@ // //------------------------------------------------------------------------------ - -namespace DLSiteDumperCS.Properties -{ +namespace DLSiteDumperCS.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -18,53 +19,55 @@ namespace DLSiteDumperCS.Properties // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute( "System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0" )] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute( )] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute( )] - internal class Resources - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute( "Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode" )] - internal Resources( ) - { + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// - [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if( (resourceMan == null) ) - { + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DLSiteDumperCS.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// - [global::System.ComponentModel.EditorBrowsableAttribute( global::System.ComponentModel.EditorBrowsableState.Advanced )] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap dldump_icon { + get { + object obj = ResourceManager.GetObject("dldump_icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/DLSiteDumperCS/Properties/Resources.resx b/DLSiteDumperCS/Properties/Resources.resx index af7dbeb..6132ead 100644 --- a/DLSiteDumperCS/Properties/Resources.resx +++ b/DLSiteDumperCS/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\dldump_icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/DLSiteDumperCS/Resources/dldump_icon.png b/DLSiteDumperCS/Resources/dldump_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c35dd3361fa1640d040cec435751d7b884aa4955 GIT binary patch literal 4351 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 literal 0 HcmV?d00001 diff --git a/DLSiteDumperCS/ViewerDumper.cs b/DLSiteDumperCS/ViewerDumper.cs index 83a137a..d2abe4c 100644 --- a/DLSiteDumperCS/ViewerDumper.cs +++ b/DLSiteDumperCS/ViewerDumper.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Threading; using static Gdi32; @@ -11,72 +12,79 @@ using static User32; using HWND = System.IntPtr; -class ViewerDumper : IDisposable +namespace DLSiteDumperCS { - readonly DLSiteDumperCS.MainForm parentDialog; - - public string BaseSavePath { get; set; } - public int TargetPid { get; set; } - public int BasePageOffset { get; set; } = 1; - public string TargetImageExt { get; set; } = "png"; - public int BetweenPageDelayMs { get; set; } = 1000; - - public ViewerDumper( DLSiteDumperCS.MainForm parentDialog ) + class ViewerDumper : IDisposable { - this.parentDialog = parentDialog; - } + readonly MainForm parentDialog; - /// - /// Indicates that PID is valid and we can open process. - /// - public bool IsReady => viewer_process != HWND.Zero && viewer_area_main != HWND.Zero; - - Process viewerProcess; - HWND viewer_process; - HWND viewer_window_main; - - const int VIEWER_BUTTON_PARENT_CODE = 0xE805; - const int VIEWER_BUTTON_FIRST_CODE = 0x8023; - const int VIEWER_BUTTON_NEXT_CODE = 0x8020; - const int VIEWER_BUTTON_ZOOM_CODE = 0x800A; - const int VIEWER_AREA_PARENT_CODE = 0xE900; - const int VIEWER_AREA_MAIN_CODE = 0xE900; - const int STATUS_BAR = 59393; - - HWND viewer_button_parent; - HWND viewer_button_first; - HWND viewer_button_next; - HWND viewer_button_zoom; - HWND viewer_area_parent; - HWND viewer_area_main; - //Win32StatusBar m_ViewerStatusBar; - - public void Dispose( ) - { - if( viewer_process != IntPtr.Zero ) - CloseHandle( viewer_process ); - if( m_BmpMemoryStream != null ) - m_BmpMemoryStream.Dispose( ); - } + /* Configuration zone ////////////////////////*/ - public void Setup( int processId ) - { - TargetPid = processId; - viewerProcess = Process.GetProcessById( processId ); - viewer_process = OpenProcess( viewerProcess, ProcessAccessTypes.PROCESS_VM_READ | ProcessAccessTypes.PROCESS_QUERY_INFORMATION ); - - viewer_window_main = WndSearcher.SearchForWindowWithPid( viewerProcess.Id ); - - // Find all the subwindow by control ID - viewer_button_parent = GetDlgItem( viewer_window_main, VIEWER_BUTTON_PARENT_CODE ); - viewer_button_first = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_FIRST_CODE ); - viewer_button_next = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_NEXT_CODE ); - viewer_button_zoom = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_ZOOM_CODE ); - viewer_area_parent = GetDlgItem( viewer_window_main, VIEWER_AREA_PARENT_CODE ); - viewer_area_main = GetDlgItem( viewer_area_parent, VIEWER_AREA_MAIN_CODE ); - - // Note: I tried to read status bar that displaying page number, - // but looks like its text is hidden. So no auto page detection for now + public string BaseSavePath { get; set; } + public int TargetPid { get; set; } + public int BasePageOffset { get; set; } = 1; + public int BetweenPageDelayMs { get; set; } = 1000; + + OutputFormat m_TargetImageFormat = OutputFormat.Png; + + public ViewerDumper( DLSiteDumperCS.MainForm parentDialog ) + { + this.parentDialog = parentDialog; + } + + /// + /// Indicates that PID is valid and we can open process. + /// + public bool IsReady => viewer_process != HWND.Zero && viewer_area_main != HWND.Zero; + + Process viewerProcess; + HWND viewer_process; + HWND viewer_window_main; + + const int VIEWER_BUTTON_PARENT_CODE = 0xE805; + const int VIEWER_BUTTON_FIRST_CODE = 0x8023; + const int VIEWER_BUTTON_NEXT_CODE = 0x8020; + const int VIEWER_BUTTON_ZOOM_CODE = 0x800A; + const int VIEWER_AREA_PARENT_CODE = 0xE900; + const int VIEWER_AREA_MAIN_CODE = 0xE900; + const int STATUS_BAR = 59393; + + HWND viewer_button_parent; + HWND viewer_button_first; + HWND viewer_button_next; + HWND viewer_button_zoom; + HWND viewer_area_parent; + HWND viewer_area_main; + //Win32StatusBar m_ViewerStatusBar; + + public void Dispose( ) + { + if( viewer_process != IntPtr.Zero ) + CloseHandle( viewer_process ); + if( m_BmpMemoryStream != null ) + m_BmpMemoryStream.Dispose( ); + if( m_JpegEncoderParams != null ) + m_JpegEncoderParams.Dispose( ); + } + + public void SetupTargetPid( int processId ) + { + TargetPid = processId; + viewerProcess = Process.GetProcessById( processId ); + viewer_process = OpenProcess( viewerProcess, ProcessAccessTypes.PROCESS_VM_READ | ProcessAccessTypes.PROCESS_QUERY_INFORMATION ); + + viewer_window_main = WndSearcher.SearchForWindowWithPid( viewerProcess.Id ); + + // Find all the subwindow by control ID + viewer_button_parent = GetDlgItem( viewer_window_main, VIEWER_BUTTON_PARENT_CODE ); + viewer_button_first = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_FIRST_CODE ); + viewer_button_next = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_NEXT_CODE ); + viewer_button_zoom = GetDlgItem( viewer_button_parent, VIEWER_BUTTON_ZOOM_CODE ); + viewer_area_parent = GetDlgItem( viewer_window_main, VIEWER_AREA_PARENT_CODE ); + viewer_area_main = GetDlgItem( viewer_area_parent, VIEWER_AREA_MAIN_CODE ); + + // Note: I tried to read status bar that displaying page number, + // but looks like its text is hidden. So no auto page detection for now #if false HWND statusBarHwnd = GetDlgItem( viewer_window_main, STATUS_BAR ); m_ViewerStatusBar = new Win32StatusBar( viewer_process, statusBarHwnd ); @@ -88,204 +96,228 @@ public void Setup( int processId ) Debug.Print( $"caption {i} = {caption}" ); } #endif - } - - BackgroundWorker worker; - DoWorkEventArgs workerArg; - public void SetupBackgroundWorker( BackgroundWorker worker, DoWorkEventArgs e ) - { - this.worker = worker; - workerArg = e; - } + } - struct ViewerState - { - public bool hasData; - public WINDOWPLACEMENT original_window_placement; - public WINDOWPLACEMENT temp_window_placement; - public RECT original_window_rect; - public int original_zoom_selection; + ImageCodecInfo m_JpegEncoder; + EncoderParameters m_JpegEncoderParams; - public void SaveSnapshot( HWND viewer_window_main, HWND viewer_button_zoom ) + public void SetupOutputEncoder( OutputFormat usingOutputImageFormat ) { - hasData = true; + m_TargetImageFormat = usingOutputImageFormat; - // Current placement - original_window_placement = default; - original_window_placement.Length = Marshal.SizeOf( original_window_placement ); - GetWindowPlacement( viewer_window_main, ref original_window_placement ); + if( m_JpegEncoder == null ) + m_JpegEncoder = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == ImageFormat.Jpeg.Guid); - // Current zoom state - original_zoom_selection = (int)SendMessage( viewer_button_zoom, CB_GETCURSEL ); + int quality = 100; + switch( m_TargetImageFormat ) + { + case OutputFormat.Jpeg80: + quality = 80; break; + case OutputFormat.Jpeg50: + quality = 50; break; + } - GetWindowRect( viewer_window_main, ref original_window_rect ); + if( m_JpegEncoderParams == null ) + m_JpegEncoderParams = new EncoderParameters(1); + m_JpegEncoderParams.Param[0] = new EncoderParameter( Encoder.Quality, quality ); } - public void Restore( HWND viewer_window_main, HWND viewer_button_zoom ) + BackgroundWorker worker; + DoWorkEventArgs workerArg; + public void SetupBackgroundWorker( BackgroundWorker worker, DoWorkEventArgs e ) { - // Restore window size and state - var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate; - SetWindowPos( viewer_window_main, IntPtr.Zero, 0, 0, original_window_rect.Right - original_window_rect.Left, original_window_rect.Top - original_window_rect.Bottom, targetWindowPosFlags ); - SetWindowPlacement( viewer_window_main, ref original_window_placement ); + this.worker = worker; + workerArg = e; + } + + struct ViewerState + { + public bool hasData; + public WINDOWPLACEMENT original_window_placement; + public WINDOWPLACEMENT temp_window_placement; + public RECT original_window_rect; + public int original_zoom_selection; + + public void SaveSnapshot( HWND viewer_window_main, HWND viewer_button_zoom ) + { + hasData = true; + + // Current placement + original_window_placement = default; + original_window_placement.Length = Marshal.SizeOf( original_window_placement ); + GetWindowPlacement( viewer_window_main, ref original_window_placement ); - // Restore zoom level - //ComboBox_SetCurSel( viewer_button_zoom, original_zoom_selection ); - //SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), (LPARAM)viewer_button_zoom ); + // Current zoom state + original_zoom_selection = (int)SendMessage( viewer_button_zoom, CB_GETCURSEL ); + + GetWindowRect( viewer_window_main, ref original_window_rect ); + } + + public void Restore( HWND viewer_window_main, HWND viewer_button_zoom ) + { + // Restore window size and state + var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate; + SetWindowPos( viewer_window_main, IntPtr.Zero, 0, 0, original_window_rect.Right - original_window_rect.Left, original_window_rect.Top - original_window_rect.Bottom, targetWindowPosFlags ); + SetWindowPlacement( viewer_window_main, ref original_window_placement ); + + // Restore zoom level + //ComboBox_SetCurSel( viewer_button_zoom, original_zoom_selection ); + //SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), (LPARAM)viewer_button_zoom ); + } } - } - ViewerState m_ViewerState; + ViewerState m_ViewerState; - void PrepareViewerForDump( ) - { - // Store original window position and state - // Window will be shrunken to ensure window size is smaller than the image - // This is necessary so that the immage in memory will not be padded - if( !m_ViewerState.hasData ) - m_ViewerState.SaveSnapshot( viewer_window_main, viewer_button_zoom ); + void PrepareViewerForDump( ) + { + // Store original window position and state + // Window will be shrunken to ensure window size is smaller than the image + // This is necessary so that the immage in memory will not be padded + if( !m_ViewerState.hasData ) + m_ViewerState.SaveSnapshot( viewer_window_main, viewer_button_zoom ); - WINDOWPLACEMENT temp_window_placement = m_ViewerState.original_window_placement; - temp_window_placement.ShowCmd = ShowWindowCommands.Show; - SetWindowPlacement( viewer_window_main, ref temp_window_placement ); + WINDOWPLACEMENT temp_window_placement = m_ViewerState.original_window_placement; + temp_window_placement.ShowCmd = ShowWindowCommands.Show; + SetWindowPlacement( viewer_window_main, ref temp_window_placement ); - // Set zoom level to 100% - SendMessage( viewer_button_zoom, CB_SELECTSTRING, -1, "100%" ); + // Set zoom level to 100% + SendMessage( viewer_button_zoom, CB_SELECTSTRING, -1, "100%" ); - // Programatically selecting a ComboBox option will not send a selection change message to the parent, so do that manually - SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), viewer_button_zoom ); + // Programatically selecting a ComboBox option will not send a selection change message to the parent, so do that manually + SendMessage( viewer_button_parent, WM_COMMAND, MAKEWPARAM( VIEWER_BUTTON_ZOOM_CODE, CBN_SELCHANGE ), viewer_button_zoom ); - var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate; - SetWindowPos( viewer_window_main, HWND.Zero, 0, 0, 256, 256, targetWindowPosFlags ); + var targetWindowPosFlags = SetWindowPosFlags.IgnoreZOrder | SetWindowPosFlags.DoNotChangeOwnerZOrder | SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate; + SetWindowPos( viewer_window_main, HWND.Zero, 0, 0, 256, 256, targetWindowPosFlags ); - // Send a virtual click to the first page button - // Note: This was removed because original author lets user specify first page to capture in case of crash - // SendMessage(viewer_button_first, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(1, 1)); - // SendMessage(viewer_button_first, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(1, 1)); + // Send a virtual click to the first page button + // Note: This was removed because original author lets user specify first page to capture in case of crash + // SendMessage(viewer_button_first, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(1, 1)); + // SendMessage(viewer_button_first, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(1, 1)); - // It seems it takes some time for messages to propagate to other buttons, so wait until the next button is enabled - // This will prevent the bug where if the Viewer was opened to the last page, it would only export the first image - Thread.Sleep( 1000 ); - } + // It seems it takes some time for messages to propagate to other buttons, so wait until the next button is enabled + // This will prevent the bug where if the Viewer was opened to the last page, it would only export the first image + Thread.Sleep( 1000 ); + } - - void RestoreViewerState( ) - { - if( m_ViewerState.hasData ) - m_ViewerState.Restore( viewer_window_main, viewer_button_zoom ); - } - byte[] m_ImageDumpBuffer; + void RestoreViewerState( ) + { + if( m_ViewerState.hasData ) + m_ViewerState.Restore( viewer_window_main, viewer_button_zoom ); + } - public void DumpBatch( ) - { - PrepareViewerForDump( ); + byte[] m_ImageDumpBuffer; - // Beginning RIP - // Continue until the next button becomes disabled, indicating the last image - bool ending = false; - for( int pages = BasePageOffset; ; pages++ ) + public void DumpBatch( ) { - if( worker.CancellationPending ) - { - workerArg.Cancel = true; - break; - } + PrepareViewerForDump( ); - // If the next button is disabled, we reached the end; grab one last image and finish - if( GetWindowLongHasFlag( viewer_button_next, GWL.GWL_STYLE, WindowStyles.WS_DISABLED ) ) + // Beginning RIP + // Continue until the next button becomes disabled, indicating the last image + bool ending = false; + for( int pages = BasePageOffset; ; pages++ ) { - ending = true; - workerArg.Result = "Capture operation completed successfully."; - } + if( worker.CancellationPending ) + { + workerArg.Cancel = true; + break; + } - _DumpOneImpl( pages ); - if( ending ) - break; + // If the next button is disabled, we reached the end; grab one last image and finish + if( GetWindowLongHasFlag( viewer_button_next, GWL.GWL_STYLE, WindowStyles.WS_DISABLED ) ) + { + ending = true; + workerArg.Result = "Capture operation completed successfully."; + } - _NextPage( ); - } + _DumpOneImpl( pages ); + if( ending ) + break; - } + _NextPage( ); + } - public void DumpOne( ) - { - PrepareViewerForDump( ); + } - _DumpOneImpl( BasePageOffset ); - } + public void DumpOne( ) + { + PrepareViewerForDump( ); - void _DumpOneImpl( int pageNumber ) - { - // As a hack, the dimensions of the images are determined by - // looking at the size of the scroll area - // This requires that the image area be smaller than the image - SCROLLINFO sih = default, siv = default; - - sih.cbSize = (uint)Marshal.SizeOf( sih ); - sih.fMask = (uint)ScrollInfoMask.SIF_ALL; - siv.cbSize = (uint)Marshal.SizeOf( siv ); - siv.fMask = (uint)ScrollInfoMask.SIF_ALL; - - GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_HORZ, ref sih ); - GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_VERT, ref siv ); - - int w = sih.nMax - sih.nMin + 1; - int h = siv.nMax - siv.nMin + 1; - - int imageSize = (((w * 32 + 31) & ~31) >> 3) * h; - if( m_ImageDumpBuffer == null || m_ImageDumpBuffer.Length < imageSize ) - m_ImageDumpBuffer = new byte[imageSize]; - - // Prepare BMP header for hijacking - BITMAPFILEHEADER bmf = default; - BITMAPINFOHEADER bmi = default; - - bmf.bfType = 0x4d42; - bmf.bfSize = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ) + imageSize); - bmf.bfOffBits = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi )); - - bmi.biSize = 40; // Size of info header, must be 40 - bmi.biWidth = w; - bmi.biHeight = -h; - bmi.biPlanes = 1; - bmi.biBitCount = 32; // Data dumped from mem is 32bpp - bmi.biCompression = 0; - //bmi.biSizeImage = (uint)imageSize; // biSizeImage is not required if there is no compression - - byte[] bmfHeaderBytes = StructToBytes( bmf ); - byte[] bmiHeaderBytes = StructToBytes( bmi ); - - for( IntPtr address = default; ; ) + _DumpOneImpl( BasePageOffset ); + } + + void _DumpOneImpl( int pageNumber ) { - MEMORY_BASIC_INFORMATION mbi = default; - int actualByteRead = -1; - while( VirtualQueryEx( viewer_process, address, out mbi, (uint)Marshal.SizeOf( mbi ) ) != 0 ) + // As a hack, the dimensions of the images are determined by + // looking at the size of the scroll area + // This requires that the image area be smaller than the image + SCROLLINFO sih = default, siv = default; + + sih.cbSize = (uint)Marshal.SizeOf( sih ); + sih.fMask = (uint)ScrollInfoMask.SIF_ALL; + siv.cbSize = (uint)Marshal.SizeOf( siv ); + siv.fMask = (uint)ScrollInfoMask.SIF_ALL; + + GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_HORZ, ref sih ); + GetScrollInfo( viewer_area_main, (int)SBOrientation.SB_VERT, ref siv ); + + int w = sih.nMax - sih.nMin + 1; + int h = siv.nMax - siv.nMin + 1; + + int imageSize = (((w * 32 + 31) & ~31) >> 3) * h; + if( m_ImageDumpBuffer == null || m_ImageDumpBuffer.Length < imageSize ) + m_ImageDumpBuffer = new byte[imageSize]; + + // Prepare BMP header for hijacking + BITMAPFILEHEADER bmf = default; + BITMAPINFOHEADER bmi = default; + + bmf.bfType = 0x4d42; + bmf.bfSize = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi ) + imageSize); + bmf.bfOffBits = (uint)(Marshal.SizeOf( bmf ) + Marshal.SizeOf( bmi )); + + bmi.biSize = 40; // Size of info header, must be 40 + bmi.biWidth = w; + bmi.biHeight = -h; + bmi.biPlanes = 1; + bmi.biBitCount = 32; // Data dumped from mem is 32bpp + bmi.biCompression = 0; + //bmi.biSizeImage = (uint)imageSize; // biSizeImage is not required if there is no compression + + byte[] bmfHeaderBytes = StructToBytes( bmf ); + byte[] bmiHeaderBytes = StructToBytes( bmi ); + + for( IntPtr address = default; ; ) { - if( mbi.State == (uint)MemState.MEM_COMMIT && mbi.Type == (uint)MemType.MEM_PRIVATE && mbi.Protect == (uint)PageAllocationProtect.PAGE_READWRITE && mbi.RegionSize.ToInt32( ) >= imageSize ) + MEMORY_BASIC_INFORMATION mbi = default; + int actualByteRead = -1; + while( VirtualQueryEx( viewer_process, address, out mbi, (uint)Marshal.SizeOf( mbi ) ) != 0 ) { - IntPtr byteRead; - if( !ReadProcessMemory( viewer_process, mbi.BaseAddress, m_ImageDumpBuffer, imageSize, out byteRead ) ) + if( mbi.State == (uint)MemState.MEM_COMMIT && mbi.Type == (uint)MemType.MEM_PRIVATE && mbi.Protect == (uint)PageAllocationProtect.PAGE_READWRITE && mbi.RegionSize.ToInt32( ) >= imageSize ) { - Debug.Print( $"ReadProcessMemory failed at PID {viewer_process} addess 0x{mbi.BaseAddress:X} size {imageSize}. But it will continue..." ); - continue; + IntPtr byteRead; + if( !ReadProcessMemory( viewer_process, mbi.BaseAddress, m_ImageDumpBuffer, imageSize, out byteRead ) ) + { + Debug.Print( $"ReadProcessMemory failed at PID {viewer_process} addess 0x{mbi.BaseAddress:X} size {imageSize}. But it will continue..." ); + continue; + } + + actualByteRead = byteRead.ToInt32( ); + Debug.Print( "ReadProcessMemory success\n" ); } - actualByteRead = byteRead.ToInt32( ); - Debug.Print( "ReadProcessMemory success\n" ); + // Iterate to see next memory page + address = IntPtr.Add( mbi.BaseAddress, mbi.RegionSize.ToInt32( ) ); } - // Iterate to see next memory page - address = IntPtr.Add( mbi.BaseAddress, mbi.RegionSize.ToInt32( ) ); - } - - // Write to file - // Three digit decimal with padding - if( actualByteRead > 0 ) - { - string filename = GetFileNameForPage( pageNumber, TargetImageExt ); - string outputPath = Path.Combine( BaseSavePath, filename ); + // Write to file + if( actualByteRead > 0 ) + { + string fileExt = Helper.GetOutputExt( m_TargetImageFormat ); + string filename = GetFileNameForPage( pageNumber, fileExt ); + string outputPath = Path.Combine( BaseSavePath, filename ); - worker.ReportProgress( 0, $"Dumping page {pageNumber}\nto {outputPath}" ); + worker.ReportProgress( 0, $"Dumping page {pageNumber}\nto {outputPath}" ); #if false // This was saving plain BMP file try @@ -302,45 +334,55 @@ void _DumpOneImpl( int pageNumber ) Debug.Print( $"Failed to write to {outputPath}\n{e.Message}" ); } #endif - // Transfer to in-memory BMP file and convert - { - if( m_BmpMemoryStream == null ) - m_BmpMemoryStream = new MemoryStream( ); - m_BmpMemoryStream.SetLength( 0 ); // Reset and reuse it - - m_BmpMemoryStream.Write( bmfHeaderBytes, 0, bmfHeaderBytes.Length ); - m_BmpMemoryStream.Write( bmiHeaderBytes, 0, bmiHeaderBytes.Length ); - m_BmpMemoryStream.Write( m_ImageDumpBuffer, 0, actualByteRead ); - - Image bmp = Image.FromStream( m_BmpMemoryStream ); - - if( TargetImageExt == "png" ) - bmp.Save( outputPath, ImageFormat.Png ); - else if( TargetImageExt == "jpg" ) - bmp.Save( outputPath, ImageFormat.Jpeg ); + // Transfer to in-memory BMP file and convert + { + if( m_BmpMemoryStream == null ) + m_BmpMemoryStream = new MemoryStream( ); + m_BmpMemoryStream.SetLength( 0 ); // Reset and reuse it + + m_BmpMemoryStream.Write( bmfHeaderBytes, 0, bmfHeaderBytes.Length ); + m_BmpMemoryStream.Write( bmiHeaderBytes, 0, bmiHeaderBytes.Length ); + m_BmpMemoryStream.Write( m_ImageDumpBuffer, 0, actualByteRead ); + + Image bmp = Image.FromStream( m_BmpMemoryStream ); + + switch( m_TargetImageFormat ) + { + case OutputFormat.Jpeg80: + case OutputFormat.Jpeg50: + bmp.Save( outputPath, m_JpegEncoder, m_JpegEncoderParams ); + break; + default: + case OutputFormat.Png: + bmp.Save( outputPath, ImageFormat.Png ); + break; + } + } } - } - Debug.Print( "Image dump ok, switch page." ); - break; + Debug.Print( "Image dump ok, switch page." ); + break; + } } - } - MemoryStream m_BmpMemoryStream; - - void _NextPage( ) - { - // Once image memory is ours, 'click' to the next image - SendMessage( viewer_button_next, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM( 1, 1 ) ); - SendMessage( viewer_button_next, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM( 1, 1 ) ); + MemoryStream m_BmpMemoryStream; - // There is delay for DLS to decode-display an image - // So wait a bit - Thread.Sleep( BetweenPageDelayMs ); - } + void _NextPage( ) + { + // Once image memory is ours, 'click' to the next image + SendMessage( viewer_button_next, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM( 1, 1 ) ); + SendMessage( viewer_button_next, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM( 1, 1 ) ); - public static string GetFileNameForPage( int page, string ext ) - { - return $"{page:D3}.{ext}"; + // There is delay for DLS to decode-display an image + // So wait a bit + Thread.Sleep( BetweenPageDelayMs ); + } + + public static string GetFileNameForPage( int page, string ext ) + { + // Three digit decimal with padding + // e.g., 001.png 002.png + return $"{page:D3}.{ext}"; + } } } \ No newline at end of file diff --git a/DLSiteDumperCS/dldump_icon_kr9_icon.ico b/DLSiteDumperCS/dldump_icon_kr9_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..572160ff78e7b089dcdfa476b9753e40c25cb56e GIT binary patch literal 34494 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 literal 0 HcmV?d00001 diff --git a/dldump_icon_kr9_icon.ico b/dldump_icon_kr9_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..572160ff78e7b089dcdfa476b9753e40c25cb56e GIT binary patch literal 34494 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