New Webserver and WebApp (#942)

* Replace the WCF webserver with an ASP.NET Core webserver (VocaluxeWeb)

- New project VocaluxeWeb: ASP.NET Core 2.3 (Kestrel) on .NET Framework 4.8.1, HTTP or HTTPS
  with a self-signed certificate, REST API (/api/v1) with Swagger, live events (Server-Sent Events)
- Access to the game only through IVocaluxeRemote; requests run on the main thread once per frame
- Sessions with roles (guest, player, admin) and configurable permissions, PINs hashed with PBKDF2
- Queue as a playlist with requesters and singers, fair order (one song per person and round)
- Admin: settings, server status, logged-in devices, activate/deactivate and delete profiles
- Profile pictures: own photo or one of the Vocaluxe avatars
- Game: WebApp queue screen (song options, playlist group) to start the next song with the chosen
  singers, return to it after singing, warning when the webserver is off, remote keyboard
- Old WCF server, WebserverInitalConfig and URL reservations removed; libraries moved to libs/managed
- Unit tests for PIN hashing, settings and permissions, queue order and device names
- AppVeyor: Visual Studio 2022 image and Node.js 24 (the build compiles the WebApp)
- Documentation in VocaluxeWeb/README.md

* New WebApp (Vue 3, TypeScript, Vite) replacing the old jQuery Mobile website

- Login with profile and PIN, create profiles
- Songs with search, filters, sorting and 30 second previews
- Queue: add songs with game mode, audio and singers, edit, reorder, start in the game
- Playlists: create, edit, add to the queue
- Now playing with live updates, remote control and keyboard
- Players: own profile with picture (photo or Vocaluxe avatar), roles for admins
- Admin settings: permissions, server status, devices, profiles
- Help page, responsive layout for phones, tablets and desktops, light and dark mode
- Texts in WebApp/src/locales/en.json, translated with Transifex
- Old website and PhoneGap config removed

---------

Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
This commit is contained in:
McSchneidarandFlorian Ostertag authored and GitHub committed 2026-10-26 05:40:11 +01:00
1 parent e3e9d1d6ae
commit 336d08040e
186 files changed
+14971 -6988

No files matched your search

+15
View File
@@ -166,6 +166,21 @@
<string name="TR_SCREENJUKEBOX_VIDEO">Video</string>
<string name="TR_SCREENJUKEBOX_NUMSONGS">%d songs</string>
<string name="TR_SCREENJUKEBOX_NOSONGS">No songs found</string>
<string name="TR_SCREENWEBQUEUE_TITLE">WebApp Queue</string>
<string name="TR_SCREENWEBQUEUE_NEXT">Up next</string>
<string name="TR_SCREENWEBQUEUE_HINT">Add songs with the WebApp</string>
<string name="TR_SCREENWEBQUEUE_SERVEROFF">The webserver is off - switch it on under Options - Server to use the WebApp</string>
<string name="TR_SCREENWEBQUEUE_EMPTY">The queue is empty.</string>
<string name="TR_SCREENWEBQUEUE_EMPTY2">Add songs with the WebApp (QR code: Server address).</string>
<string name="TR_SCREENSONG_BUTTON_WEBQUEUE">WebApp Queue</string>
<string name="TR_SCREENWEBQUEUE_ADDEDBY">added by %s</string>
<string name="TR_SCREENWEBQUEUE_SINGERS">Singers: %s</string>
<string name="TR_SCREENWEBQUEUE_NOSINGERS">Singers are chosen before singing</string>
<string name="TR_SCREENWEBQUEUE_MORE">+ %d more</string>
<string name="TR_SCREENWEBQUEUE_MODE">Game mode</string>
<string name="TR_SCREENWEBQUEUE_AUDIO">Audio</string>
<string name="TR_SCREENWEBQUEUE_PLAYERS">Change players</string>
<string name="TR_SCREENWEBQUEUE_SING">Sing</string>
<string name="TR_JUKEBOX_ORDER_RANDOM">Random</string>
<string name="TR_JUKEBOX_ORDER_SORTED">In order</string>
<string name="TR_JUKEBOX_SECTION_FULL">Full song</string>
@@ -1,5 +1,11 @@
ScreenSong
++++++++++
Version 17:
Add:
<ButtonOptionsWebQueue> (opens the WebApp queue, below the playlist selection in the playlist group of the song options)
++++++++++
Version 16:
@@ -0,0 +1,6 @@
ScreenWebQueue
++++++++++
Version 1:
New screen: queue of the WebApp (next song with requester, game mode, audio mode and singers, list of the following songs; sing the next song, change players, server address)
@@ -2,7 +2,7 @@
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenSong</ScreenName>
<ScreenVersion>16</ScreenVersion>
<ScreenVersion>17</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
@@ -104,13 +104,13 @@
</Rect>
</Static>
<Static Name="StaticOptionsGroupPlaylist">
<Skin>OptionsGroupSmall</Skin>
<Skin>OptionsGroupLarge</Skin>
<Color Name="ButtonMainColor" />
<Rect>
<X>60</X>
<Y>630</Y>
<W>540</W>
<H>110</H>
<H>160</H>
<Z>-2.105</Z>
</Rect>
</Static>
@@ -262,7 +262,7 @@
<Color Name="White" />
<Rect>
<X>76</X>
<Y>767</Y>
<Y>817</Y>
<W>36</W>
<H>36</H>
<Z>-2.13</Z>
@@ -273,7 +273,7 @@
<Color Name="White" />
<Rect>
<X>351</X>
<Y>767</Y>
<Y>817</Y>
<W>36</W>
<H>36</H>
<Z>-2.13</Z>
@@ -990,7 +990,7 @@
<SkinSelected>SongSelectButton</SkinSelected>
<Rect>
<X>335</X>
<Y>755</Y>
<Y>805</Y>
<W>265</W>
<H>60</H>
<Z>-2.11</Z>
@@ -1290,6 +1290,33 @@
<Text>TR_SCREENSONG_BUTTON_RANDOMMEDLEY</Text>
</Text>
</Button>
<Button Name="ButtonOptionsWebQueue">
<Skin>SongSelectButton</Skin>
<SkinSelected>SongSelectButton</SkinSelected>
<Rect>
<X>76</X>
<Y>732</Y>
<W>508</W>
<H>44</H>
<Z>-2.11</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>254</X>
<Y>4</Y>
<Z>0</Z>
<H>36</H>
<MaxW>490</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENSONG_BUTTON_WEBQUEUE</Text>
</Text>
</Button>
<Button Name="ButtonOptionsStartMedley">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
@@ -1322,7 +1349,7 @@
<SkinSelected>SongSelectButton</SkinSelected>
<Rect>
<X>60</X>
<Y>755</Y>
<Y>805</Y>
<W>265</W>
<H>60</H>
<Z>-2.11</Z>
@@ -0,0 +1,684 @@
<?xml version='1.0' encoding='utf-8'?>
<Screen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Informations>
<ScreenName>ScreenWebQueue</ScreenName>
<ScreenVersion>1</ScreenVersion>
</Informations>
<Backgrounds>
<Background Name="Background1">
<Type>Video</Type>
<SlideShowTextures />
<Video>BG_Video</Video>
<Skin>BG_Options</Skin>
<Color Name="BackgroundColor" />
</Background>
</Backgrounds>
<Statics>
<Static Name="StaticMenuBar">
<Skin />
<Color Name="BackgroundColorAlpha" />
<Rect>
<X>0</X>
<Y>60</Y>
<W>1920</W>
<H>67.5</H>
<Z>1</Z>
</Rect>
</Static>
<Static Name="StaticWarning">
<Skin>Warning</Skin>
<Color Name="StaticWarningColor" />
<Rect>
<X>390</X>
<Y>142.5</Y>
<W>1140</W>
<H>75</H>
<Z>-1</Z>
</Rect>
</Static>
<Static Name="StaticNextPanel">
<Skin />
<Color Name="BackgroundColorAlpha" />
<Rect>
<X>82.5</X>
<Y>240</Y>
<W>600</W>
<H>400</H>
<Z>1</Z>
</Rect>
</Static>
<Static Name="StaticNextCover">
<Skin>CoverTile</Skin>
<Color Name="StaticColor" />
<Rect>
<X>282.5</X>
<Y>300</Y>
<W>200</W>
<H>200</H>
<Z>0</Z>
</Rect>
</Static>
</Statics>
<Texts>
<Text Name="TextTitle">
<X>960</X>
<Y>75</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>1500</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_TITLE</Text>
</Text>
<Text Name="TextInfo">
<X>960</X>
<Y>161</Y>
<Z>0</Z>
<H>37.5</H>
<MaxW>1500</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_HINT</Text>
</Text>
<Text Name="TextWarning">
<X>960</X>
<Y>161</Y>
<Z>-1.1</Z>
<H>37.5</H>
<MaxW>960</MaxW>
<Color Name="TextWarningColor" />
<SelColor Name="TextWarningColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_SERVEROFF</Text>
</Text>
<Text Name="TextNextLabel">
<X>382.5</X>
<Y>250</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_NEXT</Text>
</Text>
<Text Name="TextNextSong">
<X>382.5</X>
<Y>512</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
<Text Name="TextNextDetails">
<X>382.5</X>
<Y>560</Y>
<Z>0</Z>
<H>33</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
<Text Name="TextNextPlayers">
<X>382.5</X>
<Y>598</Y>
<Z>0</Z>
<H>33</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
<Text Name="TextMode">
<X>97.5</X>
<Y>660</Y>
<Z>0</Z>
<H>33</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_MODE</Text>
</Text>
<Text Name="TextAudio">
<X>97.5</X>
<Y>772</Y>
<Z>0</Z>
<H>33</H>
<MaxW>570</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_AUDIO</Text>
</Text>
<Text Name="TextEmpty">
<X>1293.75</X>
<Y>450</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>1000</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_EMPTY</Text>
</Text>
<Text Name="TextEmpty2">
<X>1293.75</X>
<Y>502</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1000</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_EMPTY2</Text>
</Text>
<Text Name="TextMore">
<X>1293.75</X>
<Y>785</Y>
<Z>0</Z>
<H>30</H>
<MaxW>1000</MaxW>
<Color Name="TextColor" />
<SelColor Name="TextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Normal</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Texts>
<Buttons>
<Button Name="ButtonEntry1">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>240.0</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry2">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>307.5</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry3">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>375.0</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry4">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>442.5</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry5">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>510.0</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry6">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>577.5</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry7">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>645.0</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonEntry8">
<Skin>QueueRow</Skin>
<SkinSelected>QueueRow</SkinSelected>
<Rect>
<X>750</X>
<Y>712.5</Y>
<W>1087.5</W>
<H>60</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>22.5</X>
<Y>13.5</Y>
<Z>0</Z>
<H>33</H>
<MaxW>1040</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Left</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text></Text>
</Text>
</Button>
<Button Name="ButtonBack">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>82.5</X>
<Y>915</Y>
<W>262.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>131.25</X>
<Y>17.2</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>250.5</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_BUTTON_BACK</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonServer">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1012.5</X>
<Y>915</Y>
<W>262.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>131.25</X>
<Y>17.2</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>250.5</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENOSERVER_BUTTON_SERVER</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonPlayers">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1297.5</X>
<Y>915</Y>
<W>262.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>131.25</X>
<Y>17.2</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>250.5</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_PLAYERS</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
<Button Name="ButtonStart">
<Skin>Button</Skin>
<SkinSelected>Button</SkinSelected>
<Rect>
<X>1582.5</X>
<Y>915</Y>
<W>262.5</W>
<H>75</H>
<Z>0</Z>
</Rect>
<Color Name="ButtonColor" />
<SelColor Name="ButtonSelColor" />
<Text Name="Text">
<X>131.25</X>
<Y>17.2</Y>
<Z>0</Z>
<H>40.5</H>
<MaxW>250.5</MaxW>
<Color Name="ButtonTextColor" />
<SelColor Name="ButtonTextSelColor" />
<Align>Center</Align>
<ResizeAlign>Center</ResizeAlign>
<Style>Bold</Style>
<Font>Outline</Font>
<Text>TR_SCREENWEBQUEUE_SING</Text>
</Text>
<Reflection>
<Height>39</Height>
<Space>15</Space>
</Reflection>
<SelReflection>
<Height>39</Height>
<Space>15</Space>
</SelReflection>
</Button>
</Buttons>
<SongMenus />
<Lyrics />
<SelectSlides>
<SelectSlide Name="SelectSlideMode">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>82.5</X>
<Y>700</Y>
<W>600</W>
<H>60</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>88.5</X>
<Y>703.0</Y>
<W>54</W>
<H>54</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>622.5</X>
<Y>703.0</Y>
<W>54</W>
<H>54</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>36</TextH>
<TextRelativeX>66</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>380</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
<SelectSlide Name="SelectSlideAudio">
<Skin />
<SkinArrowLeft>SelectSlideArrowLeft</SkinArrowLeft>
<SkinArrowRight>SelectSlideArrowRight</SkinArrowRight>
<SkinSelected>SelectSlide</SkinSelected>
<SkinArrowLeftSelected>SelectSlideArrowLeft</SkinArrowLeftSelected>
<SkinArrowRightSelected>SelectSlideArrowRight</SkinArrowRightSelected>
<Rect>
<X>82.5</X>
<Y>812</Y>
<W>600</W>
<H>60</H>
<Z>0</Z>
</Rect>
<RectArrowLeft>
<X>88.5</X>
<Y>815.0</Y>
<W>54</W>
<H>54</H>
<Z>0</Z>
</RectArrowLeft>
<RectArrowRight>
<X>622.5</X>
<Y>815.0</Y>
<W>54</W>
<H>54</H>
<Z>0</Z>
</RectArrowRight>
<Color Name="SelectSlideColor" />
<SelColor Name="SelectSlideSelColor" />
<ArrowColor Name="ArrowColor" />
<ArrowSelColor Name="ArrowSelColor" />
<TextColor Name="TextColorAlpha" />
<TextSelColor Name="TextSelColor" />
<TextH>36</TextH>
<TextRelativeX>66</TextRelativeX>
<TextRelativeY>0</TextRelativeY>
<TextMaxW>380</TextMaxW>
<TextFont>Outline</TextFont>
<TextStyle>Bold</TextStyle>
<NumVisible>1</NumVisible>
</SelectSlide>
</SelectSlides>
<SingNotes />
<NameSelections />
<Equalizers />
<Playlists />
<ParticleEffects />
<ScreenSettings />
</Screen>