MZ@ !L!This program cannot be run in DOS mode. $PELj  $$B `@ @lBO` !  H.text" $ `.rsrc !`"&@@.reloc H@BBH<0Kr(L0 rp s  s ( -}( -}(+} _3 `_3  `~   (-0so }!o }"rp}#**( *~ }!~ }"~ }#( *{$*"}$**x2s **"s ****0S{',{'o }'*s }'{'#o {'o {'o *{%*"}%*0( ( YX( ( YXs  +? +%(!  {%{$s" X ( ( Y1X ( ( Y1* *6 Ts **xTs *_,o# rp('*o# rp('****0 ($ (% **0 2(& x(' **{&*"}&*~}$(( o) }&(* *07s "@"PAs+ o, o- s. s/ s0 s0 ( ,, rpo1 +r%po1 +o1  s2 o3 (4 o5 (6 Z[Ys7 o8 o9 o: o; ,o< Po1  o= o>  Yo? ((@ ( , rGpo1 + o1 ((@ ( ,rMpo1 + o1 oA oA  o> Y(B o= $XKo? ]o> MY(B o= $XKo? o1  o>  X(B o= GXs7 oC o: 9      oD oE oF (G oH (I oJ &oK oL  oM oN oO oP Q**( *( *0-*oQ /*s "@"PAs+ o, o- oQ L sR s0 ( -ns. o1  s2 o3 (4 o5   (6 Z[Ys7 o8 o9 o: o; o= o> (4 o5   (6 Z[YoS 8oT  sU  oV o1 3 oW  s2 o3 o9 o: o; oX 1<oY   oX Y[XZoZ o[ o9 o= o> 1 o>  o\ ( - o\ o] Xo^ : ,o_ o` rGpo1 oA  MY(B $XKo? ( ,(( o) o1 +o1   X(B GXs7 oC o: o; oE oF (G oH (I oJ &oK oL  oM oO 3* +oa , XoQ 2 **A4 ( *0P@sb Q ,  ,  @(%2o *r[p*0s) s. ( , r_po1 +o1  s2 o3 (4 o5 (6 Z[Ys7 o8 o9 o: o; o1  o>  X(B o= 7Xs7 oC oE oF (G oH (I oJ &oK oL }(oO &{)*( *0N}(( "@"PAs+ (, (- *sc (d +sc (e *0-{(9!|)of (g |)oh oi oj ok _(&ol (m |)(n |)(o oj , |)(o ok ,E|)%(p  `(o oj -)of @1of `/|)of @Y(m oi ,|)%(p `(o oq _1|)%(p `(o oq _1|)%(p  `(o ( *0-{(:!|)of (g |)oh oi oj ok _(&ol (m |)(n |)(o oj , |)(o ok ,E|)%(p  `(o oj -)of @1of `/|)of @Y(m oi ,|)%(p `(o oq _1|)%(p `(o oq _1|)%(p  `(o ( *0  E-8NCYd" oz8(r *(s *(t *rwp(u *rp(u *rp(u *rp(u *rp(u *rp(u *rp(u *rp(u *rp(u *(v *(w *(x *(y *0C}*rp}+sz },}-}.s{ }0( (0*0J}*rp}+sz },}-}.s{ }0( }*(0*0Q}*rp}+sz },}-}.s{ }0( }+}*(0*0(| "@"PAs+ (, (- o} {+o1  (Z  ([ (x o~ (E (K (L ( (F ( {,1s o {,#I@o {,o {,o *0m{/,*}/{-2L{.2({0{-o {3{.o }.{0{-o {3o }/*0s. }1{1o {1hZ Xo {1 o[ {1oZ {1{1o s o {1rpo1 (: {1o; s. }2{2o {2hZXo {2 o[ {2oZ {2rpo1 (: {2o; s }3{3o {3o {3{*(,o {8/:{3 {8ZYs7 o {3{8ZXo +'{3 "s7 o {3 o {3hZ/Xo (: {3o; s. }4{4o {4hZHXo {4 o[ {4oZ {4rpo1 (: {4o; s. }5{5o {5hZXXo {5 o[ {5oZ {5rpo1 (: {5o; *2{0o *0: -*  +!{0o {6o 3 +X {0o 2o @?{-3}-(: {0o {1o (: {0o {2o (: {0o {3o (: {0o {4o (: {0o {5o {0o {1o {0o {2o {0o {3o {0o {4o {0o {5o {0o {0o -{,o {,o ( */* 8{0o {1hZ Xo {0o {2hZXo {0o {3hZ/Xo {0o {4hZHXo {0o {5hZXXo X {0o ?Zh{0o Z+X(4 o5   ( 0]h{0o Z+X(Z (4 o5   (6 (X Y[(4 o5   ( (Y Y[s2 ( *(4 o5   ( (Z (4 o5 (6 (X Y[s2 ( *< o }6o }7}8{72;+'{0o {6{73+X{0o 2?{0o {8X}8X+]{0o {8{826{0o {8{83!{0o {7{7.+X{0o 230{0o (2{0o {0 o 8(2 {0 o X8{0o {1hZ Xo {0o {2hZXo {0o {3hZ/Xo {0o {4hZHXo {0o {5hZXXo X{0o ?Mh{0o Z+X(4 o5 ( 0^h{0o Z+X(Z (4 o5 (6 (X Y[(4 o5 ( (Y Y[s2 ( +C(4 o5 ( (Z (4 o5 (6 (X Y[s2 ( o ( -{0o {1o o1 +{0o {1rpo1 o ( -{0o {2o o1 +{0o {2rpo1 o 2xo d0no d/ {0o {3o Xo +{0o {3co {0o {3o }-o }.+oo d1>{0o {3o {0o {3o }-}.+'{0o {3o {-3}-o 2` o ( {0o {4rpr)p ( i] ( ] ( ]( ( o1 +{0o {4rpo1 o ( -{0o {5o o1 +{0o {5rpo1 ( *0@ }:}<}>}@}B}C( s}9*0. ( ,( --(( o) rp ( - ( - ( &rp}Ds o 8o  o ( ,3( + o ( o 9o rSp`( rp( ( `o  ~ o o  rp o ( -rp o  ]( }Do   ( ,? (  rp  o &  z X +rp o th  o  s o 8Q"( ( 9!( ( 9 o ( -rp o ( }D o ( -%{Drp( }Do rp( , o o +7( , o -"( &rpo rprp( -+Trprprprpo +2 o ( -rp o ( }Do  o s o zo^ :H ,o_ rp}D*Adouig tFiV 0 (# 3 *0Q ( ,=s {"o +  o X i2{!s **0O ( ,=s {"o +  o X i2{!s **{9*0)rp {9o# {D(!3*rp*0ps ( (  3( +O( 3#o 1o Yo rIp( +( ,( o rQp( +*0Qs rp {9o# {D( 3' + ol o X o 2*( -rUp( ,{9o# ( &*( -rUp( ,{9o# ( &*Z{9o# @( &*Z{9o# ( &*^rp{9o# ( &*( -rUp( ,{9o# ( &*( -rUp( ,{9o# ( &*0c{E-1o 3*{9o# {Bs/}E{Eo {Eo4o 3{Eo3-}E*Z{9o# @( &*Z{9o# 0( &*0@( o }H( o }I( }J( }F}G*0.{G-*{K%-&{GsU( % }K*{H*{I*{J*rYp*{G*."s *****f{Fok{Fom*r( - ryps z}L*2{L{:*6{L}:*2{L{;*6{L};*2{L{<*6{L}<*2{L{=*6{L}=*2{L{>*6{L}>*2{L{?*6{L}?*2{L{@*6{L}@*2{L{A*6{L}A*2{L{B*6{L}B*2{L{C*6{L}C*{M*"}M*{N*"}N*( *{Oto o o o o *{Ot o o o o *Vo , {Po &*0"su( st  ~ s5}O{OsH s }P(( ss o ( o o o rp(( o b\o o ( o o o -vs o s ( ,rp+ o ( %-o s -ws o    rp  8   rp( - 8 rpo ,a 3!!rp!o i. rp(( o) ( &bb""""o +y rp( - X +y rp( - +N ,3 rp( , rp( , rp( -  + rp( -( &+ X  X  i?(G rpo ( s  o  ( -(  r ,o 3##rp#(( o) #rp##rp#(( o) #r4p# #r8p#(  o  &+ o  & ,o_ ,o_  :rTps  8o o 9lo o @Z( :J, o &o o o o rp( ,o o o 8#o o o rp( -#o o o o rp( ,(o o o o &8o o o rp( -#o o o o rp( ,%o o o o &+To o o o o o o &+#,o &+ o &Xi?H, o &rpo &rpo &-xs o+&on-{Pdo ,o o  o! 3{Oo  o" o o ,o_ o# ,o_ (rpo ( (( o) ( &,rp(( o) ( &op**A|, ~:  hb `x(ijr.p(( o) ( s$ z( *# WarRock launcher. # Custom-skinned launcher: checks the update manifest, shows progress over the # background art, then lets the player start the game via the Play button. Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # --------------------------------------------------------------------------- # First-run self-install to %LocalAppData%. Someone can put just this one exe # on their Desktop/Downloads - the first time it runs, it relocates itself to # a real per-user install directory instead of running in place. Every path # below this point is $nexonRoot-relative, so once this block redirects # execution to the installed copy, nothing else in the script needs to know # or care where it originally launched from. # # Deliberately NOT Program Files: warrock.exe is a native, non-UAC-aware game # client that reads/writes files in its own directory during normal play # (resource/cache writes etc.) - even though an elevated install-copy step # can write *into* Program Files, the game process itself runs unelevated and # hit "Failed function: read Character loadWRChar" on startup from there, a # permissions-shaped failure during its very first resource-load phase. # %LocalAppData% is always fully writable by the owning user with no # elevation anywhere in this flow, which sidesteps that whole class of bug. # --------------------------------------------------------------------------- $installRoot = Join-Path $env:LOCALAPPDATA "WarRock Nostalgia" $installedExePath = Join-Path $installRoot "WarRock Nostalgia.exe" $installedMarker = Join-Path $installRoot ".installed" $currentExePath = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName $runningFromInstall = $currentExePath -eq $installedExePath if (-not $runningFromInstall) { if ((Test-Path $installedMarker) -and (Test-Path $installedExePath)) { # Already installed elsewhere on this machine - this is just an old # copy of the exe (Desktop/Downloads) being run again. Hand off to # the real install instead of running a second, out-of-date copy. Start-Process -FilePath $installedExePath exit } # First run ever: copy directly into place, no elevation needed since # %LocalAppData% is always writable by the current user. try { New-Item -ItemType Directory -Force -Path $installRoot | Out-Null Copy-Item -Path $currentExePath -Destination $installedExePath -Force $startMenuDir = Join-Path $env:AppData "Microsoft\Windows\Start Menu\Programs" $shortcutPath = Join-Path $startMenuDir "WarRock Nostalgia.lnk" $wshShell = New-Object -ComObject WScript.Shell $shortcut = $wshShell.CreateShortcut($shortcutPath) $shortcut.TargetPath = $installedExePath $shortcut.WorkingDirectory = $installRoot $shortcut.IconLocation = $installedExePath $shortcut.Save() Set-Content -Path $installedMarker -Value (Get-Date).ToString("o") -NoNewline Start-Process -FilePath $installedExePath } catch { [System.Windows.Forms.MessageBox]::Show( "Installation failed:`n$($_.Exception.Message)", "WarRock Nostalgia", "OK", "Error") | Out-Null } exit } # --------------------------------------------------------------------------- # Palette / fonts (pulled from the WarRock Nostalgia key art) # --------------------------------------------------------------------------- $colorGround = [System.Drawing.Color]::FromArgb(255, 12, 12, 10) # near-black $colorPanel = [System.Drawing.Color]::FromArgb(255, 14, 13, 11) # sidebar / panel fill (fully opaque) $colorPanelEdge = [System.Drawing.Color]::FromArgb(255, 58, 46, 26) # dark bronze border $colorGold = [System.Drawing.Color]::FromArgb(255, 212, 169, 58) # amber accent $colorGoldDim = [System.Drawing.Color]::FromArgb(255, 150, 118, 40) $colorTextMain = [System.Drawing.Color]::FromArgb(255, 201, 194, 180) # warm off-white $colorTextMuted = [System.Drawing.Color]::FromArgb(255, 140, 133, 120) # warm grey $colorProgTrack = [System.Drawing.Color]::FromArgb(200, 30, 27, 22) $colorHover = [System.Drawing.Color]::FromArgb(255, 30, 27, 20) $fontNav = New-Object System.Drawing.Font("Segoe UI Semibold", 10, [System.Drawing.FontStyle]::Regular) $fontStatus = New-Object System.Drawing.Font("Segoe UI", 9.5, [System.Drawing.FontStyle]::Regular) $fontDetail = New-Object System.Drawing.Font("Segoe UI", 8.5, [System.Drawing.FontStyle]::Regular) $fontPlay = New-Object System.Drawing.Font("Segoe UI Semibold", 13, [System.Drawing.FontStyle]::Bold) $fontFooter = New-Object System.Drawing.Font("Segoe UI", 8, [System.Drawing.FontStyle]::Regular) $updateBaseUrl = "http://51.195.82.92" $nexonRoot = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent ([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName) } $bgImagePath = Join-Path $nexonRoot "launcher_bg.png" $iconPath = Join-Path $nexonRoot "WarRock.ico" # --------------------------------------------------------------------------- # UI assets (icon/background/Discord icon) are hosted on the update server # rather than shipped with the exe, so distributing the launcher can just be # this one exe - first run fetches these few small files once; every launch # after that finds them already on disk and skips straight past. A plain # blocking download is fine here (unlike the multi-GB game-asset bundles, # which is why those get the whole background-runspace treatment) - there's # no window yet to freeze, and it only ever happens once per install. # --------------------------------------------------------------------------- $uiAssetFiles = @("WarRock.ico", "launcher_bg.png", "discord_icon.png") foreach ($assetName in $uiAssetFiles) { $assetPath = Join-Path $nexonRoot $assetName if (-not (Test-Path $assetPath)) { try { Invoke-WebRequest -Uri "$updateBaseUrl/files/$assetName" -OutFile $assetPath -TimeoutSec 30 } catch { # Missing UI art shouldn't block the launcher from running at all - # the Test-Path guards further down already handle absent images. } } } # --------------------------------------------------------------------------- # WarRock_Ver1.ini (display/audio/control settings, both the root and # system\ copies) is per-user save data, deliberately NOT tracked by the # update manifest anymore - the game itself updates it, and having the # manifest treat it as a static asset meant every Verify Files run reset a # player's real settings back to some baseline. But that means a brand-new # install now has to seed it exactly once so the player doesn't start with # whatever garbage happens to be on disk (or nothing at all) - fetched only # if missing, same one-time pattern as the UI assets above, never # overwriting a file that already exists. # --------------------------------------------------------------------------- $defaultIniFiles = @("WarRock_Ver1.ini", "system\WarRock_Ver1.ini") foreach ($relPath in $defaultIniFiles) { $iniDestPath = Join-Path $nexonRoot $relPath if (-not (Test-Path $iniDestPath)) { try { $iniDestDir = Split-Path $iniDestPath -Parent New-Item -ItemType Directory -Force -Path $iniDestDir | Out-Null Invoke-WebRequest -Uri "$updateBaseUrl/defaults/WarRock_Ver1.ini" -OutFile $iniDestPath -TimeoutSec 30 } catch { # The game creates its own ini with built-in defaults if it's # still missing at launch, so a failed fetch here isn't fatal. } } } # --------------------------------------------------------------------------- # Window # --------------------------------------------------------------------------- $winW = 1200 $winH = 720 $form = New-Object System.Windows.Forms.Form $form.Text = "WarRock Nostalgia" $form.ClientSize = New-Object System.Drawing.Size($winW, $winH) $form.FormBorderStyle = "None" $form.StartPosition = "CenterScreen" $form.BackColor = $colorGround $dbProp = [System.Windows.Forms.Control].GetProperty("DoubleBuffered", [System.Reflection.BindingFlags]"Instance,NonPublic") $dbProp.SetValue($form, $true, $null) if (Test-Path $iconPath) { $form.Icon = New-Object System.Drawing.Icon($iconPath) } # Draggable window (no title bar) - drag anywhere on the background. # Mouse events must be wired on every control that can sit under the cursor # (form, homePanel, settingsPanel, aboutPanel), not just the form - child # controls swallow mouse events before they ever reach the parent form. $script:dragging = $false $script:dragOffset = New-Object System.Drawing.Point(0, 0) function Register-DragHandlers { param($control) $control.Add_MouseDown({ param($s, $e) if ($e.Button -eq [System.Windows.Forms.MouseButtons]::Left) { $script:dragging = $true $script:dragOffset = [System.Windows.Forms.Cursor]::Position $script:dragFormStart = $form.Location } }) $control.Add_MouseMove({ param($s, $e) if ($script:dragging) { $cur = [System.Windows.Forms.Cursor]::Position $dx = $cur.X - $script:dragOffset.X $dy = $cur.Y - $script:dragOffset.Y $form.Location = New-Object System.Drawing.Point(($script:dragFormStart.X + $dx), ($script:dragFormStart.Y + $dy)) } }) $control.Add_MouseUp({ $script:dragging = $false }) } Register-DragHandlers $form # --------------------------------------------------------------------------- # Title bar controls (close / minimize) - top right, matches the sketch # --------------------------------------------------------------------------- $btnClose = New-Object System.Windows.Forms.Label $btnClose.Text = [char]0x2715 $btnClose.Font = New-Object System.Drawing.Font("Segoe UI", 11) $btnClose.ForeColor = $colorTextMain $btnClose.Size = New-Object System.Drawing.Size(36, 30) $btnClose.Location = New-Object System.Drawing.Point(($winW - 40), 6) $btnClose.TextAlign = "MiddleCenter" $btnClose.Cursor = [System.Windows.Forms.Cursors]::Hand $btnClose.Add_Click({ $form.Close() }) $btnClose.Add_MouseEnter({ $btnClose.ForeColor = $colorGold }) $btnClose.Add_MouseLeave({ $btnClose.ForeColor = $colorTextMain }) $form.Controls.Add($btnClose) $btnMin = New-Object System.Windows.Forms.Label $btnMin.Text = [char]0x2212 $btnMin.Font = New-Object System.Drawing.Font("Segoe UI", 11) $btnMin.ForeColor = $colorTextMain $btnMin.Size = New-Object System.Drawing.Size(36, 30) $btnMin.Location = New-Object System.Drawing.Point(($winW - 78), 6) $btnMin.TextAlign = "MiddleCenter" $btnMin.Cursor = [System.Windows.Forms.Cursors]::Hand $btnMin.Add_Click({ $form.WindowState = "Minimized" }) $btnMin.Add_MouseEnter({ $btnMin.ForeColor = $colorGold }) $btnMin.Add_MouseLeave({ $btnMin.ForeColor = $colorTextMain }) $form.Controls.Add($btnMin) # --------------------------------------------------------------------------- # Sidebar (Home / Settings / About) # --------------------------------------------------------------------------- $sidebarW = 64 $sidebar = New-Object System.Windows.Forms.Panel $sidebar.Size = New-Object System.Drawing.Size($sidebarW, $winH) $sidebar.Location = New-Object System.Drawing.Point(0, 0) $sidebar.BackColor = $colorPanel $form.Controls.Add($sidebar) $homePanel = New-Object System.Windows.Forms.Panel $homePanel.Size = New-Object System.Drawing.Size(($winW - $sidebarW), $winH) $homePanel.Location = New-Object System.Drawing.Point($sidebarW, 0) $homePanel.BackColor = $colorGround if (Test-Path $bgImagePath) { $homePanel.BackgroundImage = [System.Drawing.Image]::FromFile($bgImagePath) $homePanel.BackgroundImageLayout = "Stretch" } $form.Controls.Add($homePanel) $settingsPanel = New-Object System.Windows.Forms.Panel $settingsPanel.Size = New-Object System.Drawing.Size(($winW - $sidebarW), $winH) $settingsPanel.Location = New-Object System.Drawing.Point($sidebarW, 0) $settingsPanel.BackColor = $colorGround $settingsPanel.Visible = $false $form.Controls.Add($settingsPanel) $aboutPanel = New-Object System.Windows.Forms.Panel $aboutPanel.Size = New-Object System.Drawing.Size(($winW - $sidebarW), $winH) $aboutPanel.Location = New-Object System.Drawing.Point($sidebarW, 0) $aboutPanel.BackColor = $colorGround $aboutPanel.Visible = $false $form.Controls.Add($aboutPanel) Register-DragHandlers $homePanel Register-DragHandlers $settingsPanel Register-DragHandlers $aboutPanel $navToolTip = New-Object System.Windows.Forms.ToolTip $navToolTip.InitialDelay = 300 $navToolTip.ReshowDelay = 100 $fontNavIcon = New-Object System.Drawing.Font("Segoe UI", 15) function New-NavItem { param($glyph, $tooltip, $y) $lbl = New-Object System.Windows.Forms.Label $lbl.Text = $glyph $lbl.Font = $fontNavIcon $lbl.ForeColor = $colorTextMuted $lbl.TextAlign = "MiddleCenter" $lbl.Size = New-Object System.Drawing.Size($sidebarW, 44) $lbl.Location = New-Object System.Drawing.Point(0, $y) $lbl.Cursor = [System.Windows.Forms.Cursors]::Hand $navToolTip.SetToolTip($lbl, $tooltip) $sidebar.Controls.Add($lbl) return $lbl } $navHome = New-NavItem ([char]0x2302) "Home" 30 $navSettings = New-NavItem ([char]0x2699) "Settings" 78 $navAbout = New-NavItem ([char]0x2139) "About" 126 $navIndicator = New-Object System.Windows.Forms.Panel $navIndicator.Size = New-Object System.Drawing.Size(3, 30) $navIndicator.Location = New-Object System.Drawing.Point(0, 37) $navIndicator.BackColor = $colorGold $sidebar.Controls.Add($navIndicator) function Set-ActiveNav { param($active) foreach ($pair in @(@($navHome, $homePanel, 30), @($navSettings, $settingsPanel, 78), @($navAbout, $aboutPanel, 126))) { $lbl = $pair[0]; $panel = $pair[1]; $y = $pair[2] if ($lbl -eq $active) { $lbl.ForeColor = $colorGold $panel.Visible = $true $navIndicator.Location = New-Object System.Drawing.Point(0, ($y + 7)) } else { $lbl.ForeColor = $colorTextMuted $panel.Visible = $false } } } $navHome.Add_Click({ Set-ActiveNav $navHome }) $navSettings.Add_Click({ Set-ActiveNav $navSettings }) $navAbout.Add_Click({ Set-ActiveNav $navAbout }) # Discord - external link, opens in the default browser rather than switching tabs. # Uses the real Discord mark (discord_icon.png, rasterized from the official brand SVG), # tinted to match the sidebar's muted/gold states via a ColorMatrix recolor. function New-TintedIcon { param($sourcePath, $size, $color) $src = [System.Drawing.Image]::FromFile($sourcePath) $bmp = New-Object System.Drawing.Bitmap $size, $size $g = [System.Drawing.Graphics]::FromImage($bmp) $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic $r = $color.R / 255.0 $gc = $color.G / 255.0 $b = $color.B / 255.0 $matrixData = [float[][]]@( @(0,0,0,0,0), @(0,0,0,0,0), @(0,0,0,0,0), @(0,0,0,1,0), @($r,$gc,$b,0,1) ) $colorMatrix = New-Object System.Drawing.Imaging.ColorMatrix (,$matrixData) $attrs = New-Object System.Drawing.Imaging.ImageAttributes $attrs.SetColorMatrix($colorMatrix) $destRect = New-Object System.Drawing.Rectangle 0, 0, $size, $size $g.DrawImage($src, $destRect, 0, 0, $src.Width, $src.Height, [System.Drawing.GraphicsUnit]::Pixel, $attrs) $g.Dispose() $src.Dispose() return $bmp } $discordUrl = "https://discord.gg/9MYTF2vGx9" $discordIconPath = Join-Path $nexonRoot "discord_icon.png" $discordIconMuted = New-TintedIcon $discordIconPath 20 $colorTextMuted $discordIconGold = New-TintedIcon $discordIconPath 20 $colorGold $navDiscord = New-Object System.Windows.Forms.Label $navDiscord.Image = $discordIconMuted $navDiscord.ImageAlign = "MiddleCenter" $navDiscord.Size = New-Object System.Drawing.Size($sidebarW, 44) $navDiscord.Location = New-Object System.Drawing.Point(0, 174) $navDiscord.Cursor = [System.Windows.Forms.Cursors]::Hand $navToolTip.SetToolTip($navDiscord, "Join our Discord") $navDiscord.Add_MouseEnter({ $navDiscord.Image = $discordIconGold }) $navDiscord.Add_MouseLeave({ $navDiscord.Image = $discordIconMuted }) $navDiscord.Add_Click({ try { $psi = New-Object System.Diagnostics.ProcessStartInfo $psi.FileName = $discordUrl $psi.UseShellExecute = $true [System.Diagnostics.Process]::Start($psi) | Out-Null } catch {} }) $sidebar.Controls.Add($navDiscord) # Account avatar (initial), bottom of the icon rail $acctInitial = "K" $acctLabel = New-Object System.Windows.Forms.Label $acctLabel.Text = $acctInitial $acctLabel.Font = New-Object System.Drawing.Font("Segoe UI Semibold", 11) $acctLabel.ForeColor = $colorGround $acctLabel.BackColor = $colorGoldDim $acctLabel.TextAlign = "MiddleCenter" $acctLabel.Size = New-Object System.Drawing.Size(32, 32) $acctLabel.Location = New-Object System.Drawing.Point((($sidebarW - 32) / 2), ($winH - 56)) $navToolTip.SetToolTip($acctLabel, "Made by Kazbah") $sidebar.Controls.Add($acctLabel) # --------------------------------------------------------------------------- # Home panel: progress/status bar + Play button, overlaid on the class-icon # band of the background art (poster art: band sits ~80-86% down, ~29-68% across # the full 1402x1122 image -> the crop leaves a solid dark band from ~77% down, # our own controls live entirely inside that band). # --------------------------------------------------------------------------- $artAreaW = $winW - $sidebarW $bandY = [int](0.83 * $winH) $statusLabel = New-Object System.Windows.Forms.Label $statusLabel.Text = "Checking for updates..." $statusLabel.Font = $fontStatus $statusLabel.ForeColor = $colorTextMain $statusLabel.AutoSize = $false $statusLabel.BackColor = [System.Drawing.Color]::Transparent $statusLabel.Size = New-Object System.Drawing.Size(($artAreaW - 220), 20) $statusLabel.Location = New-Object System.Drawing.Point(30, $bandY) $homePanel.Controls.Add($statusLabel) # Custom-drawn progress bar (track + gold fill) - stock WinForms ProgressBar # can't be recolored off Windows' default green/theme color. $progressTrack = New-Object System.Windows.Forms.Panel $progressTrack.Size = New-Object System.Drawing.Size(($artAreaW - 220), 6) $progressTrack.Location = New-Object System.Drawing.Point(30, ($bandY + 26)) $progressTrack.BackColor = $colorProgTrack $homePanel.Controls.Add($progressTrack) $progressFill = New-Object System.Windows.Forms.Panel $progressFill.Size = New-Object System.Drawing.Size(0, 6) $progressFill.Location = New-Object System.Drawing.Point(0, 0) $progressFill.BackColor = $colorGold $progressTrack.Controls.Add($progressFill) $script:progressMax = 100 $script:progressValue = 0 function Set-ProgressValue { param($value) $script:progressValue = $value $pct = if ($script:progressMax -gt 0) { $value / $script:progressMax } else { 0 } $w = [int]($progressTrack.Width * [Math]::Min([Math]::Max($pct, 0), 1)) $progressFill.Size = New-Object System.Drawing.Size($w, 6) } $detailLabel = New-Object System.Windows.Forms.Label $detailLabel.Text = "" $detailLabel.Font = $fontDetail $detailLabel.ForeColor = $colorTextMuted $detailLabel.AutoSize = $false $detailLabel.BackColor = [System.Drawing.Color]::Transparent $detailLabel.Size = New-Object System.Drawing.Size(($artAreaW - 220), 18) $detailLabel.Location = New-Object System.Drawing.Point(30, ($bandY + 40)) $homePanel.Controls.Add($detailLabel) $playButton = New-Object System.Windows.Forms.Button $playButton.Text = "PLAY" $playButton.Font = $fontPlay $playButton.ForeColor = $colorGround $playButton.BackColor = $colorGold $playButton.FlatStyle = "Flat" $playButton.FlatAppearance.BorderSize = 0 $playButton.Size = New-Object System.Drawing.Size(140, 64) $playButton.Location = New-Object System.Drawing.Point(($artAreaW - 170), ($bandY - 12)) $playButton.Enabled = $false $playButton.Cursor = [System.Windows.Forms.Cursors]::Hand $homePanel.Controls.Add($playButton) $playButton.Add_MouseEnter({ if ($playButton.Enabled) { $playButton.BackColor = $colorGoldDim } }) $playButton.Add_MouseLeave({ $playButton.BackColor = $colorGold }) # Stable/Beta + language toggle strip (visual parity with the sketch; Stable/EN fixed for now) $channelLabel = New-Object System.Windows.Forms.Label $channelLabel.Text = "STABLE" $channelLabel.Font = $fontDetail $channelLabel.ForeColor = $colorGround $channelLabel.BackColor = $colorGold $channelLabel.TextAlign = "MiddleCenter" $channelLabel.Size = New-Object System.Drawing.Size(60, 20) $channelLabel.Location = New-Object System.Drawing.Point(30, ($bandY - 50)) $homePanel.Controls.Add($channelLabel) # --------------------------------------------------------------------------- # Server status - TCP-probes the login and game server ports the client # actually connects to. warrock.exe is now patched to 51.195.82.92 (the VPS), # so this matches - shown as dots + text next to the channel badge so # connection issues are visible before hitting Play. # --------------------------------------------------------------------------- $serverHost = "51.195.82.92" $loginPort = 5330 $gamePort = 10375 function Test-ServerPort { param($hostName, $port, $timeoutMs = 1500) try { $client = New-Object System.Net.Sockets.TcpClient $result = $client.BeginConnect($hostName, $port, $null, $null) $success = $result.AsyncWaitHandle.WaitOne($timeoutMs) if ($success -and $client.Connected) { $client.EndConnect($result) $client.Close() return $true } $client.Close() return $false } catch { return $false } } function New-ServerStatusRow { param($label, $x, $y) $dot = New-Object System.Windows.Forms.Label $dot.Text = [char]0x25CF $dot.Font = New-Object System.Drawing.Font("Segoe UI", 9) $dot.ForeColor = $colorTextMuted $dot.AutoSize = $true $dot.Location = New-Object System.Drawing.Point($x, $y) $homePanel.Controls.Add($dot) $txt = New-Object System.Windows.Forms.Label $txt.Text = "$label`: checking..." $txt.Font = $fontDetail $txt.ForeColor = $colorTextMuted $txt.AutoSize = $true $txt.Location = New-Object System.Drawing.Point(($x + 16), ($y + 1)) $homePanel.Controls.Add($txt) return @{ Dot = $dot; Text = $txt; Label = $label } } $loginStatusRow = New-ServerStatusRow "Login Server" 130 ($bandY - 50) $gameStatusRow = New-ServerStatusRow "Game Server" 130 ($bandY - 30) function Update-ServerStatus { param($row, $hostName, $port) $online = Test-ServerPort $hostName $port if ($online) { $row.Dot.ForeColor = [System.Drawing.Color]::FromArgb(255, 90, 200, 110) $row.Text.Text = "$($row.Label): Online" } else { $row.Dot.ForeColor = [System.Drawing.Color]::FromArgb(255, 210, 80, 70) $row.Text.Text = "$($row.Label): Offline" } [System.Windows.Forms.Application]::DoEvents() } # --------------------------------------------------------------------------- # Footer (version + links), bottom of the art area, matches poster's own footer position # --------------------------------------------------------------------------- $versionLabel = New-Object System.Windows.Forms.Label $versionLabel.Text = "v1.0.1" $versionLabel.Font = $fontFooter $versionLabel.ForeColor = $colorTextMuted $versionLabel.BackColor = [System.Drawing.Color]::Transparent $versionLabel.AutoSize = $true $versionLabel.Location = New-Object System.Drawing.Point(30, ($winH - 26)) $homePanel.Controls.Add($versionLabel) # --------------------------------------------------------------------------- # Settings panel - section-header layout (uppercase muted label + divider, # control row, italic helper text), covering both launcher-level settings # (update channel, verify files) and the game's real per-user settings. # --------------------------------------------------------------------------- $settingsTitle = New-Object System.Windows.Forms.Label $settingsTitle.Text = "SETTINGS" $settingsTitle.Font = New-Object System.Drawing.Font("Segoe UI Semibold", 16) $settingsTitle.ForeColor = $colorGold $settingsTitle.AutoSize = $true $settingsTitle.Location = New-Object System.Drawing.Point(30, 30) $settingsPanel.Controls.Add($settingsTitle) $settingsDivider = New-Object System.Windows.Forms.Panel $settingsDivider.Size = New-Object System.Drawing.Size(($winW - $sidebarW - 60), 1) $settingsDivider.Location = New-Object System.Drawing.Point(30, 68) $settingsDivider.BackColor = $colorPanelEdge $settingsPanel.Controls.Add($settingsDivider) $fontSectionLabel = New-Object System.Drawing.Font("Segoe UI Semibold", 8.5) $fontHelper = New-Object System.Drawing.Font("Segoe UI", 8, [System.Drawing.FontStyle]::Italic) function New-SectionLabel { param($text, $y) $lbl = New-Object System.Windows.Forms.Label $lbl.Text = $text.ToUpper() $lbl.Font = $fontSectionLabel $lbl.ForeColor = $colorTextMuted $lbl.AutoSize = $true $lbl.Location = New-Object System.Drawing.Point(30, $y) $settingsPanel.Controls.Add($lbl) return $lbl } function New-HelperLabel { param($text, $y) $lbl = New-Object System.Windows.Forms.Label $lbl.Text = $text $lbl.Font = $fontHelper $lbl.ForeColor = $colorTextMuted $lbl.AutoSize = $true $lbl.Location = New-Object System.Drawing.Point(30, $y) $settingsPanel.Controls.Add($lbl) return $lbl } # Game display/audio/control settings (resolution, volume, mouse) are # intentionally NOT managed here - the launcher used to read/write them to # WarRock_Ver1.ini, but that file's Width/Height fields aren't reliably # round-tripped by the game itself (observed holding garbage bit patterns # bled over from the adjacent Gamma float), and a saved resolution outside # the launcher's own hardcoded candidate list got silently dropped, so # hitting Save without reselecting it clobbered the real setting back to a # default. Simplest fix: don't touch this file at all. Players set these # in the game's own in-game options menu, which read/writes the same ini # correctly since it's the one actually driving Resolution=N internally. # --- Game Files ----------------------------------------------------------- New-SectionLabel "Game Files" 86 | Out-Null $verifyButton = New-Object System.Windows.Forms.Button $verifyButton.Text = "VERIFY FILES" $verifyButton.Font = New-Object System.Drawing.Font("Segoe UI Semibold", 9) $verifyButton.ForeColor = $colorTextMain $verifyButton.BackColor = $colorPanel $verifyButton.FlatStyle = "Flat" $verifyButton.FlatAppearance.BorderSize = 1 $verifyButton.FlatAppearance.BorderColor = $colorPanelEdge $verifyButton.Size = New-Object System.Drawing.Size(($winW - $sidebarW - 60), 36) $verifyButton.Location = New-Object System.Drawing.Point(30, 108) $verifyButton.Cursor = [System.Windows.Forms.Cursors]::Hand $settingsPanel.Controls.Add($verifyButton) New-HelperLabel "Re-checks every game file's hash against the server, ignoring the local cache." 148 | Out-Null $verifyButton.Add_Click({ Set-ActiveNav $navHome Start-UpdateCheck }) # --------------------------------------------------------------------------- # About panel # --------------------------------------------------------------------------- $aboutTitle = New-Object System.Windows.Forms.Label $aboutTitle.Text = "ABOUT" $aboutTitle.Font = New-Object System.Drawing.Font("Segoe UI Semibold", 14) $aboutTitle.ForeColor = $colorGold $aboutTitle.AutoSize = $true $aboutTitle.Location = New-Object System.Drawing.Point(30, 30) $aboutPanel.Controls.Add($aboutTitle) $aboutBody = New-Object System.Windows.Forms.Label $aboutBody.Text = "WarRock Nostalgia`r`nChecks for updates, keeps your install in sync, and starts the game." $aboutBody.Font = $fontStatus $aboutBody.ForeColor = $colorTextMain $aboutBody.AutoSize = $false $aboutBody.Size = New-Object System.Drawing.Size(500, 60) $aboutBody.Location = New-Object System.Drawing.Point(30, 90) $aboutPanel.Controls.Add($aboutBody) Set-ActiveNav $navHome # --------------------------------------------------------------------------- # Game launch # --------------------------------------------------------------------------- function Start-Game { $exePath = Join-Path $nexonRoot "system\warrock.exe" $workDir = Join-Path $nexonRoot "system" if (-not (Test-Path $exePath)) { $statusLabel.Text = "ERROR: warrock.exe not found." $detailLabel.Text = "Expected at: $exePath" [System.Windows.Forms.MessageBox]::Show("warrock.exe not found at:`n$exePath`n`nMake sure the launcher is placed directly in the 'nexon' folder.", "WarRock Nostalgia", "OK", "Error") | Out-Null return } try { $psi = New-Object System.Diagnostics.ProcessStartInfo $psi.FileName = $exePath $psi.Arguments = "startgame" $psi.WorkingDirectory = $workDir $psi.UseShellExecute = $true [System.Diagnostics.Process]::Start($psi) | Out-Null $statusLabel.Text = "Game started." } catch { $statusLabel.Text = "ERROR starting the game." $detailLabel.Text = $_.Exception.Message [System.Windows.Forms.MessageBox]::Show("Could not start the game:`n$($_.Exception.Message)", "WarRock Nostalgia", "OK", "Error") | Out-Null return } Start-Sleep -Milliseconds 800 $form.Close() } $playButton.Add_Click({ $playButton.Enabled = $false Start-Game }) # --------------------------------------------------------------------------- # Update check - the whole thing (manifest fetch, bundle download/extract, # loose-file hash/download) runs on a background runspace, never on the UI # thread. WinForms only has one real UI thread; DoEvents()-pumping a blocking # call on that thread is a stopgap that still stutters/looks hung during any # single long operation (a 1GB+ DownloadFile, a 18k-entry Expand-Archive). # Running the work on its own thread and having the UI poll a thread-safe # shared status via a Timer is the only way the window stays genuinely # responsive throughout, the same way Steam's UI never blocks on its # download engine because they're different threads/processes entirely. # --------------------------------------------------------------------------- function Format-Bytes { param($bytes) if ($bytes -ge 1GB) { return "{0:N2} GB" -f ($bytes / 1GB) } if ($bytes -ge 1MB) { return "{0:N1} MB" -f ($bytes / 1MB) } return "{0:N0} KB" -f ($bytes / 1KB) } $updateWorkScript = { param($nexonRoot, $updateBaseUrl, $status) function Format-Bytes { param($bytes) if ($bytes -ge 1GB) { return "{0:N2} GB" -f ($bytes / 1GB) } if ($bytes -ge 1MB) { return "{0:N1} MB" -f ($bytes / 1MB) } return "{0:N0} KB" -f ($bytes / 1KB) } # Manifest paths can contain spaces/parens (e.g. "POW Camp/Stage2.mp3", # "NACA 0012 (symmetrical).afl") - those need URL-encoding per path # segment, not the whole path at once, since encoding the "/" separators # too would break the URL structure itself. function ConvertTo-UrlPath { param($relativePath) $segments = $relativePath -split "/" | ForEach-Object { [Uri]::EscapeDataString($_) } return ($segments -join "/") } $status.Status = "Checking for updates..." $status.Detail = "" try { # manifest.json is ~10MB - 10s was too tight on a slow link and could # time out silently, which is likely what produced a "0/0 MB" total # (empty/partial manifest treated as zero bytes). $manifest = Invoke-RestMethod -Uri "$updateBaseUrl/manifest.json" -TimeoutSec 60 } catch { $status.Status = "Could not reach update server - you can still play." $status.Detail = $_.Exception.Message $status.ProgressMax = 1 $status.BytesDone = 1 $status.Done = $true return } # Split into bundle entries (big asset folders shipped as one zip each - # maps/texture/staticmesh/animation have 70k+ loose files between them, # and per-file HTTP overhead dominates at that count regardless of link # speed) vs. regular loose-file entries. A bundle entry is identified by # having a "folder" field; regular entries only have path/hash/size. $bundleEntries = @($manifest | Where-Object { $_.folder }) $fileEntries = @($manifest | Where-Object { -not $_.folder }) # Byte-based progress: manifest entries carry a "size" field, so the bar # and readout reflect actual data moved, not just file count. $totalBytes = ($manifest | Measure-Object -Property size -Sum).Sum if (-not $totalBytes) { $totalBytes = 0 } $status.ProgressMax = [Math]::Max($totalBytes, 1) $status.BytesDone = 0 $updatedCount = 0 $failedCount = 0 $bytesDone = 0 $webClient = New-Object System.Net.WebClient # Running-average speed against a wall-clock stopwatch for the whole # update check, sampled every ~300ms - avoids both the "frozen during one # huge file" and "jumps around between tiny files" failure modes of # measuring each file's own elapsed time. $overallStopwatch = [System.Diagnostics.Stopwatch]::StartNew() $currentSpeedMBps = 0 $lastSampleTime = 0.0 $lastSampleBytes = 0 function Update-SpeedSample { param($CurrentBytesDone) $nowSec = $overallStopwatch.Elapsed.TotalSeconds $deltaSec = $nowSec - $lastSampleTime if ($deltaSec -ge 0.3) { $deltaBytes = $CurrentBytesDone - $lastSampleBytes $script:currentSpeedMBps = ($deltaBytes / 1MB) / $deltaSec $script:lastSampleTime = $nowSec $script:lastSampleBytes = $CurrentBytesDone } } # --- Bundles first: one big sequential download per folder saturates # the link, where tens of thousands of tiny per-file requests wouldn't. --- foreach ($entry in $bundleEntries) { $folder = $entry.folder $markerPath = Join-Path $nexonRoot ".$folder.bundlehash" $fileSize = if ($entry.size) { [int64]$entry.size } else { 0 } $localHash = $null if (Test-Path $markerPath) { $localHash = (Get-Content -Path $markerPath -Raw).Trim() } if ($localHash -ne $entry.hash) { $downloadUrl = "$updateBaseUrl/files/$(ConvertTo-UrlPath $entry.path)" $tempZip = Join-Path $env:TEMP "$folder-update.zip" try { if (Test-Path $tempZip) { Remove-Item $tempZip -Force } # DownloadFileAsync() + poll the growing temp file's size for # live progress. This whole function runs on a background # runspace already (never the UI thread), so nothing here can # freeze the window - but we still use the async form so this # loop can report progress every 150ms instead of blocking # until the whole transfer finishes. $bundleDownloadClient = New-Object System.Net.WebClient $bundleDownloadClient.DownloadFileAsync([Uri]$downloadUrl, $tempZip) while ($bundleDownloadClient.IsBusy) { Start-Sleep -Milliseconds 150 $downloadedSoFar = 0 if (Test-Path $tempZip) { $downloadedSoFar = (Get-Item $tempZip).Length } $liveBytesDone = $bytesDone + [Math]::Min($downloadedSoFar, $fileSize) Update-SpeedSample -CurrentBytesDone $liveBytesDone $status.BytesDone = $liveBytesDone $status.Status = "Downloading $folder ..." $status.Detail = "$(Format-Bytes $downloadedSoFar) / $(Format-Bytes $fileSize) - $('{0:N1}' -f $currentSpeedMBps) MB/s" } $bundleDownloadClient.Dispose() if (-not (Test-Path $tempZip) -or (Get-Item $tempZip).Length -eq 0) { throw "Download did not complete (no data received)." } $status.Status = "Extracting $folder ..." $status.Detail = "" Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction SilentlyContinue $zip = [System.IO.Compression.ZipFile]::OpenRead($tempZip) try { # Create every directory the archive needs up front instead # of a Test-Path + New-Item check per file - with texture.zip # (~18.7k entries) that per-entry syscall was the actual cost # of extraction, not ExtractToFile itself. This runs on a # background runspace (never the UI thread), so there's no # freeze risk either way - this is a pure throughput fix. $destFolder = Join-Path $nexonRoot $folder $allDirs = $zip.Entries | ForEach-Object { Split-Path (Join-Path $nexonRoot $_.FullName) -Parent } | Select-Object -Unique foreach ($dir in $allDirs) { if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Force -Path $dir | Out-Null } } $entryIndex = 0 foreach ($zipEntry in $zip.Entries) { $entryIndex++ if ($zipEntry.Name -eq "") { continue } $destPath = Join-Path $nexonRoot $zipEntry.FullName [System.IO.Compression.ZipFileExtensions]::ExtractToFile($zipEntry, $destPath, $true) if ($entryIndex % 500 -eq 0) { $status.Detail = "Extracting $folder - $entryIndex / $($zip.Entries.Count) files" } } } finally { $zip.Dispose() } Set-Content -Path $markerPath -Value $entry.hash -NoNewline Remove-Item $tempZip -Force $updatedCount++ } catch { $failedCount++ if (Test-Path $tempZip) { Remove-Item $tempZip -Force -ErrorAction SilentlyContinue } } } $bytesDone += $fileSize Update-SpeedSample -CurrentBytesDone $bytesDone $status.BytesDone = $bytesDone $status.Detail = "$(Format-Bytes $bytesDone) / $(Format-Bytes $totalBytes) - $('{0:N1}' -f $currentSpeedMBps) MB/s - $updatedCount updated, $failedCount failed" } foreach ($entry in $fileEntries) { $localPath = Join-Path $nexonRoot ($entry.path -replace "/", "\") $needsUpdate = $true if (Test-Path $localPath) { $localHash = (Get-FileHash -Path $localPath -Algorithm SHA256).Hash if ($localHash -eq $entry.hash) { $needsUpdate = $false } } if ($needsUpdate) { $status.Status = "Updating: $($entry.path)" $downloadUrl = "$updateBaseUrl/files/$(ConvertTo-UrlPath $entry.path)" $localDir = Split-Path $localPath -Parent if (-not (Test-Path $localDir)) { New-Item -ItemType Directory -Force -Path $localDir | Out-Null } try { $webClient.DownloadFile($downloadUrl, $localPath) $updatedCount++ } catch { $failedCount++ } } else { $status.Status = "Verifying game files..." } $bytesDone += if ($entry.size) { [int64]$entry.size } else { 0 } Update-SpeedSample -CurrentBytesDone $bytesDone $status.BytesDone = $bytesDone $status.Detail = "$(Format-Bytes $bytesDone) / $(Format-Bytes $totalBytes) - $('{0:N1}' -f $currentSpeedMBps) MB/s - $updatedCount updated, $failedCount failed" } $webClient.Dispose() if ($failedCount -gt 0) { $status.Status = "Update check complete ($failedCount file(s) failed to download)." } else { $status.Status = "Up to date." $status.Detail = "" } $status.Done = $true } $script:updateRunspace = $null $script:updatePowerShell = $null $script:updateHandle = $null $script:updateStatus = $null function Start-UpdateCheck { $playButton.Enabled = $false $statusLabel.Text = "Checking for updates..." $detailLabel.Text = "" $script:updateStatus = [hashtable]::Synchronized(@{ Status = "Checking for updates..." Detail = "" BytesDone = 0 ProgressMax = 1 Done = $false }) $script:updateRunspace = [runspacefactory]::CreateRunspace() $script:updateRunspace.Open() $script:updatePowerShell = [powershell]::Create() $script:updatePowerShell.Runspace = $script:updateRunspace $script:updatePowerShell.AddScript($updateWorkScript).AddArgument($nexonRoot).AddArgument($updateBaseUrl).AddArgument($script:updateStatus) | Out-Null $script:updateHandle = $script:updatePowerShell.BeginInvoke() $updatePollTimer.Start() } $updatePollTimer = New-Object System.Windows.Forms.Timer $updatePollTimer.Interval = 150 $updatePollTimer.Add_Tick({ if (-not $script:updateStatus) { return } $statusLabel.Text = $script:updateStatus.Status $detailLabel.Text = $script:updateStatus.Detail $script:progressMax = $script:updateStatus.ProgressMax Set-ProgressValue $script:updateStatus.BytesDone if ($script:updateStatus.Done -and $script:updateHandle.IsCompleted) { $updatePollTimer.Stop() try { $script:updatePowerShell.EndInvoke($script:updateHandle) | Out-Null } catch { $statusLabel.Text = "Update check failed." $detailLabel.Text = $_.Exception.Message } $script:updatePowerShell.Dispose() $script:updateRunspace.Close() $script:updateRunspace.Dispose() $playButton.Enabled = $true } }) $form.Add_Shown({ $form.Activate() Update-ServerStatus $loginStatusRow $serverHost $loginPort Update-ServerStatus $gameStatusRow $serverHost $gamePort Start-UpdateCheck }) $serverStatusTimer = New-Object System.Windows.Forms.Timer $serverStatusTimer.Interval = 15000 $serverStatusTimer.Add_Tick({ Update-ServerStatus $loginStatusRow $serverHost $loginPort Update-ServerStatus $gameStatusRow $serverHost $gamePort }) $serverStatusTimer.Start() [System.Windows.Forms.Application]::Run($form) BSJB v4.0.30319l`#~!#Strings=`#USC#GUIDC#BlobW? %3Px% !7  #*4 xV V V 9 9m V V V V V VCtU V^Cv 9 E C R 9 [ V 9  s  2 [  /Je %:I^t V*bvhvvv!v`C:'O~ Vzvvv 9# :?Cdl{? T9} 9 9 oH H H 9 +9O - : O  k  k  k  k   k  ! '!9H! [!9 !9! 0 @ L Y l!u0$0(0(#0(%()0*,  150950FHLU0Mj 0Mn,Ou99@<K?Z?i<s9V{BVBVBVBVBVBVBVBVBV"BV4BVFBVNBV`BVtBVBVBs9VVVVVVV,VDX?]?f?z?D*?#)939<e ! 1 = 9H 9Y 9_ e z        -  ?0 6i Fp J N N S e JBM9p JP[ P !( *!352!35[!c!l!w!y!!!&!5!S5!d!x!"""" ""$"$%"6 "I "\!$#k!&#z3".#7"7#35# 6W#X#P\$%Pf(%35+%Po+(35/ |/(5T)P8\*35;d*35;*;+=8-? .35@p.3@.3A(/5C/Ct0E3G3GX;35H;l HD?s Kd? O? U@ "Y(@ 3Y`@ 'Y@ 'Y9A -YbA 7\A 7]A 7^A& 5_A& -_A& 7b$B3 :cBA 7eBR 7fB3XgC `iJC iiRC iiZC oibC" 3iiC+ uiqC: zi}CF 5iCX 5iCi 5iC 5iC iC3jC kC kC lC1 lCJ mCe m D nD n(D o5D oCD pPDp^DqkD5qyDPrDkrDsDsDtDt u u v !vD wD wD xD !xXEVyLwzL35|D35|Dg`|Er`~?Eh  .4<DKPZbbbbbhZryhbbb  %-5FMFMOU^UrMdgp4<z4<4<Z4<bb<bbb<<p Mp bbbbbbbbbbbbbbFMFMFMD93I35Q37Y37a37i37q37y3733537A3,BP< U3 35335?a3i3)5)35))yyyy 3 q3 !z3i iaa 4-F3!3533y9@3535357 3GNW!3]3d)@jD^qhyw~1)])))II3Q!)7)@)P)o))3i35a353a  3iyF[5icarA338>>EJO (T<[PE^ahaqafaaaa35$355x)538)~5BP5$V_i5qz335x]$)j[5$-65)G;$@$PW3d3z33135P,354<3Q'c0kw7U3=DNTh" 3n1 39u}3,@ 3&1& 72`1 71 1 '35MYO 3QYQ& -Q Y P7P5yDy iy i!J935P)3q3735DVxI31 7LV3381539ET38D^\35Ql\@Q \5L35L^I !$ )31E 39T !'a -A37A 4Q I ;Ya A -YVHi 33 3 O!W!-y38WarRock Nostalgia.exeCredential_FormModuleNameSpaceCREDUI_INFOCREDUI_FLAGSCredUI_ReturnCodesUser_PwdMainModuleRawUIInput_BoxChoice_BoxReadKey_BoxKeyboard_FormProgress_FormProgress_DataMainModuleUIMainModuleConsoleColorProxyMainAppInterfaceMainAppmscorlibSystemObjectValueTypeEnumSystem.Management.AutomationSystem.Management.Automation.HostPSHostRawUserInterfaceSystem.Windows.FormsFormPSHostUserInterfacePSHostSystem.TextStringBuilderCredUIPromptForCredentialsPSCredentialTypesPSCredentialUIOptionsPromptForPassword.ctorcbSizehwndParentpszMessageTextpszCaptionTexthbmBannervalue__INCORRECT_PASSWORDDO_NOT_PERSISTREQUEST_ADMINISTRATOREXCLUDE_CERTIFICATESREQUIRE_CERTIFICATESHOW_SAVE_CHECK_BOXALWAYS_SHOW_UIREQUIRE_SMARTCARDPASSWORD_ONLY_OKVALIDATE_USERNAMECOMPLETE_USERNAMEPERSISTSERVER_CREDENTIALEXPECT_CONFIRMATIONGENERIC_CREDENTIALSUSERNAME_TARGET_CREDENTIALSKEEP_USERNAMENO_ERRORERROR_CANCELLEDERROR_NO_SUCH_LOGON_SESSIONERROR_NOT_FOUNDERROR_INVALID_ACCOUNT_NAMEERROR_INSUFFICIENT_BUFFERERROR_INVALID_PARAMETERERROR_INVALID_FLAGSUserPasswordDomainConsoleColorGUIBackgroundColorGUIForegroundColorGUITitleget_BackgroundColorset_BackgroundColorSizeget_BufferSizeset_BufferSizeCoordinatesget_CursorPositionset_CursorPositionget_CursorSizeset_CursorSizeInvisible_FormFlushInputBufferget_ForegroundColorset_ForegroundColorBufferCellRectangleGetBufferContentsget_KeyAvailableget_MaxPhysicalWindowSizeget_MaxWindowSizeKeyInfoReadKeyOptionsReadKeyScrollBufferContentsSetBufferContentsget_WindowPositionset_WindowPositionget_WindowSizeset_WindowSizeget_WindowTitleset_WindowTitleBackgroundColorBufferSizeCursorPositionCursorSizeForegroundColorKeyAvailableMaxPhysicalWindowSizeMaxWindowSizeWindowPositionWindowSizeWindowTitleMB_GetStringDialogResultShowSystem.Collections.ObjectModelCollection`1ChoiceDescriptionToUnicodeKeysGetCharFromKeyscheckKeyDownkeyinfoKeyEventArgsKeyboard_Form_KeyDownKeyboard_Form_KeyUpProgressBarColorSystem.TimersTimertimerbarNumberbarValueinTickSystem.Collections.GenericList`1progressDataListSystem.DrawingColorDrawingColorInitializeComponentElapsedEventArgsTimeTickAddBarGetCountProgressRecordUpdateLabellbActivitylbStatusProgressBarobjProgressBarlbRemainingTimelbOperationActivityIdParentActivityIdDepthrawUIErrorForegroundColorErrorBackgroundColorWarningForegroundColorWarningBackgroundColorDebugForegroundColorDebugBackgroundColorVerboseForegroundColorVerboseBackgroundColorProgressForegroundColorProgressBackgroundColorDictionary`2PSObjectFieldDescriptionPromptPromptForChoicePSCredentialPromptForCredentialget_RawUIib_messageReadLineSystem.SecuritySecureStringgetPasswordReadLineAsSecureStringWriteWriteDebugLineWriteErrorLineWriteLinepfWriteProgressWriteVerboseLineWriteWarningLineRawUIparentuiSystem.GlobalizationCultureInfooriginalCultureInfooriginalUICultureInfoGuidmyIdget_PrivateData_consoleColorProxyget_CurrentCultureget_CurrentUICultureget_InstanceIdget_Nameget_UIVersionget_VersionEnterNestedPromptExitNestedPromptNotifyBeginApplicationNotifyEndApplicationSetShouldExitPrivateDataCurrentCultureCurrentUICultureInstanceIdNameUI_uiget_ErrorForegroundColorset_ErrorForegroundColorget_ErrorBackgroundColorset_ErrorBackgroundColorget_WarningForegroundColorset_WarningForegroundColorget_WarningBackgroundColorset_WarningBackgroundColorget_DebugForegroundColorset_DebugForegroundColorget_DebugBackgroundColorset_DebugBackgroundColorget_VerboseForegroundColorset_VerboseForegroundColorget_VerboseBackgroundColorset_VerboseBackgroundColorget_ProgressForegroundColorset_ProgressForegroundColorget_ProgressBackgroundColorset_ProgressBackgroundColorget_ShouldExitset_ShouldExitget_ExitCodeset_ExitCodeShouldExitExitCodeshouldExitexitCodeMainUnhandledExceptionEventArgsCurrentDomain_UnhandledExceptioncredinfotargetNamereserved1iErroruserNamemaxUserNamepasswordmaxPasswordpfSaveSystem.Runtime.InteropServicesMarshalAsAttributeUnmanagedTypeflagscaptionmessagetargetusercredTypesoptionsvaluerectanglesourcedestinationclipfillorigincontentsstrIdstrTitlestrPromptstrValblSecurearrChoiceintDefaultwVirtKeywScanCodelpKeyStatepwszBuffOutAttributecchBuffwFlagskeysblShiftblAltGrblIncludeKeyDownsenderecolorBarColorTitlepdpositionobjRecorddescriptionschoicesdefaultChoiceallowedCredentialTypesforegroundColorbackgroundColorsourceIdrecordappargsSystem.ReflectionAssemblyTitleAttributeAssemblyProductAttributeAssemblyCopyrightAttributeAssemblyTrademarkAttributeAssemblyDescriptionAttributeAssemblyCompanyAttributeSystem.Runtime.CompilerServicesCompilationRelaxationsAttributeRuntimeCompatibilityAttributeWarRock NostalgiaDllImportAttributecreduiStringIsNullOrEmptyMarshalSizeOfIntPtrZeroToStringStructLayoutAttributeLayoutKindFlagsAttributeEmptyCloseset_Opacityset_ShowInTaskbarControlset_Visibleget_Bottomget_Topget_Rightget_LeftAddressBufferCellTypeset_Xset_Yset_Heightset_WidthAppDomainget_CurrentDomainget_FriendlyNameuser32.dllSizeFContainerControlset_AutoScaleDimensionsAutoScaleModeset_AutoScaleModeTextBoxButtonset_TextPointset_LocationScreenFromControlget_Boundsget_Widthset_MaximumSizeset_AutoSizeControlCollectionget_ControlsAddset_UseSystemPasswordCharSetBoundsPtrToStringUniset_DialogResultMathMaxset_ClientSizeAddRangeFormBorderStyleset_FormBorderStyleFormStartPositionset_StartPositionAssemblyGetExecutingAssemblyget_LocationIconExtractAssociatedIconset_Iconset_MinimizeBoxset_MaximizeBoxIButtonControlset_AcceptButtonset_CancelButtonShowDialogget_Textget_CountRadioButtonToolTipIEnumerator`1GetEnumeratorget_Currentget_Labelset_Checkedget_Heightget_HelpMessageSetToolTipSystem.CollectionsIEnumeratorMoveNextIDisposableDisposeset_ShowAlwaysget_CheckedByteKeyEventHandleradd_KeyDownadd_KeyUpget_KeyValueset_VirtualKeyCodeget_KeyCodeget_Shiftget_Altget_Controlget_Charsset_Characterset_KeyDownControlKeyStatesset_ControlKeyStateget_ControlKeyStateget_Modifiersget_Blackget_Blueget_CyanColorTranslatorFromHtmlget_Magentaget_Redget_Whiteget_YellowSuspendLayoutScrollableControlset_AutoScrollset_BackColorset_ControlBoxResumeLayoutElapsedEventHandleradd_Elapsedset_Intervalset_AutoResetStartget_Itemset_ValueRefreshset_Leftset_TopFontget_FontFontStyleset_FontProgressBarStyleset_Styleset_ForeColorset_Sizeget_ActivityIdProgressRecordTypeget_RecordTypeRemoveSystem.ComponentModelComponentRemoveAtStopget_ParentActivityIdInsertget_Activityget_StatusDescriptionget_PercentCompleteget_SecondsRemainingTimeSpanget_TotalHoursInt32get_Minutesget_SecondsFormatConcatget_CurrentOperationApplicationDoEventsMessageBoxget_ParameterAssemblyFullNameTypeRuntimeTypeHandleGetTypeFromHandleGetTypeget_IsArrayGetElementTypeCharMakeGenericTypeEmptyTypesConstructorInfoBindingFlagsBinderParameterModifierGetConstructorInvokeConvertChangeTypeInvokeMemberArrayop_Inequalityop_Equalityget_DefaultValueExceptionToCharArrayAppendCharConsoleConsoleKeyInfoConsoleKeyget_Keyget_Lengthget_KeyCharMessageBoxButtonsMessageBoxIconSystem.ThreadingThreadget_CurrentThreadNewGuidAsPSObjectArgumentNullExceptionSTAThreadAttribute<>c__DisplayClass6ManualResetEventmreDataAddedEventArgs
b__0
b__1IAsyncResult
b__2arPSDataCollection`1ErrorRecordget_Indexget_Exceptionget_Messageget_IsCompletedEventWaitHandleSetEnableVisualStylesUnhandledExceptionEventHandleradd_UnhandledExceptionSystem.Management.Automation.RunspacesRunspaceFactoryRunspaceCreateRunspaceApartmentStateset_ApartmentStateOpenSessionStateProxyget_SessionStateProxyget_BaseDirectoryTrimEndSetVariablePowerShellCreateset_RunspacePSDataStreamsget_Streamsget_ErrorEventHandler`1add_DataAddedget_IsInputRedirectedCompleteCompareStringComparisonStartsWithStringSplitOptionsSplitTrimSystem.DiagnosticsDebuggerLaunchSystem.IOStreamGetManifestResourceStreamEncodingget_UTF8StreamReaderTextReaderReadToEndFileWriteAllTextAddScriptSystem.Text.RegularExpressionsRegexMatchGroupget_SuccessGroupCollectionget_GroupsDoubleTryParseAddParameterCaptureget_ValueToUpperBooleanAddArgumentAddCommandAsyncCallbackPSInvocationSettingsBeginInvokeWaitHandleWaitOnePSInvocationStateInfoget_InvocationStateInfoPSInvocationStateget_Stateget_ReasonCompilerGeneratedAttributeLauncher.ps1!Secure input: !Input: OK CancelPress a key#000080#808080#008000#008080#800080#800000#808000#C0C0C0#00FF00!Remaining time: ){0:00}:{1:00}:{2:00}?System.Collections.Generic.List1{0}[{1}]: AddToArray {0}: ) (Type !? for help.)!?GWrong format, please repeat input:  * PSRunspace-HostuiScriptRoot -wait-extract:If you specify the -extract option you need to add a file for extraction in this way -extract:"<filename>" -end-?-detailed-examples -full -debugLauncher.ps1function {}; Get-Help   | Out-String/^-([^: ]+)[ :]?([^:]*)$ True $TRUE False $FALSEOut-String Stream-An exception occured: 'Click OK to exit.../Unhandled exception in YW3'u\@t:Jz\V418V6N5  !! %) @@ #zW- - - 1 1 5 5   9=  AE =5=9 =9 59  (-(1(5((( II MQ  ! UAA Y]a4?_ : e- - i 4 mqu y}M MQ %)    --0  m(D8 D8 }}    (}(((( 8     !!     9 9 -- 951             I   !%) ) - I qI MQ 99Q  %15qQ  9Q! ,q   I U   M Mee-a4 e Y  ] ]a ] e i    -4q          Iy}M9        >y}9       I}}   }                 % -  )  0A= }  I MZ$H<}% !% =LTWrapNonExceptionThrowsBB B_CorExeMainmscoree.dll% @0h(@Xp`d<((D%ixzh~Lal0l4VS_VERSION_INFO?DVarFileInfo$TranslationStringFileInfo000004b0,FileDescription 0FileVersion0.0.0.0LInternalNameWarRock Nostalgia.exe(LegalCopyright TOriginalFilenameWarRock Nostalgia.exe4ProductVersion0.0.0.08Assembly Version0.0.0.0PNG  IHDR\rf pHYsod IDATxwdU.X[7M9(:3$GG1TGDA J:@ӹv9W{s64:lN:ujo}[k#M:Y:{<;͆v<;]ٷvB|o|xo7Cs kcdvGboR}!g<7n&ﱁolӴ[0^Ӳ Ì3M;lV4M0mɲmѲlض#qI!JQd,9"U1EUERTUyFQ",e$/=É74꽾ZUvM:<"7d;m7kVe7CyL]7O4㈪/TBژ/UA6xcl k!Cp0@b``* Ue{0E}/s6&a^ۭ^ ڥ^.7DD7n}CM&itv+(UPp6}?vN][,VerT&opYG.@x > % @D67Mt,AW^|Sz:݆-q~;?@mf{CȷF[l {[ q`66pУ+URzVP>:+ΙN0aQzޘ?۹@P Ϩ},X| C' =NQXinŢ-pP0%}X;D㨏^?f@9@eYx'?ɿvv=#8o|g~7N$ O_|oټ%jePPݿ|brAP>)-J=kLYnD-姯g ??H#xj6`J<0 ծx%0y->~%8k [=9昦G}Eu>dkh옿fo.Ѹ+7l@@@ @@ﱁ/~D,W9LщDF3 2q쏰5dR~Ai)H=𠈃3{~NL;[ؖhH8x%}on~fmZA@ꫯ~vdcco 6n|nf"@'Oϙۭ(*b457㏿{z泟`.a;JH[ g>+T~y&W8o:=rhdZM gBk)^-|CĚXX}{O z0pۚ56D?w 455o^ziۅa]vΝ&L<9{?/](*WO<1jS6 ̀{>>6op,.4Pgnύf>o<|==K#@@( ]P^e >AoLCL̟1FcC_~/j׏2t;t[y…b*v/w<QPH2]@@/HW׼x J(p؈vMw?ohDZAv`m em؎M;v "/ְ`PI><=  Pގb]yy2_mksAw=n3#ll  c~ut'3yCk @/@j E @QUj;*n`AonDŽ8L ͙e²Lؖ 4a[,˄c5Qd!+}zq,Cg{ٲ%}W\|ۻA`~(o5nP|d}jiiR$$D|Qx֗{x5:NuiD1~ם{qMtD ȋxll@l?Ҕ{r*u7+WaVeF7~^B"q0Ĩ)74U*eTeTETJETETET*%T%T*%Za6u:(PT5@(`(P8Jo(B(}-ȏ+Xee-ӀiL˱ DIpFcL;\Lfrw~tZhjx/4ޮoz7[q&XI'm#cE؇؇629XW>?D%e6aP0xK3m"6S]/LM&V;ꧩqw_Գ<iq0F(E8C0A(a)Z\)Q M#Frz pl,$_b6Sp?c O懢(h"ҎN4[G8C f;80 IAi(!JA(J5,K}B CWw@Lwu1+/>o;B^_+b7Xh&R AI3|![7 1PKz0 R+>s?*K<+8"҂??禋(hX0 *rџ)e5Â{թlM}phd"FN>bg6A=G$Ɉ64"mp^d'($MMrl&m j?&uϋ9(>[ڻօ45!Є ji0 ez D/] `8 ޮbowۋؿ^}kg9qz766ν{:/B*ލjp#փ<$@quz~q?LrS4`;@QUěP.W~E[LuxS37Ǧ>8<6qzٯ{{؊@ X"a!(rH%&012>L/}i1wv\imMy_]wsYEkg/:栵 M-re>0f"`?kӆ2=]9m/67n ΚwΝ{ f0+]o)mA0jwUNI$v@1P0a$X7t7q b hhj>Jg<f?i7+SM#cSF&P瓌j5rX"G X#@MtbC{1w;Fv^s'u׾NU2OE"ODI(Jdˀ|)Y k:Q@hl$`'e hV'}ƙBoW[iNw۟ZKk( o$LU-`+2l݆QqG@p}q0`Ep hȁ !oF.Mh @}Lx7O63'4<)^L9hn\Ɏ56p ZvoCIO(O+{>k@'x;6K^b@SP%ttEG\45CV<`p \ q<@fz~p NWןjժy?O˗/}$$%LMM']wܵ6P-0f9P(Թ$yCXC\ԠaZ(JD"+#:uݫDje߉V }{?}Ӯg!h}Z6!4vw:!k0tc{+O{ *7=&@| c>í^[ץ\t\Kb0phm44zrhGb5 |ZF`zrR(" AdmP)._ '!W]q5m7zɲ?__ύ0)pbn tmU?[gZj>aHNOzfaꗿr< rGs]W\ I6e xޒLLO`L_8k S'ϞNdžm7¾W4[oECSw0j>=(!AJr E Pw{Qbw)rm6^g;6it,q?gdSS|Nk8E(" Mh =hn@,քP$ka޹/SAﭙ7dߕ8ܸe@QTap cR>S *ZZkp"+PbS#Ȧ`[)"MeY oLQqB޿|+U qV>NM$?صoB(خAo@SsJWplMPg^ƀK0B(0-}hpe ½;q {mx "O>fWw|(@ӂe0 <:[H(jpP- 3]~2/Ca?g2~'=HYx?,mx0^Hdˮ vcW_@$I$oh];wᆯ0U*6#! nT= j;#;:: fD$4MiXp>zEqsC8r]?ݱ{pCX{~=n4519 GӏᅧPcu("Gskں栽kÐ$ ^xbSmbsmawX o;Ӱr퇂"<}FPA|8((J% D(Bd]sGѱMZJMRf!,siLZ)AQTC!V}ClZgڛ|#/u=ƦDbMDc }AҊxu'ϸ򚫺dE$)7vloj۷lf 0)8-X@0|ʲ)szZhhMͭsl}e{)X~ a7{hw@X+ŋaE8lb,^6serdr4$ WN]ђ2W-_ Ś/yCý9AE>Pq444!Z*cbr#ߋAX&D? qk: L=WP!ޢ ҸutCG(j`ai/XT}-S8p /}76`zzһ!RёQ<ǧӫQ' W~Qr_դ3p IDATٽ# 2$Qtkk&JDYƪ#̙ӺgΰV*8K8,NQ(?GsP@UTug"ض(7{2ϗJ ⭝]B!,ض 4i #WbՙK/^tz- Hw #N\,4کJBSɌ-w`MӀU/@A1_ \0NNw@eY(HgHLO\.#kpicܹs "tMc/` AEqi%KARaL{$]O*mr]R*!..%ضb> RaTʲlO, ^UQh˵rRA2 cxl\yn޵e%5r#ضut:|9[^\߬rP/;쏻 r[V,+C;ҊCfJ V}<1m_k^Zr7Pځ^"Q蚆 >?>r'fӨx45-t*e)0ŲL̟?: ]z1\uH0Q 4Lc !,jB3,ӓt?ߏJp@6TjhNfޱ^1dYҎ$A 3."@ D.C.7hC>8yhniE\FnfW'C:$C (pl&d^AEa@U( 27YSӠ1ï  o?&X?LСHRijO?'TX0b~9iz߲( _Aȿ@ϑG_"ZڠhPN͍`f?@޽f8`0 5B8ڀw΁"I5/`hϖ 5pDonGFzVٖ/ 'O: fLM&J&QTE./κn@VPQ,I%A!GU!+ʗ}!q8`_pCVJCbKy Ο}!|'I aϮ>H4h,x<6at,J@A@M9$IA8FKk+};aױw.&VPahUT%z(ja[! ,Sa0uVhj˖_<IiFB$@.DT xᇰoژ˹bl ʉ^@u$1=-۷7ly˿{ߖ"A;TKy 4a;6dYA4ֈP8 8ط{+V?[F(0ں栣{.Bq,V8w..r LCfg`YoF D'a(f2@?1oFͤQaۖG@PV /Ps5^4  Dt󐀇>{7qJ&P)Q)吘D2L6b%5p0 E9ᄓNAWO,D*pDH`( Iaۦ:Q`ʰV)R@DQiJV*@Q-Q.P.Q*`\q5O _b5Hg5dmczj x_bp`_|kej,Z q_:o-ٞNɖ͛#ͭm KC܃V+JEئ9a(BV{Fܴf|օhxQmK.9~^t)[1>0m@0M r 33YLML`124֬y|ݽ늠-ضL:alڰO) VTW=7O|_g`p@0S$#_{ǵ֭3M/։c8HqҩyDIB0HWևl(3%ttv⨣`?W!0%=kl:SCC vV}::06:ёQeH.%4Աd0>6={пo/&FGQh B SJ?vY|mYXd)NbNj?l:?;|H/nN;[o=n;NS+=$^^ʎ;~~c\Wk87~oJ9! ǟrb+Ҽm6{1gΝTC` ixml޸KO: /APJ C7ڂs/a/arKd9ҩ, zz;!Ae0Gy\/Gw={ Q@ HkLӦKY'  %me ےaK&DK09>^_Ha"bxhwm[E|1 {@Uq`˯8s݃͛6ˣ>tz7ömr3HR͛04-}f4?WX!]|\ y䑢 (Fm1q@m!P}WpZ WPLE#ª}Xʗ$}J.S!z4nވ$VCTARAgW7?$dR)ewrbzcqeYB(TP*0&PjP]C` Bôg0~Y K{S]V^ddZcӲ`[ߴ$< f6x/@Ux)J"_Wp{׳ql6â&q/Q!PdvX̄O -J"fhQo6^Q` &9Rԫ586V<ߺhmoǚW_͛kfB11=g嗐IPC(?_뮻[nE> )o(H%Sׯ>633, g; LL'=O30 R)$IȊ80JEw}٭bb|mOoVہe+i8ݽ-X|{Jqm xg^[F\MK)v09@ZE(BTAPmPaʲJ=?(%ֲyCjl@dTԱ-0aBaaTb\/z})!8!̻.mp_QxYo;AԠ EU]M@`kh'& &(L1-::D2ab,+mǁ$  B,Nö8Xdgqicغe3 ק.Jbjj^[70ۋ/| ?N4mE.Y\.159g~f{&v;k؟=lmB"}}eK{Z[[C,Sr<3_:91nSNW?bRdYTTb;nAR@\EoxZl ; cÃuzxeT4MՊð 2d%5.CekAA͗dH"`[&L]k7q '"\s>. u?qi! ]4C:prTt<E=i^!1Lpt(R#҅Hñ$X,@Ks3׷oB{g'^}eؾn`a&Fx!37ߌ;gq&3ؼm;FZgn̓? @^fkAe%BHܲxҊG¡08(qbű .F>į|> vz4_Ħc8;HԻ~ܻjB\z^Lbvl k-qA$ "X$f$z}8E];O%–8+z=qJvʶ/W< ca]`{Ȓj?D8~6IPd!Ȃ+ˆUt薄Cp :U`VB;8"Lˢif@UqW[!lx5s*aZ ۾C '8qW+ļy0[زk7Sw5ض1l޴IBJm*k*a7^C:S[ X`4 FGGP*Wqɧ_^|dIƞݻ`~bY)m߂LsȐ%÷qT*0E2 x^z!(CVT5`{=>ˁӟ4|8a27c=(Jϕkg;K% xޅux_ _lPO8-V@}?#" fKz$@C羀xK+FGw@ 9=mUGc+y4 ,]Q01>^%a Ki$^CU/eѫ[ `$f]=bT[n: ]UlhikCX ]Ye%S!@bu߿\@c  CG&e,pSz\Ϩ( D9aK/՟vaK/"L}(Ψ]אI JLpߋ-׾5ccMؾm24lt@JFq]w x09R؄~m@&Iu7![.HL#Nu di w0ccr|{iU  IDATm7t]m[3o.[ЪUF9me]Rf` +4\ h e|Ob C0t{G(kbso_t ?/ XyW: A`ENO\w3\FDNPvFˤW+-zvn%Kuؾm+xeHLc7ګ/b|thVЇÎ9}CXv=&'aA3M#xg e޿fxn?O=|Ŋxs3]%x94T cbcWO}/D\dQ뺆! CT@ N2wܫj%QG &'ݎ®6Y$ z2w$"3c5Vv˶` ^Q&N9tB@|^{B @B[?- @DOS4>Alb tx+4L#ˤMYۄ(8 /}t_zo*̰, a@ 6}cÃ0څf$O_o\wtG+^Ö͛d[!ưqF< ۶=" s c|IQeY 'rr4u Be.?W'q΅!6a1=1}v+X<'+?؃_в,,XGs,FP,X=?]U||E*ָờu*:'_^l,Skе J% >++{?$5}߽_L\%@n&JBh4,xBvȼiܽm:oj/6kj[{lL,] 7}_hlܸ7nDR[veYT鉱F|Ľߏ|ks a``@A2]p]w'j?6`]ԟ  *9HdM}SN=U好o굂T2a要?p&>/C(ؖR)ضf B |R|>BV<ebltmj|҃ V^Ƽn?}xgfd& CUkDcQpIf2v jV 6Ov-=_c(K%y,N6.G/!),gN˖M;ؖӤ-E\|o^ҟ191b}kY&U`$L`r| |v].ނn>w6F3 ,ۻ;l&!|O =s/WӫTD&nGT8ёxϻivs?p`tdD777_Q\י>җ6UmnI@͒F\ݕY453G4ZxDI䒒 I80ڠ}WwWuJ>xYi"2p }q 0@@a`uu/v~׽x%|+*.Q ¶TX`&Q#<'bw4i$9DϜiW%;⫷_8 m ΦımX äitWصgZ~ n-0܀-5Y7vawfiSaZ\;z5BJ̼eyh> ;yŗ/~ xqyn絾eYn*KX E3>˲{GW7 ^|E;vd5/z  xπu;E{Z@ \EXm}$DI y0 /x(`td __|/"t|vy bcQzP_{F"J"FGO?s,d@, "3l`flG^tf9\k=gðDIDMUp]"q6V߱NHM1e4ݖcr6AϏ.m @U( X<|#?(q|\n^.u|g@g~oYKX+4μgFu;wwĹ~h6YrK8wv z;vDZAHjJKȁ >4F_ ,wlnǟy=Kls, U4ϡT/vpfgxR@@ml`6-BB{sn òBӐe2 X7k0 NUO|3鷰{eYTfQ)xo8?E/}۷ؑ#/ZW4~_PX]ťK_u%[9K^ݿ .҃ӧN/O&S~AqE,]$˘YhcGđ7~ f/^@n%0&!dD` x8|ۻ㏢䧔z<ōLbdt U<u_oÚi|ͬuIg&І urH`Yic| FY-f[Cp_ ^xgN="S5MJKEZqwߏ\x?X&|(Jŷ%/e WЧu1 /''og?9x@}u .b(3o Ado m1>4 R@4:&xurg 8ֵp׫v,(ҝPՆ6>na LMi~z cdhخg'lb6P?u-4J ߈sG>oǛoff{ZS,˲?il߱K8s .\8gjƃaX\\SO|';ene{Lf4bH$3}Y[o㮻>,9yo }}px07B>m126I",rk԰qu7~ %K`[ѰøEM+m#N{ o_?5'Ww,An6c5Xwe ]޻[+83O?#[ǁVAUUdj?aũ'=b\7VVp[x7m9P5U hd>Ыλ6걦@2=mlbǸ׿7_~Qz`&HR޽wufΟs>K3_b DYAMQhG~3^™3g%?!BDX7--DiF7vw V>?pLm N?&~!(5k9 n;ذ wA M]'?/|K8}4^H>۶:t^^X@R={~wy'./W^ 3n1e VWig~xqaZK3pEz^f! ]wF^J<H%`UJ"J"f`|b??cq7!]8FF鎾g4n{w=7ųW97j[*8n,DZczF _LPsS i:B{ &dw=&IrX$IV 0ugvX Ӡ8 ] ? vLO'pl Ƕj* ]G\F>=~o~KK (K|y1jbbT<π|zf~ 7{otbY= M޽{yb{ hYËvNO{ŋ43Qً1n,DHRg|ft8ӵxMn|xrg0jM~?=xLÀVk4Z6G` eYh|. ô Z Ma8_Q{.]]^?ZnMӠ:J/ O"o߉SNS'QV"M ӿA/i<=4f_@,F,,'H'S+GQP=_?!Օ/m;v`H&Ӑb1p=FmX,X*CxË}.`|r2CC`׫ua( Ǚ'D-j 6+̢D'm,kDI#כ7 faIxBW| bR h7Їel Ak 2ۿr)\BLˀmPijckI\{Ba3-Aj|gNSgO!ǒ4s4/JCPmߙtGz=<weOb۶ bΝ !#H"IA7ib%E>G*ơ[n{x?=s'S`taeAUkصwʥ"69G8E ! ,#^v6OchڗjxU@|!^d!#tp]8d g,j7sӠ PcrNC%`}j<%L v#DQ<^{h8q iB4NQE,^%rH2M/܂18p?=:Uɯ_wB*z!a*%~ , ۶crONbbr;b$x_$F꼥dY0r9w .`xAmw܅#.g" $ź ! QL|4 K`1KFP닡)Xv\1 0|;O}sx_zO' n_z gϞ }O*,ˆeZ7 ...`yi+K0t9踥xsA!$92t/Tz??ye4%Z o^ JHyKqԑ>x$EB`ia @ȋHҘؾc1mb[^fB(H&M8sꔿe9wqSVV S @[mDZk4x*=Q/ãg'.),tz?mx/ǯsΆFkڨ)U,^UEVr`tA6 ]'ru]fy"9(&x :!i8?G?ut]00 i?n~y2ãHeF`h*N{e;?hLcZ6._ 3pT #H3P*8q~N~7Wl۱ "hz⻇QcӲk}k Iߚԃ{< ^`}nl=0}vaձ@}0FF%u:1 A:hԦ{3]C≔243Fzh57@gip ><4n!~NLf =6'`Zv뵻9t ^;ZNSC N 7?p0pr!~ #+ک ҎAмKvL[GױVZkզ_ti&TǷ}ԑ.' @SLڿLi1:yQQ;=vmj<^uj)H /Ed ~xheBni,~>~YMlAz^{h+iss9kvݱA]=d IDAT6Hnxts' =hVg~ ތ5sRfvRabtwjiu,H>_)zjQ LY?fލ{a(mmLww}i Do/˻NF4r^7Q8P'"Շ-:?Cnׅl2:?7V  xgoSO=!:x?%8y \.߶G}t] {LbGmyѣ4EY6Y?2CSga-w-]%T;7I0?w}>YOdU\0HU;xS'OCuw&ý޻ h`r7|s?@T#Gqb"|)[^w]{[?~Z.a}?019B>c='O5ڻAT+Y$Sp-*~ gM[溜q`[UV]E!JC܍!o_̚~Rk]#wzi5zPt5Q*>1>󹓓B##6u?iXz2~8PMAhcSعc;4DA>YqwB\LcPPW[ "@uŁ0uuF0Q11Q+{]5eaifWgA5 @:8dY]bǎ]t]ȿ]UKC] nj/8xEZԶ.g۷o?{vh~Q'pPUWOm56kD\sALMMAi_şV~je_.Vz򏩪˶i@m$I²f p<]PJ{L&hZ`ir ߭ɰ-_w(2=YY?ضZ.f,hQS1 L FD5۷mjh(D V@}͇rrؖ>/6^8k(tp 7b8CC ZZYmۆe$<̾eDz%I$8.Zrɉ pn0{uz}Fj'zp|v+.cyyُsfhciC{̉/.T׶@u1wqf(u4Wu@n 0n @ZEspoE; f٠E:ud+XYC5LNNbxx,E VL[oƙ3KػoO(Qخ>:{[mi蟌ӌbBQQөumi۶3٨Y˶mb1X,Z-\>7hDhҠh^ZZkjͭT*UG/ͮm0 'އo<ᡞ m`^{ &''pyȲD"E 'me^ZΐD@nT*S;B%ݰd(=Z8߶z!Tx Df۶r2baao7!xᅗ /aϞg?o2t'n0M ǁ7_im) ]k-Gx}U9F1VWWa&5b l,}{DF90Z @:VX^W1LqE @Rik|%|7{?m6M7tLhW],Zյ=\cunXp\Xy>a!I1tuB&S|ОoZt}0ZKsҏ(5BtEEPry,,L&1<mru:g݃B?w"0==Q  \s~$=\XŎ|T(w,]6MA%p˲`@>XLFtL^J%>]84Z_/8aT*b|b|o$Kei3M`YE\=˲ivZCQЉF]Vz0(D*pIؖyw;;; rlhq)‡2d j,Dr,H"U7`J}j5jpkuݠh|yާΐp@`  ij7;` 2 ۲QH&S}wj{n ϘV6nP3فolt дuZG;`[,Nnd . ְ,+2Cy0kB [8THߗC#ZLAӇ訯Iҙڽ̀n&Aiȭ|=[ ,af !67e7CWR oqq,C2C"OYJX7qC<,;TB8KrU1VIخ d2CX]-lxf/tW*%zew̉ԝ-Kpi HPV!b``gT:X<V&=8!v@]S`D%KKK>ɪftgbtHGК߇D*L: 堆>AzL]09w2_oܺ`P,D@h(-%\eEWmA8ZB0 _[֛k"KLqwbllݱ9eY8uV VY _8}+@6C,ˆq_m2 r;wN8ķo0,>^g3t[(; Ņ:.o% -W~װsӃ3vrffK4V{]ضipzb4H]n[aH-H3X\\e'DpT{/$I0|Km @UU\7oqa̶m\z~p;4,%TBl˂e``xhd`j4Xˁ,zBx,Gs<˲92Pޅ˗}:4#q:[*GBnTsT, \ǎ=յKf}kҶ8ШĮ=նc0M08odQr,sl5;5= 0 8~˖ŀ /hk[ǶQUT/\xt8 @> pmmc?Lp TQHR Xa&ܾc ނ6Ҽ+.y`9KPhB`&fffpQ?~r8>-ɶl6b2h4s(}˵"ve84LT+UәcC\|/&C <TDZa&t2 /D,FhA[~߱zfە6՚k]ug`tne8EҥxpP畊EEJ Ӈc`;_w7BJv0}L< iAΩ)l(IXXXIMuR ȭdq :O -cpXXJ6eF14,.^%o8}Y/"({IZz8z(Uaݯ/L$`X \G!Lǡ:](2E,@s^ aXrvnsssAb߾}{z px>~2Ο=:I%@kC`POm[u}W$Ic $D =]Ӳ,Jm`9nu N$~%e HPK}U^^4Aa6rǏm¹qt0]s-4v0MKKKXZZ={055_mC7tV$Iy[/O Cl,5"P)142 ˢ2L'$S)0<DZ`Yx rO4t e6i3M,}5*XkaǤ(U$IHic, Li$5 8-xDض eimL8H Iߏ3gBe1|t5hְkmܬǽ̀D'سw/dI8H&T= @mW/s1a(Se e4--es\=`5Dyi0mL@&3曱RT_zyNQ BEȒ46*x46R+MxPf\~.Nn/NT zB j8u Fi(N?0֌VS 4ɲ,iY3::ݻ@UUÎQ 4A90&]l'T{͆߭ncS(A"XTl'0 ]4 X=  sjJ8cAI:Qp#[O9eNPԚPSwk3E!:X۷y(rՐu @āŽMUvHm=m~°@@,OޫYѓ!TC7|m2@Dn%QbK%!mvySSӰLB;a: {qPTqyeze~θtI'^?>r]xy1Y,ɘRv?i`t@%ma2Ri DQU$B&&'a5I,KbJV: eT%,R44¾BUU]4Jq72@5SԦXnE7 Dl zN3|qhsf,.Gt ,i84g,L4Vj7ղ,0Tv\ 9/pkNzXXǎ;aP6dMu1f^KQ\IBEY\>[ < 8^83NW`Íp"-HҲ,r( fon[)պ z } j5akm4 @1P Kooƹ_/x^8FAm˕y`YkecT*-Y&Z6d [nJg8^h7FplTUm”46{@iu5J%@ va+ap?vRAަKuk O76Yau5L(UeK=gJs98aV[J 4x:뿽[ Z,R ^JgN[ Zk5ޥEreYХp:.xR8kͿG^{AA 2um%Wmm=:w5Pj "ʾ+Z,_X=FmnDx3H.\Z Rdppy[ X vW+Ԓ ^r|; A߂Հ h!W@U6K75coZ+pO8^vcm[oh"ɵ:u₿+Uf ha<0 +[' he%6෫QJ_%R:1q8MB)XC3,--qK-46ۧ7 +i&h76n}ɗ{~s1 ƙaY6Ueb^MkJ7' -g,* 4 eAj/mlJYX0Mk٭m  :_OK'Y_t$9q4̅<eASZb(78W9PVjEQֳUPHRjuת$c64gԵ7le6h@V\΀ JyOᖥ3eul{PWsuu0 JM_dWE ԺW.L?Ԧ8XI?yMv\||z5J=aڮ)TVկ$!ss^x!=4z\ >KCvуoUUa0(YW^ƽ;D)?=D(dze? y;[1]snm~X\Ik>$RC9^Ms" G^)Z kn׎9="a• ;~#jAcO-]Y (L^V[}o5{5 btY?W'R^(y"[^ȎoKUS]n5b0}Fe(`=`hUP3]YQIQX'n+[m4g弫~2'^s#/Ϗ.gsaY Âˀe9:1 DQ)U=tMYTy0`r{ﳿ}a;I$I"W堔(1<ϙM$73 V{>( C`cW,+_Fuޫ@ $qjFs aH*HٙyN*o\At(e0 X;1wML]s Ѕ8zT,:J1` 'JS+viDKeIJ 1>U9 !xYם7xE!:0ukHaLӄﰅD,@P2`Z&=CKbH ʴ{އ}v^my?yx^! |D wR=Ѕeq(1V^q4@܎!!~'dȶ8~S"I)GcIjiރ)٨|@:1 P Dq ,//!IR6V0" ԩpo]>G(7[՛Y,[Rl>?{ noA!a 3`g9x.8B=$Ea;6*@ Vk\-Z0 g7QFEsfniGi4II818EA ,x˵3imrW($jЂS7O)>X .Z; H!<Ȓf}XǶa;6nj Z c4QYSYXv$NX-eoig_}? Zrr)(k{}GsFO{ T ]I&ĀT^vEHkK4MQq* JclRCȧ: pH[2I$G|`0?p[x€5sZ#KvC^ ϧ.8 `fˮjں0%١OaCq-\[^9.˅rLHq $Q$}Q!QĪOks* IEOAX^Z y dYng4 }|-pu=O<0hRqaDLg0>L|sw)~VtR<_w'?f'/^A[Ce0 e PT5eD>,8`%SĿA]̱>|ߗ2=xA#A$eLūq&%//6R~Tcm<(]f((,rb<^*aS\>r~$49EHiJ-s"ƈe4}1!A̮cqq\3Aln| v:x }Ȓzf Ec_'~'N ZI|" {*4(Xe!0LSv H)>a0e;T T*83a !%-ɟ gi!"HY"@ @$H4GZp2apQDXjQ(Vp"lZ@yy*fSLb1ZCkJR_)id) P%D0{m0_3H# Mؖ1Pq*jh4[pi0G@f= X]Ya>-4 C)_{38b@ѣ# |8N94z?4h4Qe:iy?w=]^L À]Po1 T*Uq8 Lm0-xA˴h*G }.))c vsGQ=O}[Pq]? ɣ luk02̤x_}'N*jս}ݺog0 Isf#MN#<.&w =diĝJA ӄ3e)?q033 ˘aAQasD yf<+LRۺ,.Nh! )5̈́󭘽?(Z f*?P42)!%.9.艹x4 yQCWDpO#V}s$O1(lV# #ZMLMO0lP!eAՕ./!˸OL`?2{]{3tkQo,??z?hhVkhCCijjjh܎H'C־0&r"] i*BtaX!R8mj[#C|k6]iڱ ֒:Sac-P4)д G7#>¨؟x͢\_ n_`9i2Gp c8s=SH)/ a5,/-"bði^$ pM3:{gp\Lfmp3BLc۶mϟ_=N"t>x7/u IDAT7y[gH)5 Me3'߅Aj&,K  @h( j:JO7 j a`ey3~1aY:E1 \MM!'o( SM^NR:Y +˸bjU^=(L5 /)LP?K(&$snWgu67I^NE|߇aYg~ӄa}^WC/]s# 0ca5ZT~]HQb}_'Zs{73QV`\gOaظ2hKoklSb0fwٞQExa_D#sO$#|ڽs;w,N#B$cΤiKAbY8=%m3HTQ Q- E'30#c1/ MX3MޖIG<8>>7&\r髰 $bt} }|oIpE˯ӏO!n[}:伒9@ɉFA< xobi?yg{$[E0njmYfi Ŝ ӆX1lb` X$&M̢Z""aer"?_w*E;tm(B:Pd2֟v F Oݩ; O j|J3.vVF5w]M1<ֿ>V1'Q{Bo9m6[Fq8zɢUxKa6u/Ae!=Z0L\A Ys$`4IPk4`[72^,dl|c~_[d%m]-hBc֓IJZLo$ ueFC&/4 aۇ)'!9##YYhzSh+$樈osw>nzíѣjt1`rb`0=2z[HHko_pW MbzOOOǓ/.}d0/F@NvAB09ya4 K9RӃ}A8QY1~m۹ !X_,C諚U. }|e%2]М@MRlϧ ̧ul`p}% (]눤_Ӭ,zAW^sL?/d~b @ ˩ i[[k =$Q(NX a#}BP |?e{h4꼲o@J XRZNgtLZxƱE{IIo.TF'/1~HPώ+2fw<ޟ;p˭ok @@|+KKXY^0 Mkb0`/v!}M>0 :f2_ɲI-n>ٿ?lgd .+x{pFZ4d&LF,>׭R#<RV϶U /804G D)De\W F@ иa?0iXrH,o1Ŵ Hޫ)b|%r HYZ_uǠK(懾Q}Wছo8xi,/ 39 Nx X[YAEgD OBvBvq>x3v5,;0PPq]79"ܷr~ēЋ"kez? @TJ.l'9TUBCrdi,`6L̓@&u{HZi廫U~0G|T|QX1mrĩzf=5(&DQ iK\v~črYux?`hq|ejhF&BdM܊^رcu{ "E?5$iC}/u;C{κs!|~Teev7(XPP~O8  7um9"_:[4\q5[cnG"(E@esmca~dR0%1.((s/o.~߻q0 q܉(_ Qbf۶;xEJk(v!#b!˴e4j(bYƶwZ Ӷ/@QָI`eeH38 ^F,z H"#M2#h~91IQ@ 4IRV-`61'3: f\sut:8vݮJt$)ޙ#_ƋD/G#W]sN8Nm! d1JN,B1uڈ'qLX-Na&aJxO8FgZ0 AZ`PyS|Gu/ >\ԅQеp( . q B@S~mx 77ނZCbyimքbCcmuA2[bP4XȏX&+ 2R\kqu`fv'D:1Ax !SJjm33||"ҋ.}_(_eL>&Z#RT1KGNsx=U`\0hFL:At b|Ði@ tHR옛޽{a;$Q?nО[ScBm#+rŨbׯ#$]a)D P٥|+_oqkq-o=aii yP.hcmu yi y =# a o݌Img;,ǁaqsB(Z}vc_`x_XzIx{=pZǗY&K@B-B, yv ږ$Avw%@'/ݽfYƦĀz Y8qX9ɊjH&8n'O<Q\R?r"+'%;4,K4Ĵߩ1 M~ԠJu]\WW;wV $X_[&(d~ 4-$IGD56Mtur?1|;_ꢄH?<$^et׮_?k'^rz~yyeI}p$_/y;8--s@Fւ8Xf9(@s:&cn'\C2>4M5mSOc@.OOG2蓸Ec,akY%Ÿ>"Bh+;(R^f \*\|%1 ˋX_]EEKB v0yNCg)(fNǾn]7?cX9;ۮp/ԋƶ-sn?|E4zI ߺ+oB(i*~(+I){c+ZCO`cm )[50M+E )LOOcz  A!rZv{ ^ēk%A; 30 ;,(B,..z,"@~w 84XI9*eűιxI~^~_Mؐ/lSHU12z+4AvQn# `v3ha||fgQaT*LЦiZabb=CFdBVtыW(Z!U*XxVO|39=>g}N; dYulo`p$A X_[Ce "K1%7 KNs>\:>lX^8GV6 홅-YVۿRrݱQ"0Ry P q@( pȓ8~'2PڭPaڎj'WNBJ*h5[Ƕj 10X@0mh6[k#M3./ر8r0VK!! ؛@1lˋߺ-@ʍ xj(cN~8㬳g^b`sszH'"vs0 X_߃i 7pM49 DR Tq7Gf%A?| /OZDA[דg}m'K^6;g[{Zt};յ DdN؃Ϥ63 Tg GƱO Vk-:,a #9Bzf1cl8B'Hi0MmvlVZVllj=6qmdY8<~7#C$90DEaBߓ@<% C 9$F&9ڎ/-λ2-?ZY:>|˹6 0Bt;wxbbwo>E"V{emYF5?05)9|/i0LG2t61iI!\$A L.d!9:ȥy` fFc14Mtl@9Q#nvPPu]T\o۔qjSi3)4Ÿ\DI̎A }Dq95OC1@LӧY8{^^9;,z 40m\z80cs0pD2X!x!dYݵk׷֯ɿXVK/k _w?k^V).+3ʹ0%lsm!ܑM ˋ0i,]Iք`W**Ǒ$:CiV^ln,r :`PDv^z=L)&(Gx܀z8X*Snj2ô9].އ3ξ$\8z?X]/ [M "5,%l~ۭF4;;{S Ko{~o۝&Đ/T ߔ6|n˶MRLcSX_8:j:Δ/P; YG m(Vh5YX- mI!&~@<]{~t1у "$yxn6'u"B '߸%N:\g].އϿNŕ衳~(>4(< P-me #ez/mkzϝO0/yzw>tCӕՍKdRu@D""G,qaW*09`S\_RSsXN z 78]I Dd2UVuQP7`ZL95KBa2zu3(Ͽ-Ȳ9Y"IS$Io0@2s! A4)&мwAY=(J)44p:<{e8KP5$ÆA#'0<"ϨW7/݂L—ٽc}:_RFP 9Dch sf&\UuePX?2/JYʰVPe_:B|EJSqT*.*u]T*ZJ5H;H(ӧ)\RjY,M! B˜ECVN]>,P^G]pKwqι8܋Q7g>=l-KW|"+`lS0P xff_3l˅^~]`VLAx@9n@֖eZp*Xcxaep~X SEUb-+_1;4D @F %,4Mr힦 {/O5߉j {o,O /bp湯™_Ͼ" "Q±CxGcu(y /L`1Y!DY{ %NXx/?_غ&M3Cyٰ+ mvX(Keq,/‘'y C1wBLۅ[q\X͘сp(r) iJh^DiC; -MB2)_/7$WB /\<.SK+H"b(/ TJ>sǽ|@zE AN7z1)Y k$8֙4,2Vaqm}!RR.Je :\\P BsR%I-/‡bVjgbB!pz(YdR9j%m۾g{1u>fw7p4| 0M՗nRŒ"lq`fzz}jjO}ph Ճ[WiрQ\y"Ky0-A@ŭ⤼@֖籲p"M!UZMӂ]q*<yE)-Q~B{dn^q6~}iAgkyl\u~%{y}٨[QgHˋGqbmek|tc>"l}aݻ~w+|?v߈_ moaHP`0_@. aт4Ui-˶Q5P7`C)7!h:Vp ( ~ar\؎{ہiZ9)t8Y-łCα .JZF qTZȒi"Oy:Ot#N;">\{퐟#^lh xTr! _1 %y03;4=9/~SGp~>c0lۻ) / (+R;dGj:Kf0\["V汲pP/P:%ղ+mY[<…0`ʇP"~@Wg$O4E%<*Eǐkyv9s{]yNAOaa)S4{yփΙHf#ٶڷyG>y%/[7 p0`9r6dYr`m`,ea4!ݭ l-a}u +yQMK]q *İM0c e7Ȓe(PSiᩈP9fA{bv=w115+4+ɜsޠ˜GbkcUsM sj Pa{ mر?O`GrZz;GnݾSh~ bԢJ|^gU*6ZC,OFqel.cuy/zOC u0Zwj2LlGѦCՎf[ؾ4ٝ[)aacmG2G)@9WA:B!0 l6?19ẏS;o1nK/U!&~V,9Hr-3PYLU*.6&*˓k2wƣ8 ZGwk[kX"Cl/ʟ.4睄2N_B@1=3m19=YU>e3P #\_A:ED[ Sӓ[SS_mvx)PwC;~5~p&ᩡwbqBYsTuQ7huk0 "3t7a<%6eQ'+;o&''''n=w}:%~Fz0o`ON g &ҦVeH?xu"]TUDšQBed&;ȴ`so/?rX&;Ԋ[}cfxLI#N"$Q8XikTydD+a\7^`Ƒ0uP H @K939o'T{]_$x< \N뵌Q' GJ+/l"LP:n.LO|jŗpC?[;E)pw7r=/2r$0^EAΩQ>NT;ߴz\;+;gR-3u(t%4__=y6Wq>Zu N ֻ8Nq0Lt"xc-|TU !DܖG0A3Oa<[u8ÕJ_/!:%^&tۻ?pC$WqrQ$g&i#IvNQ1LKZ4B)IJ|Zbt@V.%/hR r,k֢8O;my+v+N 9~`&諒,9/4ݙe,&4mRJSRVE!1asu47hjfdM웦idղy4YG><St~}IENDB`( rke^SK&tjdh\U_RKh[SgYPdXNdUMaTLbSK`THaTIaQI`QH^PG]PF]OH^QG^QI`TJUKEWMGiaZWMG;XOKmf`sle^e[TcTHeWLdTK`PEdTIgWKdTHeVLdRHcTLcUJbTJaQG^RH]QF]NE\MDYLAXK@WJ@TF?SE;SE=QC9L?5M@7OF=MA9LC>b[U[TQtic$ld]`TKbSH_OBeTGeTKeVKgWKfXLdWMcVKcUK`RH`RG]OD[LDYLAVI@TF?SG>PF=OF6J=7G;2D:1C92=0)=3-C73JB=]WTKod^mc]cVL]OB_NCdUIfUKfWNfWNgXLeUKcSK`RH^PEZKDUIATE>QF=K@9J?7F=6D;2C:1B61A80A5/C70@82B81D:1D93D:2C:1B72A80@62?70@6/@6.=2-:/'4+%/&6-&JE@FB?Cmc[bfXQ^PF\MBaQGeVLgXLgXLhWMcVLaSI_QFXLCRH?NA9I?7G;5F;3I>6NC;SE>XLB^PGcUJdVKdVKaSJ]QGWKCQE;H<6?5/8/)5-'7-'5-'6.(;2)<3,;3+;0+:2*7.)8/)4*$-%!&' 4,)KFBrg``SIZKC]OCdTJeVLeVLhWMeVLaSJ]OEUG?MB9J?7K@8VKBeWLucWvhxz}¤tzi]eWJOD;91+-& -&"0'#4,&70(5-&3+&1)#0(#+$& %/(!QHDjc_pf_]OFXI?^OBeTJdUKfWKgXLcUK^PFTH>LB8K@7ZK@l\Rvgw|srdo]PUH?E:34,%$   !2*#F93YL@r^T}mŧɫ{vdYOD<2,%$(#/& 2+%1'".&"/' /'"+"&-$ OICmf`vlg]OFWF<]NDdTHdULfUKfWKbRHXJ@NC;LA9\MDwfYp|xm`XJ@4*% 1'![MB|kѱ|mYJA.("%.&/'"-% +% /'",& (/(!XPLvmeK_RKTF;\LBbSGcTJcVJgWK`SHUH>NA:UG>m]R|lwzlbRH.(     )gYKִŨwiH<2("-&!.&-%0& /%)6.'^UOh\UVE`PFbUIeVJdUK`QIUH>O@;[MD|l\t}laRH$  $'( )"&$#!  gVLڹ_PE"&,&!+$ +%/)!0( .$G=7le_<tjbg\MFSE8^OEaRHbUIeUJ`SIXH@PC;\NEo_q~i[7-( ')"&!       0*$~nںǫn[P "*#+".&!3)%.%4+#]SNmaZRC:ZH?`QGbSIdUKdTKZMAQD;YKD}k]}lo^P" "(!(   $",'&20-732:85<:6=85;96:7474130--*'$!     k_ڹͬfVM '+$-'2*%2)$/%JB;lc\(wo+\ODSB8]NC_RHdSIdTJ`OETH>WH@qaSyimZO )"&  '# 951LHFUQL_[Wb][a\X\XUZVQWSPVROVROTRMTPMUSNVQNURPWTOXUR[YU^YVWTOLIFA<:)&$ k^߿PA: )"-"0'!8/(4' 7,%ia\vkduUH?VG=_PFcQHbUIcTJ[LBUI?eTKpbvdV" $*"!  :72SOKb\Xfb^a]YXUPTNLUQMTPM]YUhb`qkhvro{ws~yv|w|wyvzxsxsnqlihda[WTQMJOMHMJHTOLZWT^[UTQOC??&$"     pŬx( "-$.'!6.(8-$5+"VMDti`PA6WI?^QGbSGdUIaRH[JBXKAt`Vm^>2- & *" ;75ZWPhd^fa]\USSPKTPLc_Ztnkyv}zv}zujgdYUQIGC::60-+&$$!)&%20.?=;OMI`\Xxuq~~spk_\YNIGLGDROL]ZW\XUFE@#!   0(#ĥ޼dTK +$/%!6-&;0)2(!NC<j_TN@5[NDbRGcRIcUIaRFZLB_QI}hZbQH $*"  '&!QLHjd`hea]WQSMKZVRqkgzv|yv`\XB?=%#"LJGtpnpjhSPMGDBROL`\YWTP955 taTǮ})#.&"6-'<2*4( F<7sid eXMPA7^NDaRHcTGeTI`QFXLBfUJvdW7-&+$  -,(]WQmgbe`ZTQKXRNokg{xrmlIEC [YUmjgKHEJGDZWS_ZVB>< !ȩٸG:3"2&!5+%=5.9,&C:1nd]4bVLSD:]PF`QHcTHcTIbTH]NEkZOhXL  )!& *&$\WSnhca]XROKb\X{wr{xsJGEdb^~zUROFCAYUQ`[WA@>   }mʯr`U2+$7+&?6,;/)@7.jaZ>bUKSD;^QFbRFdUHdUJcTJ[KBl\OQD:+#UOKmjdb]XUNKd`]}vlgd+''A??XUREB@XUR^[X763 ]MDɰr 2*#90)@6-=3+@4.k`Y>bVLVF:bQHbRGeTHeVJhVKYMCiXN=2)& '  ?<:nhbga^URLc]Y{whe`11/SNKGDAa\YWTP"$ +"ª  5-'<1*B90?4,A6/mb]3gYPUE;aRGbSGfVIhXLiXKXKAdTI,# -%_ZToic[VRYVR~xsnjg 664zGB@OLIb_\A>: & б 7-&<2+E:1>1+C8/sh`!k]TSD:aRGcUHeUIiYMkZMXJ@_PD,$ 63/nidg`ZVQMpjf~zu0/+USRd_]C@>_ZXURO %ʬ :2*>4.D92<1)I;5ug^RC8aPGcSHgVJjZNm\QVJ>[MB)#  OHFrke]XS[VS}xWUOFC?UPKa\Y++' #%̪ >2*@5.G<49/&OB<ylclSE;^PDdSHeUJiYOsbRTH>WI@ (# \WSlhbXSNkfb~yt'"!OJHYVRIFDe_]::6 "& ¤  A6.D90I=59,$VKCrk[MC[LBdTIdWJhXNtcUVH>RF;(!f^Zhd^YROytoea^qniCAbTIeUJiWMweW]MCNA8''jc_e_[\WQzvMIE |DB=_ZWLJE #(" ᾨv-& F:4H;3C91<1)od\-qe[WG=bTIgWLfWJxdWfXLG:2.&!& kfbd`Zb[Xzu21,geaEC@_ZUPMH %&$ɮvfY:1)H<4K>4@3,MA9}ofPWH>`RFeUJgWMraTtcWE919.' )ld`e`Zb]Yrni OMKKGE^\WOJG %#UF=ǮH<4G<2J=5J>6;/'\QIaQI\L@fVKhVKn[Pl^F;2@5/ (" ic_fa]^YUhc^"=;:|wNJHc_ZKGD ) ufݼMA8I?5H<4>2*laYLsd[WH>eUIiWLiXNm`WIA@5- ' c]Wib_^WS_ZVMJE97240/     LKHWTQSOLd`\D@; ,# 4*$NA7L@7C7-J?7~pg(\MAaRGhXMhWMyhYp`R:/(#"WRNngb]YS\WTYUQXTRZVSOLIA@<520%$"/-+GEAVSPSNKROJSNLWSNf`^952+$jZMJ>5MA7L>6<0(cVNfYO\K@eWLhYNo\Rqb@4.4+##FA=pke]XS\WSZUQWTOTOMTOJTROWSPRPMKIF?=:1/-!)'$><:PMIZWQXTRTQNQNKSNKQMJTPMWSPh`^1.)!(!fWL&QF;M?7F:2B5-wnf ykcaWH=dUJiWMhWKrcZKA5,&  *! -)'nie_XT\WR[VRWRNRNLPNKOMJPMJNMJRPMUPMUROPMJEDA:73-*( %%!531JFEURPYURTQNROLOMJPMJPMJOMJQMJPNKPNKZURb]Y% *"}?5+QC;N@8<2)XMEp_SjYMvcUvdWsdpb5-& +##oickb^b]W`[W]WSZTQVROUQMTQNUQNSQNSQNTQNVSNWTQZWRXURSPLNHG>=90.,  " >:9RNKXTQ\YV\XSWTPVSPVQNVQNVQNVQNVQNVQNUQNWSOVSQYUPf`\^[W! 5+& ͳlZN ZL?YKAUG=J=3~u2_SLzTH=XKB[MD^PFrbU?6.%$ snizwzuzuxwrvsovtpvrqwsousousousousowrqvrpvrnwuqxvtzxtzwtokgYWTDDA.+*  641ZXUvtp~zvzxtxtrusousouqouqouqouqouqouqouqouqouqouqotrnwspyvrJGD !$r`Tt .&"D90@6/7,&MB;  35/(f          %5.+9   #                                  BAA=<<###  998=;<'%%VST=<?> ,+-FDDj4.(| ;:9 312AA?þDDC777rqp  ./.TRQ HIF[XXEED*+*("   HGDlli  ]\[onl¿CBA+,+¿yxvw.)$ UTT |{x¿ ¿CBA+,+½zyw   a`^¿¿ ¿CBA+,+½zyw  tsr¿¿  434¿¿¿CBA+,+½zyw#R=5.=  ¿665 NML¿)))¿CBA+,+½zyw($! ¿PNM cc`¿>;<¿CBA-,+zyw   /.-¿ige }}{¿SSP¿CBA-,+zyw FCB iff¿CBA-,+zywNUSR¿121¿ ¿CBA-,+zywn>60U  `_\¿¿JGG¿CBA-,+zyw-(% qoo¿545 _]\¿¾CCB0/.¿zzw )$!  ¾¿¿POM rpo¿%$$¿BAA))(¾yvu a`]  ~PMJ¾431 =<:410rqn'''}|wFDAsrnyxsmljDC@ 876:;9kje$1544zwu?>>-,,trmtsm>==OML z43020.RQNOA@<|<;7}wa`\_]Z  {vs01.875~z<98 bEBA}ca^%$"BA>~zYWT }{wnlg  usn-,++*(uqm|xC@?  l JID}{vz{{{{{zLKHzz{{z|322JKG}{vz{{yMLH `_Y}}w{{{{{{z}{u nng|z{{{{{{{{{{{z}*)& }z{{{{{|{yutntrldd_872 p WVRzxt{}w}w}w}w}w}w|vsqk;:7wvp~x}w}w|vDA?  RQL}v{}w}w}w~x883 ROKx}zt~x}w}w}w}w}w}w| mke}y}w}w}w}w}w}w}w}w}w}w}w}w}wy864 mke|v}w}w}w}w~xzwqqphnjespjvrn<;7rTRNvrlrojpmgpmgpmgpmgpmgpmgolf}tXVS  ((&_]VqnhpmgpmgolfxJHC HHC{xqroipmgpmgpmgroh}x(%$ BB=pmipmfpmgpmgpmgpmgpmgpmgpmgurk{xs _]WvsmroipmgpmgpmgpmgpmgpmgpmgpmgpmgpmgpmgpmgpmgpmftqmvrlA@=)'$+))FD@^]W~{u|uolhpmgpmgpmgpmgpmgnke}ztmie'%#q&%%{yumjg,,)[WT,,*ROL>>9 |UROqIFF&''jhg$$#764da_rpm nmlrYYV||x *,*EDB  ^\X##"&$% pghfcb`/.- ZYW766310  lzytMLL 45320/b  >?> $$$ ]]Z42201/ O 443uus ;;: LLJUUU("1#! ../..-cb` VVS JJG 332###+'$ IHG""#BDCuvv onn ¿MML QPPcba2,)_`^'&'XYX non NON UVU F=6U lnmGIH UVU MPN @??~ :;< 897 !!ONQ  667n  344$$$!! PQQ IKKN$"! '++ 899 ORR MNN/,' -//aeenrr  QTT !!NQQ577knn G>8= FHHOQQSTT oqqJKK ,..MOO`cc@@@ /11~ x|}GJJ477+% R*$! oss266 \ab!! 89993. .00   ;<WH?NB:/uqooaĨL?6 *("2,(('&@>8JFCKIDIGBEB>FB=GE>HFAJGBKHCMJENKEOLFSOHUQJWSLYUN]XQ[ULlf^b^WJ>4`ODYNFǼ~{xt{q~qwngWQN^XS`ZUb[Wc^Yhb\kd_oibsmgvpjxrjzsl{rxsm!EA:a\R]VOYTMVRKTPIRNHOKFMJELIDJGBIGAFF@GC?FC=GFBLHDIHCE@?32-"   VG>hYM\MBvdVyfYubUq^Sl\ug݊tfocp`TgXMzkKFAwpftnc996CA=B?ROIOLFPKDRNGTPIVRKSPIe_Vwrj( NB:XI@B7/~{x~u~ryoxn|rj}ujpgaQKHWQMYSQ[WS_ZUa[Xd`Yhd^lhbqkerletngztgbY¾}uD@8ZUNVQJSOHQMFNJDRNGPMI>;6?<7GE?DD>DA:A@<5862JG@fa\da\TQLMJFPLDRNGUQJROH]XQuqh2+#hWOgWL-#}zyt{qxn~ujumpi`QMJWSO[UQ]XS`YTe_Zga[ie_pictnfupiwqhwQMI )# ·rlbDA:YSLSOHQMFPMEFD@[XQ{vq^[T75/45.B>:EB:@>:?=:==910-wnc}wnNLE)'$+"OB;WH?kZOLA9|p`S|i]=2)}Ǿ}d]T12/@>9A=;A?;?=9740:72VRNtpige`<;9652ID?MJDPLESOHOLEVPI{wo$i[NxfZtcX-#~~{xs|syovlynsjbRLIYTN\VR^ZTa[Ve_[hb\lf`pjeuohvnhwriC=81*%3)$f`X=93UQJRMFPMFLJC52..-)iebtpiA>7,)$762C?;A@;?=;>=911.ula| MD8gVM WI?~}d^T220@>::6420,A>:kgazvpXXR'$#=95MKDMJDMJDQMEHD>_[Qz('%!k\Ppcte}j^?2*md^ù~~{xu{r{oumxmrlcSMJZSP]XT_YUb\WgaZic]mg`qldvniwpi|tn~u0*($<3*;2*6-( }63,KG@QMGMIEQNGED>OMLRQK,)%.-)<:8??;21/ula}/%a  -KWUQ~a[Q%&$63/SRMywpsnk//. >>6QMHLIDJGBMJDIF@HD>tpesoi'k[Prd~n|opaQE9I@;~~{xu}tzpumxmtkcTOL[UQ_WS`ZUa]Vf`\ic\mgaskfuphxqh~yqwp /(!B61E91?6/7.'JG>:61OKFKHDLIDROIFD>!!rnh;:6&&"('%vmb~}x`: $Ou{f`W][V~|w]ZY EC=TPHHGBGD?HE@KHC@=7URL}vEDA<0*o`Toc|nuoreZMA>61ɼ~{xu}tzpumzmtkcTML[UQ^WS`ZUc]Xf`[je^nfarmewojwpi~wid\8/)F=4L?5G<4>3,7.(;98Ļ|t/+'FC>KHBFC>IGAPOHMKE_][DB?bYNtzCB?c/Bw&&'KIDPNHGC>CB;EC>HE@DAraVrc{krvrsdgVK2(!{xu}rzpumymtkcTOL[UQ^WS`ZUc]Xh`[jd^nharlevqjwri}PJD?4-L?7OB:M?7E:2>4-4,%)#EB<41/IFAGE>CCA>:C@;DC:6OLEurmGEB2'!bUIwcXqbzknstptem]R.#}|xu{r{qumzotkcTOL[UQ^WS`ZWc]Xg`[jd^nhbtlgxqiyrky=93%C92M@9OD:OA9I?7C8/=2+4,&.&! >;;{vo(%!@?8EE?DADA;@?;A=9CA=JHCJID.-+!%&z? 'V000¿|ys[TM{rg341?=9@=:@>:A@;6BA=A>:@>:><:@@;=<8~rwpd VXXijgj4FzIJFPKEb\S11/@>9@=:A?;><8762gd\onh :1+LB8TF>WJA`PFjYNo_UyfXm^rduhyjxirdteW>2*`WOy}yv~u{qxn~tlynsjcSMJYSO]WT_[Ub[Wga\hc\ogarmevni|tia[!91)K>6OC9PD9I?6G:2@5.:0*4-&0(#+$'! =95,-'D@=900-zqfe^U! Z)2\yww \WQ|d]T12/@>:A=;640FD@rpj964C91L@7MB:B5-A6.:.)F81XKBbTHm]QvcW}k^pbscnbucVG:3H@3.L=7LA8K@7F;1>2+9/)1)$("   /..kgb"!;95A><>=911.ulald] KMNj@?Ox|z???NKFû}d]T230=:6542d`[olg+% B91LA8K>6/#KB5ztn~ypxnc[T("3*#K@9[NCcVJgUK^PGF;3&{yv}t{qxn~vl{sj}ujphbPLHXROZVQ]WS^ZTe^Yfb\mgapjdvqi{v73-7-(;2+;2,4,&'  `\V~xq2/* "#& ///fb^,,)wnc}»nicAAB9' LMNYVUV~IHD~ZULSRMomj J=4MB8?3-~x÷{qng_60*'=2)J>5MA892* uu|tzpwo{vkzri|tiog_OKGWQNYTP\VR`[Ua]Xha[ic]oicxrk}wo)$"*%)!  0,'jd^}yo|r)$ )!-$ )(&cZP~Ȼa_[ -,,8&CpKLI~s$%& E911'#M?6%,%tRLF.'#yq}u~t{qyo~vl{sjwohzshng^NJGTPKXTOZUQ\XTa\We`Zkd^oibzrmwoh $MIB{vn|yum|r_ZT +"& -'!-% +#200xjxjid|U'&(&8 1Nq{{xz1*#p`TB80 ?5/>4) #xnUMH5.(TPJzp~rzpyn~skxriwneysgkd]LGETOLWQNYTP^WSb[Vd_Yhc]lha}wo[UQ *&!NIFqlf}}zrtph{`ZU(  $7,&B80kYNfXMOD; z{o~Y<4[𷹳ea] ND;XH?NC8r_TӵqD80;0& pmjþ~wqk`xu{qzo}vm{sjxqhvngxpfkc\KFDSNKWPMXSO[VR_ZUc^Xgb\mh`sogga[wpjw}wzslsnf}vnGD? % 1(!6+%^ODrd}j\rbUgWMYMC2&"ACBȶ|tij@  G ͽʺ zi\r^SjZOjZO\MC[LBմI=5E93F90 @<8xxuyozpzpwn|vm{rivqhtmdxpfkc\KFDQNKUPMXSN[UR_ZTc^Yf_[ib^hc[mf_nibokd~yqgb]$ $-$E:1|j\wil]}j]xfXsbUfTIq`U:1*}653Y*5j,,,¼njdZ|ls^Or^Tp`SeUIQD;ygYյ?5/QE97*" @9:|ɽǿ{{ukxogslang^id[haXjcZ]WP>;9F@?IDALIENKEUOLXUP`[Tqlf~x}[WT  ! '5-$lZN|mob{h[}j]}j[yf[gSFue7/([Ev@CDx___EMÿnF$õr[NjVIo_SiZMZKAUF>pܺ}l *#F;3J;43)   #@;9uoikhdtplxsp}yuz~ypkeRMK&#!  " ,#_RE{kxi|i\}h[}j]|i\t`SaL=FFG 9]¼b+ -gÿvslX5 gnbeOBkYLl[PeSHSD=^QE۸uf %=3+D81=2)+    % 0+);52D?9HC=LFBGA>A<:C>9?:683/0-)$! #  *"^QDzm{nk^|i\~k^~k^zgZkVHkWL,LxEFKþ=>)++ÿoG&kUIbQDiZMiYLaQFPC>~{X5 o_TSA5XF;`QFbSI^OEUG>QC9bSHxiͬveX6-&4)#`SHqdx{yj|i[wdX|i[o`pal`xdVlWGsaTֹ+Lv9:;VUUSQ½" nF&naWVD8P@4[I@aRHcTI]NDVI?SD;_RGn_zŨugjZO@5/   ;0*^OEvdX~mzstgxeYscTxeYm^ocpak^uaRqYKyh[ź :_g, *[X5 byogYK?K:/WE9_NCcUJdVK`QFYKAVG?WI?dTIveX~nz¥ypxjugteuf}mrw|t}ln`vcWo^Rq`TygZk^qcqbn`{fWs[Mu`Qwk*Jw768p9 /W+.-pF&k^U[J=T@5\K@_ODgUJiWNfVKbRH]PDZKAXK?WI?[MDdTIk\PsaVygZn_pcrdrepbo`|j[wcYraTm\OjYNhXLl[Nq^TudX}j\n`ocqbm^|fXwaRs^N~l`ФC :_[_^i?1:[5 "ug]k[O[H:_M@eSFeSGjYMl]Pk\PkYOj[MiXLfUKeVHdUJdTHcUIbTKfVJiWNjZMk[Qq_RtbXwfY|i\n_nbpanbl]~iZzeXs\L|i[rfѱI+LzEBD[8KGHGdcJ(^yj^veXucVdNAjVIn]OoYLo]Qs_Qs`StbUxdWyhY{gZ|h[}i\}j]~k\~i[j[~iZ|gYjZ}gVu]M{fXrepc|ଦ <^dvgjj 5;-B0 v&ʎuoblamaoan`m`m_m^o`n`ocqbqdqcrdqeu׮;)>9,"#!C# #,u0uh1ma1l_1sf1zo0~-&  ?????@?`0 ??(0` %og_'i\TMi\Uh\QaTL\OEZLCWJ@YOHXOGYQJb[SM9of^0k^VbSH\MC^OD`PFcSHgVKjYQhYN_RIUG6_YR}gb_*(' -+*_][UQM jZPre4)"i_VKZLAdTEk]+$NHC}e`] `\YEB?70*r 6,#laZD^PFfUHl]toi{v {wsroi$ p>1)tgafYObRDma#|WRM JHD%!pF:2wkc2\LAsd${vq<87|wr#<3-|h\ \OEbQGn`I=4 nhbic_GBA11/.+)ZWRhd_"n\RXJ>9/%ujb:ymvbUvdV qje~zsc^[gd`qnjqmh_[Y?=:LGEhfavqmrnjc`\mhguqk%vg>1*WJ?      Q%!  ,-,~|#"#*+)}}  ]Z[}}~~411~~)()#91,  HEE334]\[.-,trq987%$% +($ ^\ZgddVTSggd321   ¿jgg321¿¿þ! !¿mji¿434! !A  ¼hee332¿"!!Y6/+  ``]432441mkhQPN'&$ t }xunvsnz zwqxup00-??=nkeyvo B?@@lrsDII[`b.&"50+a``wwwwwwJIIijjyyyyyyqrr(''vvvvvvyzzYXWuuussssssstttrrqrruvvkiiUUU777!     ]tsqgVK /-+@>9@>8IC?KHBQNFa]T5+%tzp{rjslcMIERNK[VRgb\}yq+'%haYVSJMIBKHBCA;6C7/m\PhXMrSB:*,*XUP=;6FDBRNHUTOTPKYSLjg_FA=J:1|u\VRd^Zpjcyq 3/+TPFRMHZWR^ZUJGC975c]Uqmd?>87/*hTF.'!!y@=;DE@31.A?;FE>ZYS11._OCq`ujbx}s}vlUOK]YThb\{unyrm+# -*)|vROG963?=:LJFOOK]XQ˽6YZXŷjd\ +)'<85SQJPQM,)%iWKxhe\Sw~tvlUPN_XSic]{tgc[,!aQF*ljdkgb970/-)DB@ȼ131 XQH873LHCWVP00,&\I>r{pRF=y}swmVPL_YTic]xYRM;/(\MCOC9''#tsmRPJ531970&%! ihd^)++c`\886AB?# >1'i^T_VO*SC7m_H<3{{q}ukSNK\VSia\zD=7;-%/& =73(&  RSPGFDUPIǹvA?@~~~usp/.-0'sj¸TLF6.%xo~~wlzqgPLHYTOfb[{t  <61je[ 620urndfd/ +'%K8.~lA81'{qɾȿy}vvnzqhMIFXSOg`[zuoqled^X *#wifQC.& eeaLxsmwnxbSm]yj F=6ujdy~vnVQNb]XtokysmXRM#  lZP~n}eTx+?>=]^[z||ʿ %l]S[G:sbrcC;4   *"weXmkZq^Qjwc}|yzG`RGVD8|dSpbueE93 3+%tbTwhwgo]zeV6455BED*0uleaSH_K>xcSiXoawg|m|l{kvgudvfn\iZzuKMKpl;xjw{nyi]ygZ{h[nbuf}՛P=MLL ?@( @ lb[Pj]Sk]Rm]Rn^Sk[P_PFPF>E=8F>: ??;97,'eTI laZ'gWKzfWysKFBCA>xtpl[O'wldgZN~i[uni lhgdSH5+$~rFp`z\YT FDAzu>3+]M@l^UPD=B92JE@RNMCA?SSNONK0/-A>;WTRIHFFDBIDB>4,&T utqþlih%$#¾ $#".1*'- ¿ !#"" }/*&e  IFF¿#"" %"![[WGGD/0-ff`z~y~#""864IGC53/NJF }yb_\{xq}x|v974a_[}vomg fdb[ZZkjhVTR~ 2-*o ABACBCddd 5/+= 022 !#%|bii!E Y\\VZ[  !!pprtvv $!  <3,+{fW`jVIulbg_V=;9WUO\XPkh_SQJaQGʿf`[pkdKD?_ZSypZUN_]VMKGDA" =:6ed]9SSS20.}  wg\{MA8@.$kc[~ulSMIjf_kfb ) nja3-'&)*a\XJEAz{{ ľMD)**t(s>qc<2 (  @CBA1-)&   A@@KNQ ?AAPROVVZVZV.*.~82+oniqts110^^]=4$;;={z,)  kfe`2,'JDAsd\;65|nYMPWk`P\\\ghn%+(ZPK+Աih`QQQJKPqjj-&+pm~trtTQQ++*!!78>gce&($WVV)+*fhl  uqnvpZYR hf]{r1*)8:9 DE?g3-/~ijm@@?%''~~ vnn467788;:: Z[WӀ} x  (00 %   h @ 2