Linux (x64): KeyboardInkey() und Mausprobleme nach OpenScreen()

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Linux (x64): KeyboardInkey() und Mausprobleme nach OpenScreen()

Beitrag von Benubi »

Auf Linux x64 getestet mit aktueller PB6.0 beta 9 und PB5.73:

- KeyboardInkey() funktioniert nicht richtig: keine Großbuchstaben oder Sonderzeichen kommen durch

- KeyboardInkey() : unter Windows wird bei Return Eingabe ein #CR$ zurückgegeben, bei Linux nicht. (Entfernen- und Rücktaste verhalten sich ebenso verschieden)

- Einige Tasten wie z.B. #PB_Key_Grave oder die Shift Tasten funktionnieren nicht

- Maus reagiert "sehr" verzögert und dann zu dolle

- CloseScreen() bzw. Programmende: Desktopauflösung wird von Fullscreen übernommen bzw. nicht wieder zurrückgesetzt. (Hierfür bitte mit den 3D Beispielen aus dem Examples Verzeichnis testen)


In PB6.00 beta 9 läuft unter Windows folgendes Beispiel problemlos, aber unter Linux leider nicht (weitere Platformen habe ich nicht getestet). Tastaturabfrage ist in der main() Procedure.

Code: Alles auswählen

; testpbfullscreenkeyboard.pb
; ---------------------------
;
; LINUX x64: Shifted keyboard strokes do not work, no capital letters, 
;            no special characters like e.g. german chars with umlauts. 
;            Some keys do not work with KeyboardPushed()  
;            e.g. #PB_Key_Grave  
;
; Windows 10: Mouse Bug (fixed in PB6.00 beta)
; 
; Linux x64 : Mouse bug 
;             Too slow reaction, too fast movement.
;
; Linux x64 : OpenScreen() CloseScreen()
;             Desktop gets set to fullscreen dimensions on program exit (original Dekstop resolution is lost)
; -------------------------------------------
; -------------------------------------------
; -------------------------------------------
EnableExplicit


#CLI_VERSION  ="NoName CLI v1.0"
#CLI_COPYRIGHT="(c) 2048 by Nobody Industries"



; -------------------------------------------
; -------------------------------------------
Define EXIT 

NewList lnBuff.s()
;Define changed 
Define ln =0
Define lnWidth
Define cli_visible = #True
Define cli_priv = #False
Define cli_prompt$ = "> "
Define cli_enable_prompt = #True
Define cl_input$
Define cl_cols
Define fline$
Define cli_flush = #False 
NewList cmd_history$()

; -------------------------------------------
; -------------------------------------------
Prototype CLI_COMMAND(commandline$, udata)

; Structure _cli_command
;   name.s
;   help.s
;   command.CLI_COMMAND
;   isadmin.b
; EndStructure
; 
; NewMap _CLI_CMDS._cli_command()

; -------------------------------------------
; Open full screen with current desktop settings
Procedure OpenFullScreen(Title$="PureBasic in-game CLI")
  Protected w,h,d
  ExamineDesktops()
  w = DesktopWidth(0)
  h = DesktopHeight(0)
  d = DesktopDepth(0)
  ProcedureReturn OpenScreen(w,h,d,Title$, #PB_Screen_SmartSynchronization)
EndProcedure



; -------------------------------------------
; help procedures
; -------------------------------------------

Procedure LongestLineLen(Text$)
  Protected max.i
  Protected this.i
  Protected *C.character = @Text$
  While *C\c
    Select *C\c
      Case 13,10
        If this>max
          max=this
        EndIf 
        this = 0
      Default
        this = this + 1
    EndSelect
    *C = *C +SizeOf(Character)
  Wend 
  If this> max
    max=this
  EndIf 
  ProcedureReturn max
EndProcedure
Procedure StringLines(String$, Array Result$(1))
    Protected NewList tmp$()
    Protected *C.character, *S, len, last 
    *C = @String$
    *S = *C
    While *C\c
      Select *C\c 
        Case 13
          If last = 10
            *S = *C + SizeOf(character)
          ;  Debug "CRLF"
          ElseIf last = 13
            *S = *C + SizeOf(character)
            AddElement(tmp$())
          ;  Debug "CRCR"
          Else 
          ;  Debug "CR newline "+*S 
            AddElement(tmp$())
            tmp$() = PeekS(*S, len)
            len = 0
            *S = *C + SizeOf(Character)
          EndIf  
     
        Case 10
          If last = 13
           ; Debug "LFCR"
            *S = *C + SizeOf(character)
          ElseIf last = 10
          ;  Debug "LFLF"
            *S = *C + SizeOf(character)
            AddElement(tmp$())
          Else 
          ;  Debug "LF newline "+*S
            AddElement(tmp$())
            tmp$() = PeekS(*S, len)
            *S = *C + SizeOf(Character)
            len = 0
          EndIf 
      
        Default 
          len =  len + 1    
      EndSelect
      last = *C\c
      
      *C = *C+SizeOf(character)
    Wend 
    If len>1
      AddElement(tmp$())
      tmp$()=PeekS(*S,len)
    EndIf 
    Protected c = ListSize(tmp$())
    Protected i
    ReDim  Result$(c+1)
    ForEach tmp$()
      Result$(i) = tmp$()
      i=i+1
    Next 
    ProcedureReturn c
EndProcedure
; -------------------------------------------
; cli procedures
; -------------------------------------------
Procedure cli_print(text$)
  Shared lnBuff()
  Shared cl_cols
  If Not LastElement(lnBuff())
    AddElement(lnBuff())
  EndIf 
  Protected a$
  Protected i, len
  text$=ReplaceString(text$,#CRLF$,#CR$)
  text$=ReplaceString(text$,#LFCR$,#CR$)
  text$=ReplaceString(text$,#LF$,#CR$)
  len = Len(text$)
  For i =1 To len Step 1
    a$=Mid(text$,i,1)
    If a$=Chr(8)
      If Len(lnBuff())
        lnBuff() = Left(lnBuff(), Len(lnBuff())-1)
      EndIf 
    ElseIf a$=Chr(13)
      AddElement(lnBuff())
    Else   
      If Len(lnBuff())>=cl_cols
        AddElement(lnBuff())
      EndIf 
      lnBuff() = lnBuff() + a$
    EndIf 
  Next 
EndProcedure
Procedure cli_printn(text$)
  cli_print(text$ + #CR$)
EndProcedure
Procedure cli_draw(m_x,m_y,backcolor=$0)
  Shared lnBuff(), cl_input$, cli_flush
  Protected w,h
  Protected need_delete
  Protected M, i, x, y, cliwidth, cline$
  DrawingFont(FontID(1))
  w = OutputWidth() - m_x
  h = OutputHeight() - m_y
  Box(0,0,OutputWidth(),OutputHeight(),BackColor)
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0,0,OutputWidth(),OutputHeight(),$FFFF)
  DrawingMode(1)
  
  M = TextHeight("M")
  y = m_y
  
  ForEach lnBuff()
    DrawText(m_x, y,lnBuff(),$FFFFFF) ; draw text buffer line
    y = M + y
    If y+M>h
      need_delete=#True
      Break 
    EndIf 
  Next 
  
  If ListSize(lnBuff())
    y = y - M
  EndIf 

  If y+M<=h And Not need_delete
    cline$="> "+cl_input$
    cliwidth = TextWidth(cline$)    
    DrawText(m_x, y, cline$,$FFFFFF) ; draw input line
    ; draw cursor
    If ElapsedMilliseconds()%600<300
      LineXY(m_x + cliwidth, y, m_x + cliwidth, y+M,$FFFFFF)
    EndIf 
  Else 
    need_delete=#True
  EndIf 
  
  If need_delete
    If Not cli_flush
      FirstElement(lnBuff())
      DeleteElement(lnBuff())
    Else 
      Protected maxlines
      maxlines = (OutputHeight() / M) 

      Repeat 
        FirstElement(lnBuff())
        
        DeleteElement(lnBuff())
     Until ListSize(lnBuff())<=maxlines
    EndIf 
  EndIf 
  
EndProcedure
Procedure cli_cls()
  Shared lnBuff()
  ClearList(lnBuff())
EndProcedure
Procedure cli_title(title$,char$="",lines=2)
  Protected maxlen = LongestLineLen(Title$)
  Shared lnBuff()
  Protected c, Dim ln$(10),i
  title$=Trim(title$)
  c = StringLines(title$, ln$())
   If char$=""  
    char$="-"
  EndIf 
  If LastElement(lnBuff())
    If lnBuff()<>""
      AddElement(lnBuff())
    EndIf 
  EndIf 
  If lines<1
    For i=0 To c-1
      cli_printn(ln$(i))
    Next 
    cli_printn(LSet("",maxlen,char$))
    cli_printn("")
    ProcedureReturn 0
  EndIf 
  
  If lines>1
  cli_printn(LSet("",maxlen,char$))
  EndIf 

    For i=0 To c-1
      cli_printn(ln$(i))
    Next 
  cli_printn(LSet("",maxlen,char$))
 
EndProcedure

; -------------------------------------------
; cli "commands"
; -------------------------------------------
Runtime Procedure _cli_exit(cmd$, udata)
  Shared EXIT
  EXIT=#True
EndProcedure
Runtime Procedure _cli_quit(cmd$, udata)
  Shared EXIT
  EXIT=#True
EndProcedure
Runtime Procedure _cli_cls(cmd$, udata)
  cli_cls()
EndProcedure
Runtime Procedure _cli_cd(cmd$, udata)
  Protected pwd$ = Mid(cmd$,4)
  If pwd$=""
    cli_printn(GetCurrentDirectory())
  Else
    If Not SetCurrentDirectory(pwd$)
      cli_printn("Error: could not change to directory '"+pwd$+"'")
    EndIf 
  EndIf 
EndProcedure
Runtime Procedure _cli_help(cmd$, udata)
  cli_title("H e l p")
  cli_printn("cd          change directory")
  cli_printn("cls         clear screen")
  cli_printn("dir         list directory content")
  cli_printn("exit        exit demo")
  cli_printn("flush       enable/disable fast line flushing on draw")
  cli_printn("help        this page")
  cli_printn("quit        exit demo")
  cli_printn("type        display the content of a text file")
  cli_printn("version     app version")
EndProcedure
Runtime Procedure _cli_version(cmd$, udata)
  cli_title(#CLI_VERSION+#CRLF$+#CLI_COPYRIGHT)
  
  cli_printn("PB Compiler version: "+StrD(#PB_Compiler_Version/100,2))
  
  cli_print("..........OS family: ")
  CompilerSelect #PB_Compiler_OS 
    CompilerCase   #PB_OS_Windows
      cli_printn("Windows")
    CompilerCase   #PB_OS_Linux
      cli_printn("Linux")
    CompilerCase #PB_OS_AmigaOS
      cli_printn("AmigaOS")
    CompilerCase #PB_OS_MacOS
      cli_printn("MacOS")
    CompilerCase #PB_OS_Web
      cli_printn("Webbrowser")
    CompilerDefault
      cli_printn("UNKNOWN")
  CompilerEndSelect
  cli_print("...Processor family: ")
  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_JavaScript
      cli_printn("JavaScript")
    CompilerCase #PB_Processor_mc68000
      cli_printn("mc68000")
    CompilerCase #PB_Processor_PowerPC
      cli_printn("PowerPC")
    CompilerCase #PB_Processor_x64
      cli_printn("x64")
    CompilerCase #PB_Processor_x86
      cli_printn("x86")
    CompilerDefault
      cli_printn("UNKNOWN")
  CompilerEndSelect
EndProcedure
Runtime Procedure _cli_dir(cmd$, udata)
  Protected Path$ = Mid(cmd$,5)
  Protected fname$, ftype, fsize.q, totalsize.q, files, directories
  Protected dh
  If path$=""
    path$=GetCurrentDirectory()
  EndIf 
  dh = ExamineDirectory(-1,Path$,"*.*")
  If dh
    cli_title("Content of '"+Path$+"'")
    While NextDirectoryEntry(dh)
      ftype = DirectoryEntryType(dh)
      
      If ftype=#PB_DirectoryEntry_File     
        files+1
        fsize  = DirectoryEntrySize(dh)
        cli_print(RSet(FormatNumber(fsize,0),16))
        totalsize + fsize 
      Else;If type=#PB_DirectoryEntry_Directory
        directories+1
        cli_print(RSet("[Directory]",16))         
      EndIf 
      cli_printn("   " + DirectoryEntryName(dh))
    Wend 
    FinishDirectory(dh)
    cli_printn("---------------------------------------------")
    cli_printn("      Files: "+ FormatNumber(files,0))
    cli_printn("Directories: "+FormatNumber(directories,0))
    cli_printn("Total bytes: "+FormatNumber(totalsize,0))
    cli_printn("---------------------------------------------")
    cli_printn("")
    
  Else 
    cli_printn("Error: could not open directory '" + Path$ + "'")
  EndIf 
EndProcedure
Runtime Procedure _cli_type(cmd$, udata)
  Protected fname$=Mid(cmd$,6)
  Protected format 
  If Not ReadFile(1, fname$, #PB_File_SharedRead)
    cli_printn("Error: could not open file '"+fname$+"'")
  Else 
    format = ReadStringFormat(1)
    While Not Eof(1)
      cli_printn(ReadString(1,format))
    Wend 
    CloseFile(1)
  EndIf 
EndProcedure
Runtime Procedure _cli_flush(cmd$, udata)
  Shared cli_flush
  Select LCase(Trim(Mid(cmd$,7)))
    Case ""
      cli_print("Output line flush is ")
      If cli_flush
        cli_printn("ON")
      Else 
        cli_printn("OFF")
      EndIf 
    Case "on","yes","true","1"
      cli_flush=#True
    Case "off","no","false","0"
      cli_flush=#False 
    Default 
      cli_printn("Bad parameter, usage: FLUSH <ON|OFF>")
  EndSelect
EndProcedure
; -------------------------------------------
; -------------------------------------------


InitMouse()
InitSprite()
InitKeyboard()

If Not OpenFullScreen("Keyboard Test")
  MessageRequester("Critical error","Screen could not be opened",#PB_MessageRequester_Error)
  End 
EndIf 

If CreateSprite(1,800,600)
  If StartDrawing(SpriteOutput(1))
    DrawText(0,0,"Enter keyboard text. Press ESCAPE to exit")
    cl_cols = OutputWidth()/TextWidth("M")
    StopDrawing()  
  EndIf 
Else 
  End MessageRequester("CRITICAL ERROR","Could not create sprite")
EndIf 

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  LoadFont(1,"lucida console",8)
CompilerElse 
  LoadFont(1,"terminal",8)
CompilerEndIf

Procedure StartUp()
  cli_title(#CLI_VERSION + #CRLF$ + #CLI_COPYRIGHT)
  cli_printn("") 
  cli_printn("Press ESCAPE or enter 'exit' to return to desktop.")
  cli_printn("List available commands with 'help'")
  cli_printn("")
  cli_printn("Switch CLI visibility on/off with '^' (grave, bellow escape)")
  cli_printn("")
  KeyboardMode(#PB_Keyboard_International)
EndProcedure
Procedure main()
  Shared cl_input$
  Shared EXIT 
  Shared cli_visible
  Shared cmd_history$()
  
  Protected cmd$, vis
  Protected command.CLI_COMMAND
  Protected intensity,mx,my,a$,changed
  Protected lastdraw
   
  startup()
  
  UsePNGImageDecoder()
  CatchSprite(100, ?pb_logo)
  Protected color,c 
  
  intensity=222
Repeat 
  If IsScreenActive()
    ExamineMouse()
  FlipBuffers()
  
;   c = ElapsedMilliseconds()%512
;   If c>256
;     c = 512 - c
;   EndIf 
;   
;   c>>3
;   
  color = $806040
  
  ClearScreen(color)
  SpriteQuality(#PB_Sprite_BilinearFiltering)
;   intensity = ElapsedMilliseconds() % 512
;   If intensity > 255
;     intensity = 512 - intensity 
;   EndIf 
;   If intensity<128
;     intensity=128
;   ElseIf intensity>222
;     intensity=222
;   EndIf
  
  
  mx = MouseX()
  my = MouseY()
  
  ; adjust CLI emplacement
  If mx + SpriteWidth(1) > ScreenWidth()
    mx = ScreenWidth() - SpriteWidth(1)
  EndIf 
  If my + SpriteHeight(1) > ScreenHeight()
    my = ScreenHeight() - SpriteHeight(1)
  EndIf 
  
  If IsSprite(100)
    ZoomSprite(100,ScreenWidth()*0.25,ScreenHeight()*0.25)
    DisplayTransparentSprite(100,(ScreenWidth()*0.5) - (ScreenWidth()*0.25*0.5),(ScreenHeight()*0.5) - (ScreenHeight()*0.25*0.5))
  EndIf 
  
  
  
  If cli_visible
    vis=vis+3
  Else 
    vis=vis-3
  EndIf
  
  If vis<0
    vis=0
  ElseIf vis>intensity
    vis=intensity
  EndIf 
  
  DisplayTransparentSprite(1,mx,my,vis)  ; cli "invisible" = very high transparency (not invisible) :)
  
  
  ; ==========================================
  ; KEYBOARD CHECK
  ; ==========================================
  
  If ExamineKeyboard()
    a$=KeyboardInkey()
    
    If ElapsedMilliseconds()-lastdraw>=100/40
      changed=1  
    Else
      changed=0
    EndIf 
    
    ; =======================================
    
    ;If a$=Chr(8) ; <---- this does not work on Linux (does on Windows)
     ;   cl_input$=Left(cl_input$,Len(cl_input$)-1)      
     ;   changed!1
    If KeyboardReleased(#PB_Key_Grave) ; this does not work on Linux
      cli_visible!1
    ElseIf KeyboardReleased(#PB_Key_Up)
      If ListIndex(cmd_history$())>=0
        cl_input$ = cmd_history$()
        PreviousElement(cmd_history$())
      ElseIf FirstElement(cmd_history$())
        cl_input$ = ""
      Else 
        cl_input$ = ""
      EndIf 
      changed=1
    ElseIf KeyboardReleased(#PB_Key_Down)
      If ListIndex(cmd_history$())>=0
        cl_input$ = cmd_history$()
        NextElement(cmd_history$())
      ElseIf LastElement(cmd_history$())
        cl_input$ = ""
      Else 
        cl_input$ = ""
      EndIf 
      changed=1
    ElseIf KeyboardReleased(#PB_Key_Back) ; this works on Linux & Windows
        cl_input$=Left(cl_input$,Len(cl_input$)-1)      
        changed=1     
    ElseIf a$=#TAB$
        cl_input$ = cl_input$ + " "
    ElseIf Asc(a$)>=32
     cl_input$=cl_input$+a$
     changed=1
    ElseIf a$=Chr(13) Or KeyboardReleased(#PB_Key_Return) Or KeyboardReleased(#PB_Key_PadEnter) ; Chr(13) does not work on Linux (does on Windows)
      
      If cl_input$<>""
        LastElement(cmd_history$())
        AddElement(cmd_history$())
        cmd_history$()=cl_input$
        
       cmd$=ReplaceString(cl_input$,#TAB$,Chr(32))
       cmd$=StringField(cmd$,1," ")
       command = GetRuntimeInteger("_cli_"+cmd$+"()")
       
       cli_printn("> "+cl_input$)
       If command
         command(cl_input$,0)  
       Else 
         cli_printn("Unknown command '"+cmd$+"'")
       EndIf 
       cl_input$=""
      EndIf 
      changed=1
    EndIf
    
    ; ==========================================
  
    If changed 
      If StartDrawing(SpriteOutput(1))
        cli_draw(4,4,$01)
        StopDrawing()
        lastdraw=ElapsedMilliseconds()
      EndIf 
    EndIf 
    
    If KeyboardPushed(#PB_Key_Escape)
      EXIT=#True
    EndIf   
    
  EndIf 
  
  EndIf 
  
Until EXIT

CloseScreen()
EndProcedure

main()



DataSection
  pb_logo:
  Data.q $0A1A0A0D474E5089,$524448490D000000,$3000000030000000,$F902570000000608,$5948700900000087,$1C0000201C000073,$00009E9B0FCD0120,$D607454D49740700,$C953B60D17151C0C,$4144499C0C000004,$5D8C7999D5DE6854,$EF7B9CE73FC75DD7,$78E2CF17D9BDE65B,$907126A2B60927A9,$546D02D2602C8A93,$5555116D24489694
  Data.q $A152044A2540A505,$A6A102108AA90682,$A0510A2ACB454034,$B66CE3524E2C84B4,$8F167B19C664F6C7,$E1CF77DFBEDF5F67,$B1ED89363C667B8F,$27DD5EE8E91C48C7,$FEFDF6DF9EFBFBBD,$9E2A3C4B568B62AE,$D6DFF68796A1F479,$815294B6322A5311,$BB0B61B900A00ED6,$FB22D8969AFEE4B9,$D751B97E0F23F4C5,$18151C295CF1D8FF
  Data.q $82D1904672062B29,$11D749B5D4C9A04C,$15D2A39A9954BAE9,$7A4DA72A4445D2A9,$7E93373E1D4A5F36,$07E5256670B67273,$637AF6076D6068DA,$A6559BD1E2799C00,$1807E306DD745030,$0251C06106308EBF,$1C5CF2839E3839E5,$2E50F8190295C5C7,$94117AE01082AD41,$D058AE74B55282E7,$F9DC8FF555266AF9,$058C81E6069ED7C3
  Data.q $6F87F8D7AE72D172,$CFA7B7FCE9A2A1DE,$6036831B4068374F,$021A040DAAF63708,$6A69C51B9408D06D,$0AA21E7A426C69C2,$411D7A0C8D4C57C2,$D7E1FC57575F75AD,$DC281D7817B801DE,$2E2F81FF767F0010,$00AB746CC0789D9C,$80C26E785EF74263,$2BAA15FB418D2017,$45086C614B2BCA15,$B4DFF625F989D4C1,$62C9E9E391C2FCDD
  Data.q $63C67EF6B1B59B69,$BA3DAFD0D79AEA93,$83EFAA8DF0B33733,$31A2366B9A131831,$5BB4A40290081E1B,$541477C025061480,$1A9D2F8FBDB03C0A,$C0538097654B1FC9,$68EF6E00E5B8B000,$6CD9B2B7D4E5D191,$DE306F59DACC1823,$C2D6208F58BF0D98,$62924344EF0880CB,$E717F1B7BB7B856E,$BC0F37353CFF4AE7,$FE2F1407BC0CBC03
  Data.q $F03FCFDCF0002DE7,$426369CFE2C2D4B9,$C6F75DCD63180D43,$B64DD003EF34EFC5,$4E56D6F6E45A9CB0,$02599D0DAFB5AB94,$A83F640F592F004E,$AFC0D7A6F46B6102,$B17CFF333EA7AA7E,$EE242FE375E98952,$B02C203D611AF27A,$D3662CCD9244818B,$27C18D8D621CF0EC,$FC083D69AE5D1F0F,$B397EA7436DFF027,$0D951E2DBC49D365
  Data.q $EB5B64CF9F3FA9CB,$E4C22108148786DA,$83BD088D653D6215,$13C5E030BC9D1730,$4F7F4FB49A552AA4,$7A855337D5FFB9AF,$D3A5B11C0438147D,$BBBDF0069B3D92BF,$98DC9B642A51DB6F,$5568139B4428D4BB,$7A9A041001247C01,$4F422392C2234750,$084559422F52F45C,$791E4ED7647C3352,$FC0934A15CF664EB,$4E90DCF2B6F3EED8
  Data.q $E214B8F8187C00DC,$93751FD6D788CECE,$BAC5EA37BC5EA33B,$4286D6F681C8D163,$04067AC1AD7557D5,$33277340DA30F5CA,$46A79DBEDC1CA3D3,$AF024E4D8ECF0B27,$D2507DCFF8DBCF00,$643E06E80F00056E,$75F74D0237764DAF,$5D3F7D5DF5FCDCB4,$10890840A5A97DF1,$2EE972B289A26882,$C1DED7D864CE1967,$CE0D8F37F94AC56B
  Data.q $5D4813780E7990D8,$1CC0F991A2B7692E,$FB1028A02C4402B0,$CF53787F9DBEAEE8,$06D180349CB9D2F7,$20922546345E3421,$FCC7B43EBB34EE7D,$B72E7C787E54E8D5,$DA2F02EF00AEA958,$C00AD7F18CDE9F7A,$B7E002CFADBE1058,$B3F76F62FB1BDCEE,$0C615AD2EDB3B353,$3D9F4C3DAD502908,$70C0C4F376BBDDC9,$0C043014EAD2D0EE
  Data.q $566A0FA580A7005B,$AFB17FE7C4E00A5B,$FF317CB9EEE5BDAB,$A1D1F6FD9F4EC797,$C9FE767B1BFEA055,$D68B9E794FDCECFC,$2EF7788636831810,$7E3EBEBECBBECE46,$D34B0BCBFCF1BDF7,$96CB526D97FE44B6,$039537D252D7F8E7,$9FE79B777C7C8F23,$C6E28B17A35AE590,$5D3169AF9C8CA663,$07AFC0A5F01D4E5C,$368950607A80FD54
  Data.q $B9E51E29A3DEC706,$8CD726C7EFF15CD5,$CDD4F65369DB37FF,$7767C0F6ABD436B5,$424BAFFF75CD39F7,$181142F226B6CA37,$D3D726634F4D0221,$4F9AD5046046D5D8,$946C6C718C83E2B9,$FE5475B52C73B393,$EC3B693819726C69,$6AF264BD7EBE3580,$C2EBF7D8EFA78801,$13AD53173D440FD1,$B3A7008C1CA90651,$10E9180C0844E505
  Data.q $15E9AB22B9D318C8,$BE5FD11E1DC51C5A,$41E1DC8D1BB77F7F,$3FC9DC9943926D09,$362BF35D32767538,$1A10F2D98B44D67C,$54734B36F747D4FD,$CA149D2111B89CC4,$841CA90A54854841,$3ECB9407EABF630A,$4D6BA946898F9AE5,$4F2174454A54F810,$5C7312E239A052BC,$FC79191B8F2448DC,$683B393FBED7D0E8,$87D4F03D4B755B2B
  Data.q $273151DFD19AF66F,$476BCEA35EE237AE,$1529020408C60DA6,$DC5CA78D7DD432AE,$8A2F189D8DAD0368,$D8F0625A9D246869,$7571FF25364DEC6B,$E1AC7BD9C9FDFA31,$62570BDAAF81DB45,$51549F7B3B0BE2A3,$4D5F17170282E079,$245E581D08D78FC8,$90852908A4484225,$63F18562883A570A,$42D907E71223B06F,$8D62D007BD4FF7E9
  Data.q $B703B1F13A32DADE,$0B285472AAF9A447,$8825271A1908C485,$235E7B02E48348D0,$30E11090F9691276,$7A75FC79380F5EA2,$F0C0CAFB50C46684,$CA03181B78067032,$72A9E9D2CB81CD9B,$E94BA353E5C99835,$4AE52BB64FD57AF6,$4A15082D71D211C7,$B135088DA28690AB,$F308A448460D68D6,$3E5880787A70E904,$F1C8E47F58D8D04D
  Data.q $C09647E0419B5F45,$91802CB82F4B5FCD,$B87F55CD5A1D497C,$A66AC2FCF77FCE94,$9E10ECEDEC1EF35C,$4DACFA05CDF4E17B,$4350FB0A1D03EA28,$7D4B389B1872A44A,$8713E08ECE8E8669,$FBCB69C1EA14AD8F,$566E7D96AEA6055F,$DBD4BFB3589B68D0,$25EB3F7B5DC6FD59,$F8C9060450286EE3,$996ADC3189A52ACC,$505B5DE309A01EA0
  Data.q $8D4CC9E616662A42,$90323A1FADDBDFD2,$12F3FE5ACF54A85A,$542A99B3CAD9B130,$4BED4775BD5F5207,$A621B1A443FFB7BB,$9302A973B3D759B5,$1E4FE9B575F4A313,$496BEE5495E9913E,$6D6DBD894DADFDAA,$30B15A2B12689571,$EFD3E63D7D1DCC31,$D4F613CB17CE660C,$5F13A7AE57C6B15F,$CCFC4C471DC40FB1,$A56B8F6DED2267FE
  Data.q $A39A2A641088E1C2,$4FC79935B4F4C343,$A7024E2B97BD4D9D,$FBAEA941B9AA00ED,$13DB4434B7DD631A,$64F95CA91FFA345E,$1800FC06BC033726,$980155FC63D7F204,$DFEB6B44B1FFB83E,$EA549060168445E2,$5F31D46E08F0C6F0,$ACE7B2A40CCD9F1F,$B2E8126C75643C14,$031AEFB4E807A17A,$9BCEA59BB3E35B0E,$8913FEDC0F33A10E
  Data.q $794508AE785BF264,$7A7D7926C6066558,$6E74C9CAB6D6F986,$5355B8F9E36A3809,$8F056CD004846ACA,$1B75FC9ECE769DB4,$C5F67BD7FE24D97F,$3B132648FE3535F7,$E7016B1673CFAC40,$35B4F702F92A454B,$DE1F24F7B3F7BFB9,$F92E99D7D63EA7DD,$53B9B550AE78F4C1,$05ACC00B02AE86B1,$250862B9B0DEB950,$AF59EBBC1E4C475C
  Data.q $12E30BCA5A0BE9B9,$08912A2A5F1F5611,$5AD12AEAF4915C99,$7ECDAD1D0364AE95,$87ABD28573E398C5,$43D3B1CAFC5F96E6,$1996E0D186D298DA,$AFE4FE0F0B00597E,$FAEEB8C6FE9B9B24,$2A904A5CF9ACDB7C,$8E2A6BAD5142626C,$94E2CF98A254BE4B,$2838892D2E7AB48B,$5B267EBF2E5ABD35,$B5BF1F89E1A9F978,$08556FA81EB55B9A
  Data.q $B6DFF707E3002FFD,$2113468886F931AD,$810B2A90980411CD,$AF0C8C2840852111,$5CF7C03D5A84F6DA,$149908B94A8D7E8A,$48B1123CF269D44D,$1CAA573DBDAD5B39,$991A3FC5E56E7E7A,$3BD5AFA3BCD6031A,$CFD17D81E6F80117,$C87D8689931D37B5,$42002C175F84BF90,$0433DAC81D7B6B00,$651891EA1B40EEDA,$1225E904F396A861
  Data.q $663C5B438ECD3CA5,$0757FD552F8F5AAA,$8DFC68677F97C573,$C66C13BD6B3942B1,$EEEEF2FBC07A973B,$474F793E34B57783,$2A569886896D81CB,$2900237A0006F7F4,$875AC5A48AFC2231,$25231213C92C6816,$0CA5CA5CF351EB81,$AEED0ACCB132ECF5,$AD5B9394A1EBB343,$77F2BEAE5F38DFD5,$DE7D3E333D2FF353,$1569733C95FA8032
  Data.q $D5F9B9FA0BA56F92,$B4A943B367C737EC,$94C5E22FAF020D1F,$C51FF6109509C272,$2FC6C41BC37FC4DA,$1888214485EE1701,$FA22764D104DC249,$2B247459278E90F6,$163BB3D8222474D9,$31697F6E54B47079,$B000B3797E856735,$E54291F9C0D964BC,$72677F4CADCCBFDC,$B4452AD0285D396E,$D40CE13A462373D3,$08DD9D6C64CAF588
  Data.q $E16E1B08427058CE,$5E0D05AB854A4B90,$F99157A42CA26512,$3A7F0B1333EDF9A2,$34D5F4F9BB68BD3A,$466D9A9F333EF53B,$B9F40E5E3946768B,$985A9DDF738533B7,$D565AA67296E6179,$CE919471C278AAE7,$A1E6BD42617DA745,$5AAC00DEED2D9FB5,$D5743A11EEF9302C,$95B9F7FB9536393C,$E952796A3A2B3B05,$ED8E239157101E4A
  Data.q $A5FA04EC1A962DAA,$E9FADF35750FFD10,$39B57776F75DAE9E,$D1223D678E34A4B1,$1D43BB2A409CF5A8,$CCE66054B943942D,$3C7A713CC751ED00,$2F2E4765372A56F3,$17375FABD36CC700,$06DBB876BA7E44BA,$A73D5B9B81BB01F4,$EDEA1E5BF69EB1FF,$248F593DBDB7BEDE,$D5D930FA4F59D2D1,$D30C4C2C73152EFA,$43D34707E7F5731C
  Data.q $0D89C1F56C3C1121,$4C1615DC321BA2F3,$1FA026E04EB692C4,$7A67CB7E31ADBFE8,$92DDD3DBD83CF63B,$A529284491EAF168,$F4EAC33E42929183,$91C9CCF82458B128,$7C857EC26562B9D4,$D8B1B466CCBC92C1,$BB01B6C431B84682,$9ABA27FF44257E80,$B647D763BBB87D6F,$4B96CC8B7889B4F5,$9E8F06E220A61764,$36ACC6D4A8595918
  Data.q $C550CD374ACED178,$CF36B10C0F92D216,$D17DD6FDB7AC7FE9,$933E3D3C318AEF58,$33B25FE335F5FACD,$D4B31B82A8626BD2,$ACC363D803B62125,$6D476936E3A936CB,$59006E85C25B37CD,$77ACDB05D5988074,$E528CB5FCFC8562A,$30D8E621A5C012FF,$FF5ABFFF62923733,$195FD8DAF3401403,$4E454900000000B7
  Data.b $44,$FF,$42,$60,$FF
  pb_logo_end:
EndDataSection