Text Based Clipboard Manager w/Gui

Post your working scripts, libraries and tools for AHK v1.1 and older
User avatar
DataLife
Posts: 445
Joined: 29 Sep 2013, 19:52

Text Based Clipboard Manager w/Gui

Post by DataLife » 31 May 2019, 16:19

I started this clipboard script more than 7 years ago. I use it daily.
I have never considered it finished and it probably has a bug or two.
I use text files to store the clipboard content. I suspect it may have been better to use an array and write the array to a text file when the script exits. I think that would take a complete rewrite and I am not inclined to do that.
It works pretty good like it is.

Download it here....
https://sourceforge.net/projects/my-clipboard-manager/files/ClipBoardManager.ahk/download

;Text Based Clipboard Manager
;How to Use:
;1. Ctrl Alt Space to open Clipboard Gui
;2. Choose a clipboard and click paste. The clipboard will be pasted at the cursor position if it is visible.

;Features:
;Saves last user defined number of clipboard contents (default 100 - click settings to change)
;You can have 10 presets. You can edit and save any of the clipboards as a preset or manually add new ones.
;A Compact option will show a smaller gui that shows the 1st line of each clipboard with a paste button
;Option to show Gui on each clipboard change (default: NO)
;Option to start with windows (default: NO)
;Option to not show Tray Icon

;Notes:
;1. Click on picture arrows or use the keyboard arrow keys to browse saved clipboards
;2. You can click and drag the Gui and the script will remember its position
;3. You can edit the current clipboard from the main Gui before pasting
;4. Left clipboard picture shows Viewing Current Clip Number / Total clipboards saved - Example 4/7
;5. Right clipboard picture shows total number of clipboards allowed to be saved )
;6. Exit the script by right clicking on the tray icon or use the hotkey "Ctrl e"
;7. Escape key closes MyClipboardManager Gui or click Close on the Gui
;8. MyClipboardManager creates subfolders so create a folder for MyClipboardManager
;9. Displaying the contents of very large clipboards takes awhile.
;10. Click on "View all Entries" to see all clipboards that have been saved. On this Gui you will be able to Paste,Clear,Edit & Save each clipboard. Also while making changes to a clipboard you can click "Restore" to restore to original clipboard.

;Credits go to the following people.
;Laszlo - "Bin2Hex functions" found here https://autohotkey.com/board/topic/4352-binary-file-io-with-binary-buffers/
;Veovis - "include-a-bitmap-in-your-uncompiled-script" found here https://autohotkey.com/board/topic/9974-include-a-bitmap-in-your-uncompiled-script/
;Lexikos - Scrollable Gui code from https://autohotkey.com/board/topic/26033-scrollable-gui-proof-of-concept/

Full Script...

Code: Select all

;Text Based Clipboard Manager
;How to Use:
;1. Ctrl Alt Space to open Clipboard Gui
;2. Choose a clipboard and click paste. The clipboard will be pasted at the cursor position if it is visible.

;Features:
;Saves last user defined number of clipboard contents (default 100 - click settings to change)
;You can have 10 presets. You can edit and save any of the clipboards as a preset or manually add new ones.
;A Compact option will show a smaller gui that shows the 1st line of each clipboard with a paste button
;Option to show Gui on each clipboard change (default: NO)
;Option to start with windows (default: NO)
;Option to not show Tray Icon

;Notes:
;1. Click on picture arrows or use the keyboard arrow keys to browse saved clipboards
;2. You can click and drag the Gui and the script will remember its position
;3. You can edit the current clipboard before pasting
;4. Left clipboard picture shows Viewing Current Clip Number / Total clipboards saved - Example 4/7
;5. Right clipboard picture shows total number of clipboards allowed to be saved )
;6. Exit the script by right clicking on the tray icon or use the hotkey "Ctrl e"
;7. Escape key closes MyClipboardManager Gui or click Close on the Gui
;8. MyClipboardManager creates subfolders so create a folder for MyClipboardManager
;9. Displaying the contents of very large clipboards takes awhile.
;10. Click on "View all Entries" to see all clipboards that have been saved. On this Gui you will be able to Paste,Clear,Edit & Save each clipboard. Also while making changes to a clipboard you can click "Restore" to restore to original clipboard.

Version = 1.1
ScriptName = MyClipboardManager
#SingleInstance,force
SetControlDelay, -1
DetectHiddenWindows,On
SetBatchLines, -1
IfNotExist,%a_scriptdir%\Images
 FileCreateDir, %a_scriptdir%\Images
IfNotExist,%a_scriptdir%\Presets
 FileCreateDir, %a_scriptdir%\Presets
IfNotExist, %a_scriptdir%\ClipboardHistory
 FileCreateDir, %a_scriptdir%\ClipboardHistory
gosub, CreatePictures&Icon

Menu, TRAY, Icon, %a_scriptdir%\images\Clipboard.ico

IniRead,TrayIcon,config.ini,settings,TrayIcon,1
if TrayIcon = 0
 Menu, tray, noicon ;put here as soon as possible to avoid the trayicon from flashing at startup

OnMessage(0x115, "OnScroll") ; WM_VSCROLL ;used for extra large clipboards to be displayed on a scrollable gui and "View All Entries"
OnMessage(0x114, "OnScroll") ; WM_HSCROLL
OnMessage(0x203, "OnLButtonDblClk") ;prevents a static controls text being copied to the clipboard on doubleclick. Required funtion is OnLButtonDblClk
IniRead,NumberOfClipBoards,config.ini,Settings,Count,100
IniRead,GuiSize,config.ini,Gui,Size,Expanded
IniRead,LastClipBoardContentsPos,config.ini,LastClipBoardContentsPos,Pos,1
PresetSelected = 0
LeftArrow = 0
RightArrow = 0
ClearthisEntry = 0
gosub ReNumberClipboardTextFilesIfAnyAreMissing
Loop %a_scriptdir%\ClipboardHistory\Clip*.txt
 NumberOfSavedClipboards = %a_index%

FileRead,Value,%A_ScriptDir%\ClipboardHistory\Clip%LastClipBoardContentsPos%.txt

IniRead, SGX,config.ini,GuiPosition,CompactGuiXpos,100
IniRead, SGY,config.ini,GuiPosition,CompactGuiYpos,100
IniRead, EGX,config.ini,GuiPosition,ExpandedGuiXpos,100
IniRead, EGY,config.ini,GuiPosition,ExpandedGuiYpos,100
Gui 1: Add, Edit, x31 y15 w100 h20 vMyCompactEdit,
Gui 1: Add, Picture, x6 y15 w20 h20 , images\MyClipboardManager-Left.png
Gui 1: Add, Picture, x136 y15 w20 h20 gArrow, images\MyClipboardManager-Right.png
Gui 1: Add, Button, x6 y37 w50 h20 gPaste Default,Paste
Gui 1: Add, Button, x56 y37 w50 h20 gExpand,Expand
Gui 1: Add, Button, x106 y37 w50 h20 gClose,Close
Gui 1: Add, text, x12 y70 w150,Blank lines were found at the`ntop.`nClick Expand to see contents
Gui 2: Add, Edit, x61     y45 w500  r20 vMyExpandedEdit,
Gui 2: Add, Picture, x20  y45 w20 h20 gArrow vleft , images\MyClipboardManager-Left.png
Gui 2: Add, Picture, x581 y45 w20 h20 gArrow , images\MyClipboardManager-right.png
Gui 2: Add, Button, x6    y75 w50 h20 gPaste default,Paste
Gui 2: Add, Button, x566  y75 w50 h20 gPaste,Paste
Gui 2: Add, Button, x6   y322 w50 h20 gCompact,Compact
Gui 2: Add, Button, x+4  y322 w80 h20 gClearThisEntry,Clear This Entry
Gui 2: Add, Button, x+4  y322 w80 h20 gClearAllEntries,Clear All Entries
Gui 2: Add, Button, x+4  y322 w80 h20 gViewAllEntries    ,View All Entries
Gui 2: Add, Button, x+4  y322 w80 h20 gSaveAsPreset,Save As Preset
Gui 2: Add, Button, x+4  y322 w80 h20 gEditPresets,Edit Presets
Gui 2: Add, Button, x+4  y322 w80 h20 gSettings ,Settings
Gui 2: Add, Button, x+4  y322 w50 h20 gClose,Close
Gui 2: Add, Picture,x0 y150 w60 h-1, images\Clipboard.png
Gui 2: Add, Picture,x561 y150 w60 h-1, images\Clipboard.png
Gui 2: Add, Text, x13 y177 w34 vClipTextNumber1 center,%LastClipBoardContentsPos%/%NumberOfSavedClipboards%
GuiControl 2: +BackgroundTrans, ClipTextNumber1
Gui 2: Add, Text, x572 y177 w34 vClipTextNumber2 center,%NumberOfClipboards%
GuiControl 2: +BackgroundTrans, ClipTextNumber2
xPos = 6
loop 10
 {
  Gui 2: Add, Button, x%xPos% y15 w50 h20 gPreset, Preset%a_index%
  xPos := (xPos + 62)  
 }

if GuiSize = Compact
 Gui 1: Show,  x%SGX% y%SGY% h40 w155, Compact Gui
else
 Gui 1: Show, Hide x%SGX% y%SGY% h40 w155, Compact Gui

ControlFocus,Static1,A  ;Need this to take focus away from edit box
WinGet,SGID,ID,Compact Gui
Gui 1: color, c7c4f4 , e9e9e9
WinSet, AlwaysOnTop, On , Compact Gui
Gui 1: -caption  

if GuiSize = Expanded
 Gui 2: Show,  x%EGX% y%EGY% h324 w616, Expanded Gui
else
 Gui 2: Show, Hide x%EGX% y%EGY% h324 w616, Expanded Gui

GuiControl 1: ,MyCompactEdit, %Value%
GuiControl 2: ,MyExpandedEdit, %Value%
ControlFocus,Static1,A  ;Need this to take focus away from edit box
WinGet,EGID,ID,Expanded Gui
Gui 2: color, c7c4f4 , e9e9e9
WinSet, AlwaysOnTop, On , Expanded Gui
Gui 2: -caption   
GroupAdd, MyClipboardManagerGuis , Expanded Gui
GroupAdd, MyClipboardManagerGuis , Compact Gui
return

OnClipBoardChange:
runonce++ ;prevents OnClipBoardChange from doing anything on initial script start up
if RunOnce < 2
 return

gosub ReNumberClipboardTextFilesIfAnyAreMissing
IniRead,LastClipBoard,config.ini,LastClipBoard,Pos,1
if LastClipBoard =
 LastClipBoard = 1
FoundMatch = 0
if ( A_EventInfo = 1 and PresetSelected = 0 ) ;selecting a preset uses the clipboard, in that case we do not need OnClipBoardChange to do anything
 {
  IniRead,NumberOfClipBoards,config.ini,Settings,Count,100
  if NumberOfClipboards > 0
   {
    loop %NumberOfClipBoards%
     {
      FileRead,Contents,ClipboardHistory\Clip%a_index%.txt
      if Contents = %clipboard%
       {
        FoundMatch = 1
        CurrentClipNumber = %A_Index%
        break
       }
     } ;loop %NumberOfClipBoards%
    
    if ( FoundMatch = 0 ) 
     {
      Loop %a_scriptdir%\ClipboardHistory\Clip*.txt
       NumberOfSavedClipboards = %a_index%
      if LastClipboard > %NumberOfSavedClipboards%
       {
        if NumberOfClipboards > %NumberOfSavedClipboards%
         LastClipboard = %NumberOfSavedClipboards%
       }
      LastClipboard++
      if LastClipboard > %NumberOfClipBoards%
       LastClipboard = 1
      iniwrite,%LastClipBoard%,config.ini,LastClipboard,Pos
      iniwrite,%LastClipBoard%,config.ini,LastClipboardContentsPos,Pos

      FileDelete,%a_scriptdir%\ClipboardHistory\Clip%LastClipboard%.txt
      FileAppend,%ClipBoard%,%a_scriptdir%\ClipboardHistory\Clip%LastClipboard%.txt
      NumberOfSavedClipboards++
      If NumberOfSavedClipboards > %NumberOfClipboards%
       NumberOfSavedClipboards = %NumberOfClipboards%
     } ;ending brace for "if ( FoundMatch = 0 ) " 
   } ;ending brace for "if NumberOfClipboards > 0"
  Value1 = %Clipboard%
  Value2 = %Clipboard%
  GuiControl,1:,Edit1,%Value1%                                      ;even if it already exists in Clipboard history I still want it to change the edit box
  GuiControl,2:,Edit1,%Value2%
  GuiControl,2:, ClipTextNumber1 , %LastClipBoard%/%NumberOfSavedClipboards%
    
  iniwrite,%LastClipBoard%,config.ini,LastClipboardContentsPos,Pos
  LastClipBoardContentsPos = %LastClipBoard%
  
  IniRead,ShowOnClipboardChange,config.ini,Settings,ShowOnClipboardChange,0
  if ShowOnClipboardChange = 1
   gosub ShowGui
 }
PresetSelected = 0 ;set to 0 in case it equals 1
Return

^e::
exitapp
^!space::
IniRead,GuiSize,config.ini,Gui,Size,Expanded
gosub, ShowGui
Return

#IfWinActive, ahk_group MyClipboardManagerGuis
escape::
WinHide, ahk_group MyClipboardManagerGuis
return

#IfWinActive, ahk_group GroupForUpDownControl
up::
ControlGetText, EditBoxValue, edit1, ahk_id %SettingsID%
EditBoxValue++
GuiControl,5:,Edit1,%EditBoxValue%
return

#IfWinActive, ahk_group GroupForUpDownControl
down::
ControlGetText, EditBoxValue, edit1, ahk_id %SettingsID%
EditBoxValue--
if EditBoxValue < 1
 EditBoxValue = 0
GuiControl,5:,Edit1,%EditBoxValue%
return

#IfWinActive, ahk_group MyClipboardManagerGuis
Left::
if EditingEditbox = 1
 {
  send {Left}
  return
 }
LeftArrow = 1
goto Arrow

#IfWinActive, ahk_group MyClipboardManagerGuis
Right::
if EditingEditbox = 1
 {
  send {Right}
  return
 }
RightArrow = 1 ;no return needed this arrow label is used below
Arrow:
ControlFocus,Button6, Expanded Gui ;Need this to take focus away from edit box
value =
IniRead,Number,config.ini,LastClipboardContentsPos,Pos,0
if Number = 0
 return
WinMove,ahk_id %SGID%, , , , ,68
if ( LeftArrow = 0 and RightArrow = 0 )  ;if the arrow keys = 1 then they are being used. so don't get Control
 MouseGetPos,,,, Control
WinGetActiveTitle,Title
if ( Control = "Static1" or LeftArrow = 1 )
 {
  LeftArrow = 0
  GetNextLine1:
  if ClearthisEntry = 0 ;account for missing clip
   Number--
  if Number < 1
   Number = %NumberOfClipBoards%
  FileRead,Value,%a_scriptdir%\ClipboardHistory\Clip%Number%.txt
  if Value =
   goto GetNextLine1
    ClearthisEntry = 0
 }

if ( Control = "Static2" or RightArrow = 1 )
 {
  RightArrow = 0
  GetNextLine2: 
  Number++
  if Number > %NumberOfClipboards%
   Number = 1
  FileRead,Value,%a_scriptdir%\ClipboardHistory\Clip%Number%.txt
  if Value =
   goto GetNextLine2
 }
if GuiSize = Compact
 {
  FileReadLine,IsLineOneBlank,%a_scriptdir%\ClipboardHistory\Clip%Number%.txt,1
  if ErrorLevel = 0
   {
    if IsLineOneBlank =
     WinMove,ahk_id %SGID%, , , , ,120 ;make gui bigger to display message about line 1 being blank
   }
 }
GuiControl,1:,Edit1,%Value%
GuiControl,2:,Edit1,%Value%

Iniwrite,%Number%,config.ini,LastClipboardContentsPos,Pos
LastClipboardContentsPos = %Number%
GuiControl, 2:, ClipTextNumber1 , %Number%/%NumberOfSavedClipboards%
Control =
LeftArrow = 0
RightArrow = 0
ClearthisEntry = 0
return

Paste:
WinHide, Compact Gui
WinHide, Expanded Gui
Sleep 250
IniRead,GuiSize,config.ini,Gui,Size
if GuiSize = Expanded
 GuiControlGet, PasteValue ,, MyExpandedEdit
else
 GuiControlGet, PasteValue ,, MyCompactEdit
                                        ;if FileSize > 35 ;I may be able to get the Clipboard text file size and then do something to prevent lag
                                        ;FileRead,PasteValue,%A_ScriptDir%\ClipboardHistory\Clip%LastClipboardContentsPos%.txt
sleep 100
SaveWindowsClipboard = %ClipboardAll%
Clipboard = %PasteValue%
send, {shift down}{insert}{shift up}
Clipboard = %SaveWindowsClipboard%
return

Close:
WinHide, Compact Gui
WinHide, Expanded Gui
return

Expand:
GuiControlGet, PasteValue ,, MyCompactEdit
GuiControl,2:,Edit1,%PasteValue%
IniWrite,Expanded,config.ini,Gui,Size
GuiSize = Expanded
WinHide, Compact Gui
WinShow, Expanded Gui
ControlFocus,Static1,A  ;Need this to take focus away from edit box
return

Compact:
GuiControlGet, PasteValue ,, MyExpandedEdit
GuiControl,1:,Edit1,%PasteValue%
IniWrite,Compact,config.ini,Gui,Size
GuiSize = Compact
WinHide, Expanded Gui
iniread, LastClipboardContentsPos,config.ini,LastClipboardContentsPos,Pos,1
FileReadLine,IsLineOneBlank,%a_scriptdir%\ClipboardHistory\Clip%LastClipboardContentsPos%.txt,1

if ErrorLevel = 0
 {
  if IsLineOneBlank =
   WinMove,ahk_id %SGID%, , , , ,120 ;make gui bigger to display message about line 1 being blank
 }
WinShow, Compact Gui
ControlFocus,Static1,A  ;Need this to take focus away from edit box
return

ClearThisEntry:
GuiControlGet,Value,,ClipTextNumber1
IfInString,Value,P
 {
  MsgBox,4160,Info, A preset is being shown. To clear a present choose "Edit Presets"
  return
 }
MsgBox,4164,Confirm,Do you want to clear this entry?
IfMsgBox,Yes
 {
  iniread, LastClipboardContentsPos,config.ini,LastClipboardContentsPos,Pos,1
  FileDelete,%a_scriptdir%\ClipboardHistory\Clip%LastClipboardContentsPos%.txt
  GuiControl,1:,Edit1,
  GuiControl,2:,Edit1,
  GuiControl, 2:, ClipTextNumber1 ,    
  ClearthisEntry = 1 ;don't need a return here because I want it to fall thru to ReNumberClipboardTextFilesIfAnyAreMissing:
 }

ReNumberClipboardTextFilesIfAnyAreMissing: 
iniread, LastClipboardContentsPos,config.ini,LastClipboardContentsPos,Pos,1
FileRead,OriginalClipboardContentsForDisplay,%A_ScriptDir%\ClipboardHistory\Clip%LastClipboardContentsPos%.txt
IniRead,NumberOfClipBoards,config.ini,Settings,Count,100
ValidClips = 0
Loop %NumberOfClipBoards% ;see if the last clipboard to be displayed is missing and if so, then use the most recent clipboard that is not missing
 {
  FileRead,IsClipMissing,%a_scriptdir%\ClipboardHistory\clip%A_index%.txt
  if IsClipMissing = 
   {
    if a_index = %LastClipboardContentsPos% 
     { 
      LastClipBoardContentsPos := ValidClips
      IniWrite, %LastClipboardContentsPos%,config.ini,LastClipboardContentsPos,Pos
      IsClipMissing = 1
      break
     }
   }
  else
   ValidClips++
 }
Loop %NumberOfClipBoards%
 FileRead,var%a_index%,%a_scriptdir%\ClipboardHistory\clip%a_index%.txt
FileDelete,%a_scriptdir%\ClipboardHistory\Clip*.txt
ClipCounter = 0
Loop %NumberOfClipboards%
 {
  AppendVar := var%A_index%
  if AppendVar <>
   {
    ClipCounter++
    FileAppend,%AppendVar%,%A_ScriptDir%\ClipboardHistory\Clip%ClipCounter%.txt
   }
 }

if IsClipMissing <> 1
 {
  Loop %NumberOfClipBoards%
   {
    FileRead,FindOriginalClipboardContentsForDisplay,%a_scriptdir%\ClipboardHistory\clip%A_index%.txt
    if FindOriginalClipboardContentsForDisplay = %OriginalClipboardContentsForDisplay%
     {
      LastClipboardContentsPos = %a_index%
      IniWrite, %LastClipboardContentsPos%,config.ini,LastClipboardContentsPos,Pos
      break
     }
    else
     LastClipboardContentsPos = 1
   }
 }
NumberOfSavedClipboards = %ClipCounter%
return

ClearAllEntries:
MsgBox,4164,Confirm,Do you want to clear all clipboard entries?
IfMsgBox,Yes
 {
  FileDelete,%a_scriptdir%\ClipboardHistory\Clip*.txt
  GuiControl,1:,Edit1,
  GuiControl,2:,Edit1,
  GuiControl, 2:, ClipTextNumber1 , 0
  IniWrite, 0,config.ini,LastClipboardContentsPos,Pos
  NumberOfSavedClipboards = 0
 }
return

ViewAllEntries:
var =
Loop,%a_scriptdir%\Clipboardhistory\*.txt
 var++
if var =
 {
  WinSet,AlwaysOnTop,off,ahk_id %EGID%
  WinSet,AlwaysOnTop,off,ahk_id %SGID%
  MsgBox,4160,Clipboard Manager, There are no saved Clipboards
  WinSet,AlwaysOnTop,on,ahk_id %EGID%
  WinSet,AlwaysOnTop,on,ahk_id %SGID%
  return
 }
Gui 6: destroy
WinHide, Expanded Gui
gosub ReNumberClipboardTextFilesIfAnyAreMissing
Gui 6:  +Resize +0x20000 ; WS_VSCROLL | WS_HSCROLL
sysget,MWA,MonitorWorkArea
Gui 6: Add, Picture, x2 y0 w80 h80 , %A_ScriptDir%\images\Clipboard.png
Gui 6: font,s12
Gui 6: Add, Text,   x82 y10  w750 h80 , You can edit and save your clipboard entries here.`nTo delete a clipboard entry just clear and save and it will be deleted when you close the window.
Gui 6: font,s10
yPos=100
loop %NumberOfSavedClipboards%
 {
  FileRead,Contents,%a_scriptdir%\ClipboardHistory\Clip%a_index%.txt
  ThisClip = %A_Index%
  Loop
   {
    FileReadLine,TempVar,%a_scriptdir%\ClipboardHistory\Clip%ThisClip%.txt,%a_index%
    if ErrorLevel
        break
    TotalLines = %a_index%
   }
  if TotalLines > 9
   TotalLines = 10
  Gui 6: Add, Button, x20 y+25 w60  h25, Clip # %a_index%
  Gui 6: Add, Button, x80 yp w60  h25  GgetCorrectClipNumber , Paste
  Gui 6: Add, Button, x140 yp w60  h25  GgetCorrectClipNumber , Clear
  Gui 6: Add, Button, x200 yp w60  h25  GgetCorrectClipNumber , Save
  Gui 6: Add, Button, x260 yp w60  h25  GgetCorrectClipNumber , Restore
  Gui 6: Add, Button, x320 yp w60  h25  GgetCorrectClipNumber , Expand

  Gui 6: Add, Edit,   x20  y+0 w900 r%TotalLines% Multi, %Contents%
}
Guih := ( MWABottom-40)
Guiw := 950 ;need to keep this, it is being used for the label vaeCollapse
Gui 6: Show, Hide w950 h%Guih%, View All Entries
Gui 6: color, c7c4f4 , e9e9e9
GuiControlGet, var, 6:Pos,edit%NumberOfSavedClipboards% ;returns varW varH varX varY
guih := ( vary + varh + 20  )
if ( guih > MWABottom )
 guih := ( MWABottom-40 )
if guih =
 guih = 500
Gui 6: Show, w950 h%Guih%, View All Entries
Return

GetCorrectClipNumber:
MouseGetPos,,,,OutControl
ControlGetText,GotoLabel, %OutControl%
StringTrimLeft,EditBoxNumber,OutControl,6

GetButtonText:
EditBoxNumber--
ControlGetText,ButtonText, Button%EditBoxNumber%
IfNotInString,ButtonText,Clip
 goto GetButtonText
StringTrimLeft,EditBoxNumber,ButtonText,7
goto vae%GotoLabel%

vaePaste: ;(vae is View All Entries)
WinHide, View All Entries
GuiControlGet, PasteValue ,6:, Edit%EditBoxNumber%
Gui 6: destroy
SaveWindowsClipboard = %ClipboardAll%
Clipboard = %PasteValue%
send, {shift down}{insert}{shift up}
Clipboard = %SaveWindowsClipboard%
return

vaeClear:
GuiControl,6:,Edit%EditBoxNumber%
return

vaeSave:
GuiControlGet, PasteValue ,6:, Edit%EditBoxNumber%
FileCopy,%A_ScriptDir%\ClipboardHistory\Clip%EditBoxNumber%.txt,%A_ScriptDir%\ClipboardHistory\Restore-Clip%EditBoxNumber%.txt,1
FileDelete,%A_ScriptDir%\ClipboardHistory\Clip%EditBoxNumber%.txt
if PasteValue <>
 FileAppend,%PasteValue%,%A_ScriptDir%\ClipboardHistory\Clip%EditBoxNumber%.txt
MsgBox,4160,Saved,Clipboard # %EditBoxNumber% has been saved.
return

vaeRestore:
IfNotExist,%A_ScriptDir%\ClipboardHistory\Restore-Clip%EditBoxNumber%.txt
  FileRead,Contents,%a_scriptdir%\ClipboardHistory\Clip%EditBoxNumber%.txt
else
 FileRead,Contents,%A_ScriptDir%\ClipboardHistory\Restore-Clip%EditBoxNumber%.txt
GuiControl,6:,Edit%EditBoxNumber%,%Contents%
return

vaeCollapse:
GuiControl, 6:text, %OutControl% , Expand                                      ;Change button label to Expand
ControlGetPos,,,,CurrentEditBoxh,Edit%EditBoxNumber%, View All Entries ;get current size
OldEditBoxh := % OldEditBoxh%EditBoxNumber% 
GuiControl, 6:Move, Edit%EditBoxNumber%, h%OldEditBoxh% ;change to collapsed size

;------Begin - Determine which control to start with when moving controls
WinGet, ControlList, ControlList, View All Entries                             
Loop, Parse, ControlList , `n, `r
{
 if a_loopfield = %outcontrol%
  {
  StartHere = %A_Index%
  break
  }
}
StartHere++
;------End - Determine which control to start with when moving controls

GuiControl, 6:Move, Edit%EditBoxNumber%, h%OldEditBoxh% ;change to collapsed size

Loop, Parse, ControlList , `n, `r
 {
  if (a_index > StartHere ) 
   {  
    ControlGetPos,,y,,h,%A_LoopField%,View All Entries
    y := ( y - CurrentEditBoxh + OldEditBoxh )
    Control,hide,,%A_LoopField%,View All Entries
    ControlMove,%a_loopfield%,,%y%,,%h%,View All Entries
    Control,show,,%A_LoopField%,View All Entries
   }
}
UpdateScrollBars(6, Guiw, Guih)
return

vaeExpand:
ControlGetPos,,,,OldEditBoxh%EditBoxNumber%,Edit%EditBoxNumber%, View All Entries
OldEditBoxh :=  % OldEditBoxh%EditBoxNumber%
GuiControlGet, TempText ,6:, Edit%EditBoxNumber%
Loop, Parse, TempText , `n, `r
 TotalLines = %a_index%
Gui 99: font,s10
Gui 99: Add, edit, r%TotalLines%, 
Gui 99: Show, Hide 
GuiControlGet, NewEditBox, 99:Pos,edit1 ;returns varW varH varX varY
Gui 99: Destroy 
WinGet, ControlList, ControlList, View All Entries
Loop, Parse, ControlList , `n, `r
{
 if a_loopfield = %outcontrol%
  {
  StartHere = %A_Index%
  break
  }
}
StartHere++
Loop, Parse, ControlList , `n, `r
 {
  if (a_index > StartHere ) 
   {  
    ControlGetPos,,y,,h,%A_LoopField%,View All Entries
    y := ( y + NewEditBoxh - OldEditBoxh)
    Control,hide,,%A_LoopField%,View All Entries
    ControlMove,%a_loopfield%,,%y%,,%h%,View All Entries
    Control,show,,%A_LoopField%,View All Entries
   }
}
GuiControl, 6:Move, Edit%EditBoxNumber%, h%NewEditBoxh%
UpdateScrollBars(6, 960, Guih)
If NewEditBoxh <> %OldEditBoxh%
 GuiControl, 6:text, %OutControl% , Collapse
return

7GuiClose:
Gui 7: destroy
WinShow, View All Entries
return

6GuiClose:
Gui 6: destroy
WinShow, Expanded Gui
FileDelete,%A_ScriptDir%\ClipboardHistory\Restore-Clip*.txt
return
loop %NumberOfSavedClipBoards%
 {
  FileRead,Contents,%a_scriptdir%\ClipboardHistory\Clip%a_index%.txt
  if Contents = 
   FileDelete,%a_scriptdir%\ClipboardHistory\Clip%a_index%.txt
 }
gosub ReNumberClipboardTextFilesIfAnyAreMissing
return

Settings:
WinHide, Compact Gui
WinHide, Expanded Gui
IfWinExist, ahk_id %SettingsID%  1
 {
  WinRestore, ahk_id %SettingsID%
  return
 }
WinHide, Compact Gui
WinHide, Expanded Gui
IniRead,Value1,config.ini,Settings,ShowOnClipboardChange,0
IniRead,Value2,config.ini,Settings,StartWithWindows,0
IniRead,Value3,config.ini,settings,TrayIcon,1
IniRead,NumberOfClipBoards,config.ini,Settings,Count,100
Gui 5: Add, CheckBox, x22 y20 w270 h30 vShowOnClipboardChange checked%Value1%, Show MyClipboardManager on clipboard change
Gui 5: Add, CheckBox, x22 y50 w270 h30 vStartWithWindows checked%Value2%, Start MyClipboardManager when windows starts
Gui 5: Add, CheckBox, x22 y80 w270 h30 vTrayIcon checked%Value3%, Show Tray Icon in System Tray Area
Gui 5: Add, Text, x22 y120 w120 h20 , Keep history of the last
Gui 5: Add, Edit, x142 y118 w30 h20 vKeepHowMany , %NumberOfClipboards%
Gui 5: Add, Text, x187 y120 w130 h20 , clipboard changes
Gui 5: Add, Button, x47 y160 w100 gSaveSettings, Save
Gui 5: Add, Button, x157 y160 w100,Cancel
Gui 5: Show, h206 w321, Settings
WinGet,SettingsID,ID,Settings
GroupAdd, GroupForUpDownControl, Settings
Gui 5: color, c7c4f4 , e9e9e9
ControlFocus,edit1,Settings
Return

SaveSettings:
Gui 5: submit, nohide
if ShowOnClipboardChange = 1
 IniWrite,1,config.ini,Settings,ShowOnClipboardChange
else
 IniWrite,0,config.ini,Settings,ShowOnClipboardChange

if StartWithWindows = 1
 {
 IniWrite,1,config.ini,Settings,StartWithWindows
 FileCreateShortcut, %A_ScriptDir%\%A_ScriptName%, %A_Startup%\%A_ScriptName%.lnk , %A_ScriptDir% , , MyClipboardManager, %A_ScriptDir%\images\Clipboard.ico
 }
else
 {
  IniWrite,0,config.ini,Settings,StartWithWindows
  FileDelete,%A_Startup%\%A_ScriptName%.lnk
 }
GuiControlGet, KeepHowMany,,KeepHowMany
GuiControlGet, TrayIcon,,TrayIcon
if TrayIcon = 1
 Menu, TRAY, Icon, ;%a_scriptdir%\images\Clipboard.ico
else
  Menu, Tray, NoIcon
IniWrite,%TrayIcon%,config.ini,Settings,TrayIcon
Gui 5: destroy
;Determine if any clips need to be deleted due to KeepHowMany option. Also, determine if the chipboard being shown has been deleted and show correct clipboard
gosub ReNumberClipboardTextFilesIfAnyAreMissing
IniRead,NumberOfClipBoards,config.ini,Settings,Count,100
IniRead,CurrentClipboardContentsPos,Config.ini,LastClipboardContentsPos,Pos, 1
IniRead,LastClipboardPos,Config.ini,LastClipboard,Pos, 1
If KeepHowMany = %NumberOfClipboards%
 {
  gosub, Showgui
  return
 }
IniWrite,%KeepHowMany%,Config.ini,Settings,Count
GuiControl, 2:, ClipTextNumber2 ,%KeepHowMany%
Loop %a_scriptdir%\ClipboardHistory\Clip*.txt
 NumberOfSavedClipboards = %A_index%
FileRead,ClipContentsA,%A_ScriptDir%\ClipboardHistory\Clip%CurrentClipboardContentsPos%.txt
if NumberOfClipboards > %KeepHowMany%
 {
  Loop %KeepHowMany%
   {
    LastClipboardPos--
    if LastClipboardPos < 1
     LastClipboardPos := NumberOfSavedClipboards
   }
  loop %KeepHowMany% ;this reads the most KeepHowMany recent clip.txt
   {
    LastClipboardPos++
    if LastClipboardPos > %NumberOfSavedClipboards%
     LastClipboardPos = 1
    FileRead,var%a_index%,%A_ScriptDir%\ClipboardHistory\Clip%LastClipboardPos%.txt
   }
  FileDelete,%A_ScriptDir%\ClipboardHistory\Clip*.txt
  Loop %KeepHowMany%
   {
    AppendVar := var%A_index%
    if AppendVar <>
     {
      FileAppend,%AppendVar%,%A_ScriptDir%\ClipboardHistory\Clip%A_Index%.txt
      }
   }
  IniRead,LastClipboardPos,Config.ini,LastClipboard,Pos, 1
  if LastClipboardPos > %KeepHowMany%
   LastClipboardPos := KeepHowMany
  IniWrite,%LastClipboardPos%,Config.ini,LastClipboard,Pos
  Loop %KeepHowMany%
   {
    FileRead,ClipContentsB,%A_ScriptDir%\ClipboardHistory\Clip%a_index%.txt
    If ClipContentsB = %ClipContentsA%
     {
      LastClipboardContentsPos := A_Index
      break
     }
    else
     LastClipboardContentsPos := KeepHowMany
   }
  IniWrite,%LastClipboardContentsPos%,Config.ini,LastClipboardContentsPos,Pos
  ;read all these again to make sure the display matches the config.ini
  IniRead,NumberOfSavedClipBoards,config.ini,Settings,Count,10
  IniRead,LastClipboardContentsPos,Config.ini,LastClipboardContentsPos,Pos, 1
  IniRead,LastClipboardPos,Config.ini,LastClipboard,Pos, 1
  FileRead,Contents, %A_ScriptDir%\ClipboardHistory\Clip%LastClipboardContentsPos%.txt  
  
  GuiControl,1:,Edit1, %Contents%
  GuiControl,2:,Edit1, %Contents%
  GuiControl,2:,ClipTextNumber1 , %LastClipboardContentsPos%/%NumberOfSavedClipBoards%
  GuiControl,2:,ClipTextNumber2 , %NumberOfSavedClipBoards%  ;since KeepHowMany was more then we already saved then NumberOfClipboards and NumberOfSavedClipboards will be the same15
 }
 If NumberOfClipboards < KeepHowMany 
  GuiControl, 2:, ClipTextNumber2 , %KeepHowMany%
gosub, ShowGui
return

5GuiClose:
5ButtonCancel:
Gui 5: destroy
gosub ShowGui
return

SaveAsPreset:
IfWinExist,ahk_id %SaveAsPresetID%
 {
  WinRestore,ahk_id %SaveAsPresetID%
  return
 }
GuiControlGet, Contents ,, MyExpandedEdit
if Contents =
 {
  MsgBox,4144,Nothing to do!, There is no clipboard data available to "Save As Present"
  return
 }
WinHide, Compact Gui
WinHide, Expanded Gui

Loop 10
 FileRead,Contents%A_Index%,%a_scriptdir%\Presets\Preset%A_Index%.txt

Gui 3: Add, GroupBox, x12 y102 w1050 h425 , 

Gui 3: Add, Radio, x22 y123 w80 h30 gUpdateEditBox vSelectedRadioButton  , Preset 1
yPos = 163
Loop 10
{
 if A_index <> 1
  {
   Gui 3: Add, Radio, x22 y%yPos% w80 h30 gUpdateEditBox , Preset %A_index%
   yPos := yPos+40
  }
}
yPos = 120
Loop 10
 {
  Content := ( Contents%A_Index%)
  Gui 3: Add, Edit, x122 y%yPos% w930 h33 vPresetEdit%A_Index% ReadOnly , %Content%
  yPos := yPos+40
 }

Gui 3: Add, Button, x22 y540 w80 h30 gSaveClipBoardToPreset , Save
Gui 3: Add, Button, x122 y540 w80 h30 gCancelSavePreset, Cancel
Gui 3: font,s12
Gui 3: Add, Text, x122 y20 w1000 h30 , If needed you can edit and then select one of the following presets to save this Clipboard data to.
Gui 3: font ;,s8
Gui 3: Add, Edit, x122 y50 w930 h33 , %Contents% ; I put these down here to keep the preset edit boxes properly labeled edit 1 thru 10
Gui 3: Add, Picture,x15 y5 w100 h-1, images\Clipboard.png
Gui 3: Show, x127 y87 h581 w1078, Save Clipboard as Preset
WinGet,SaveAsPresetID,ID,Save Clipboard as Preset
Gui 3: color, c7c4f4 , e9e9e9
Return

UpdateEditBox:
Gui 3: submit, nohide
GuiControlGet, Contents ,, edit11
loop 10
 FileRead,Contents%a_index%,%a_scriptdir%\Presets\Preset%A_Index%.txt
GuiControl,3:,Edit%SelectedRadioButton%,%Contents%
Counter = 0
Loop 10 ;each time a different radio button is selected the original contents are updated
 {
  if SelectedRadioButton <> %A_index%
   {
    UpdatedContent := Contents%A_Index%
    GuiControl,3:,Edit%A_index%,%UpdatedContent%
   }
 }
return

SaveClipBoardToPreset:
Gui 3: submit, nohide
GuiControl,3:,Edit11,%Contents%
FileDelete,%a_scriptdir%\Presets\Preset%SelectedRadioButton%.txt
FileAppend,%Contents%,%a_scriptdir%\Presets\Preset%SelectedRadioButton%.txt
Gui 3: destroy
ControlFocus,Button6, Expanded Gui ;Need this to take focus away from edit box
WinShow, Expanded Gui
return

CancelSavePreset:
3GuiClose:
Gui 3: destroy
ControlFocus,Button6, Expanded Gui ;Need this to take focus away from edit box
WinShow, Expanded Gui
return

EditPresets:
WinHide, Compact Gui
WinHide, Expanded Gui
IfWinExist, ahk_id %EditPresetsID%
 {
  WinRestore, ahk_id %EditPresetsID%
  return
 }
loop 10
 FileRead,Contents%a_index%,%a_scriptdir%\Presets\Preset%a_index%.txt
yPos = 133
Loop 10
 {
  Gui 4: Add, Text, x22 y%yPos% w80 h30 , Preset %a_index%
  yPos := yPos+40
 }
yPos = 120
loop 10
 {
  contents := (contents%a_index%)
  Gui 4: Add, Edit, x122 y%yPos% w830 h33 vEditPreset%a_index%  ,%Contents%
  yPos := yPos+40
 }
yPos = 120
loop 10
 {
  Gui 4: Add, Button, x972 y%yPos% w80 h30 gClearPreset, Clear
  YPos := YPos+40
 }
Gui 4: Add, Button, x22 y530 w80 h30 gSaveEditPreset , Save
Gui 4: Add, Button, x122 y530 w80 h30 gCancelEditPreset, Cancel
Gui 4: Add, Button, x222 y530 w80 h30 gClearAllPresets, Clear All
Gui 4: font,s12
Gui 4: Add, Text, x122 y50 w430 h30 , Edit the presets below then click Save
Gui 4: Add, Picture,x15 y5 w100 h-1, images\Clipboard.png
Gui 4: Show, x127 y87 h575 w1078, Edit Presets
WinGet,EditPresetsID,ID,Edit Presets
Gui 4: color, c7c4f4 , e9e9e9
ControlFocus,Button2, Edit Presets
Return

ClearAllPresets:
Loop 10
 GuiControl,4:,Edit%A_index%,
return

ClearPreset:
MouseGetPos,,,,OutControl
StringTrimLeft,OutControl,OutControl,6
GuiControl,4:,Edit%OutControl%,
return

SaveEditPreset:
loop 10
 GuiControlGet, EditPreset%a_index%
FileDelete,%a_scriptdir%\Presets\Preset*.txt
loop 10
 {
  if EditPreset%a_index% <>
  {
   AppendPreset := EditPreset%a_index%
   FileAppend,%AppendPreset%,%a_scriptdir%\Presets\Preset%A_index%.txt
  }
 }
4GuiClose:
CancelEditPreset:
Gui 4: destroy
gosub, ShowGui
return

Preset:
MouseGetPos,,,,OutControl
ControlGetText,ButtonText, %OutControl%
StringTrimLeft,ControlNumber,ButtonText,6
FileRead,Contents,%a_scriptdir%\Presets\Preset%ControlNumber%.txt
if Contents =
 {
  MsgBox,4160,%A_ScriptName%,Preset %ControlNumber% is blank.
  return
 }
GuiControl,1:,Edit1,%Contents%
GuiControl,2:,Edit1,%Contents%
GuiControl, 2:, ClipTextNumber1 , P%ControlNumber%
return
~LButton:: ;move the borderless window by dragging
CoordMode, Mouse
MouseGetPos, MouseStartX, MouseStartY, MouseWin,MouseControl
IfInString,MouseControl,button
 {
  EditingEditbox = 0
  return
 }
IfInString,MouseControl,static
 {
  EditingEditbox = 0
  return
 }
IfInString,MouseControl,Edit1
 {
  EditingEditbox = 1
  return
 }
EditingEditbox = 0
if MouseWin = %SGID%
 {
  
  SetTimer, WatchMouse, 10
  Return
  WatchMouse:
  CoordMode, Mouse
  MouseGetPos, MouseX, MouseY 
  DeltaX = %MouseX%
  DeltaX -= %MouseStartX%
  DeltaY = %MouseY%
  DeltaY -= %MouseStartY%
  MouseStartX = %MouseX%  
  MouseStartY = %MouseY%
  WinGetPos, CMX, CMY,,, ahk_id %SGID%
  CMX += %DeltaX%
  CMY += %DeltaY%
  SetWinDelay, -1   
  WinMove, ahk_id %SGID%,, %CMX%, %CMY%
  GetKeyState, LButtonState, LButton, P
  if LButtonState = U  
   {
    IniWrite, %CMX%,config.ini,GuiPosition,CompactGuiXpos
    IniWrite, %CMY%,config.ini,GuiPosition,CompactGuiYpos
    SetTimer, WatchMouse, off
    Return
   } 
  Return
 }
if MouseWin = %EGID%
 {
  SetTimer, WatchMouse1, 10
  Return
  WatchMouse1:
  CoordMode, Mouse
  MouseGetPos, MouseX, MouseY 
  DeltaX = %MouseX%
  DeltaX -= %MouseStartX%
  DeltaY = %MouseY%
  DeltaY -= %MouseStartY%
  MouseStartX = %MouseX%  
  MouseStartY = %MouseY%
  WinGetPos, CMX, CMY,,, ahk_id %EGID%
  CMX += %DeltaX%
  CMY += %DeltaY%
  SetWinDelay, -1   
  WinMove, ahk_id %EGID%,, %CMX%, %CMY%
  GetKeyState, LButtonState, LButton, P
  if LButtonState = U  
   {
    IniWrite, %CMX%,config.ini,GuiPosition,ExpandedGuiXpos
    IniWrite, %CMY%,config.ini,GuiPosition,ExpandedGuiYpos
    SetTimer, WatchMouse1, off
    Return
   } 
  Return
 }

CoordMode,Mouse,Window
MouseGetPos,x,y
return 

ShowGui:
IniRead,GuiSize,config.ini,Gui,Size,Expanded
if GuiSize = Expanded
 {
  ControlFocus,Button6, Expanded Gui ;Need this to take focus away from edit box
  WinShow, Expanded Gui
  WinActivate,Expanded Gui
 }
else
 {
  ControlFocus,Static1,A  ;Need this to take focus away from edit box
  WinShow, Compact Gui
  WinActivate, Compact Gui
 }
Return
CreatePictures&Icon:
ifnotexist, images\MyClipboardManager-Left.png
 {
  left =
(join 
89504E470D0A1A0A0000000D4948445200000040000000400806000000AA6971DE0000000467414D410000AFC837058AE9000000097048597300000EC300000EC301C76FA8640000001974455874536F6674776172650041646F626520496D616765526561647971C9653C00000A1249444154785EED5B0D909555197EEFCFBA0BCBCFEAC242C9CF2065598D8D65EA002A45A08BBA930D4861D41603868316186A8618343519C558302A938A613AFEA0D612586312895AD3A415D55853AEB85B2CAC01EEBA0B7B77F7DEDBFBBEE7BCE7E7BBF7AE772F7BEFFD66966FE7CC77EEB9E73BDF799EF7FF5C88A4D36918CE5774388327ECA70838A501C39C81616F0211370AFCEA9536471F6C74C88C137AC4FBC29F25EBCEDFF0F325B8E8C5D8F6ED5ED7F05031156EFE86A6412FEF6B40049F370D3B11D522D4CC1FBD434FE2EFE59DA6C303F40C825F8ADDEDD896D11D37486484EA0A9880C780CB86478C90A19008510E31D8AD5FFF33027F1F8DDE70E58705F4F250A1C7CD7804B0A4339A08D921C72880A2C2234281DF2AE0BFDA701ECC39778AE09EE5A84C28B8C86D02667B8E193039AEA4950928135157FDFAA709FCF2288EAD6AF808B4B6F7C01BED5D01B0BEB99493095F031C4B7735C1F805ADF2EA3B5733C8122250FFCDA714F86804567FEAA370A03D01AF1FEE86E38964168CE12021A001D6F169510B64458DA0162D7034E2F23B9E247B67F06BAE3E1F5E6B4B40CB9BDD90F6D9536BB8DA554EF1077D40C65E74149068A0945FDBBD5181085C7EC70E02BF341E8BC22D9FBE00FE793001AD47087CD492E62EEE91505E060676828E8B53AAE084464DC665EB9EB0E0175C08AF22F883474F68F0340949B0B1526B94C7465919183813646FEF44868014E7DDFEF83691FCD7175E047F6B4D40DBB11E064F4E90C14BF008BAC1909842C00992B4A4B9A98FB65B27299AB7F63102DF58591183DB3F3B03F6B724E07047C2517B4D42C00778613004A6905F2618C803E7AE7DD480BF6DD14C78F9F504B4BFDDA78CC2485E9205ED07DE310E94272AE40E830C475FDA14489FE77EC3825FB7F86278E540028E74F5ABD9ACF29A047680A20541C76FC1FA51A1F4EEC02B86F6FCFD58EE1DE0D1D99CDB1EA1BC7E09A9FDFA6B2F85975E3B0147BB7A219D4A019DACA5D3744F5107C7B0E9CF0B674C829BB73D577A74B9DFD8895FEDC3B662C028E0DA2B827F98C08F382D0EDFFAFC6CF87D732F741CC70407A52CCE8E244E4D6983CE1051239A0F7587093CED650CB62BB0DDE369C0DE573BBC8DAAF3D2347CE2D69F12F8C5D55515B0FE7397C20BFF4A4047771FA448D2D8522C6991383EC41AA1C7B01F8FA6E1DCA935306DC2489EC71A827FAC367CA975F8CE1F8B77505B81B9CA9409A3E0331B7F496FEAF40878FE1FA419B225B5B1D9373FF428761611F80D4B66C38BFFEED3E005B44B028E19D52733D0E6904E729F8862F04C02CDD52683EF21320D11BA5F0CB5211FBDF8E3EF855BB7BFC804E434018AE3027ECCC84AF8CE173F092F35A7E0ED1E0481E9AE52777B5640F36DFDE03843276DE6DCC0BD8CC3A425D577A58E051E01B409CAE52F59F39328B62748F204FEDB8D73E07708FE442FA6385165E7C6DB3B29B1CD143514933E486490CA32085560971A7EF03C00C1CFBAE94122E5316C0B6A4655C17797CE853FB400F4F42378B41F224091E0873DFACC49AFAE12D5DD012E0727DE6952B634D19499C5B0808C353D0D98B97A5B05CED821E0372EBB0CFED81A85DEBE08C4103C3726008131092E4891AAAE175CC0620638051F359719764DC3995B0A060C0191862D02FEEADA312360D3F27A78B935067D29041FC7168929F031EA6B1238048A5A3B55A20E83120EC5B85551240459C26CC2E59A4069CC810940F0D55AF20DE3C756C3A62FCF873FB5C5A11FC1C711742C86E00D70943C8AD13A3DEDB8B4EEBB66A03C9A7594AE87CB560688344A035DE95714C153524036DF505743E0EB617FDB69904C6BB5270258E24AEAEC281D8F2F12F537AD24ED9E18AAD70D04AD94B0AD7111E98F60BB62E2E9A3E087D75F09FB0F57A2E49119963C82A546C0A511780E83DAE1B9369D4D83B3843EDF090489292D11440083BFF7C6ABE02F872A302121D0247592B42A666C7C17B9DABB926AB005DD57D0B367F3FEA5707999EF88C0559BD3674DAC81876F6980D60EB47B4CEF31998324666949ECF427F18EAD0F5B3FAA067DEE4BF6631FBF4B25792CA5E7D23D85CF2431F393BEBAFB8DD6A35499E79A3E3E4369358EF17C9D4AD367498F695F2AF52620EAAE52707DA751778C536C3DA6FBA490D75C321DD63CF8022DC299E0AEE6436FC1B57736C1BB46F7A3AAABC5F8AD19BF80E971213257CA9E772AEFBCA43C0AC03F8C2C1212BEB0B109DE3DBA0F07556E2E5250758B92842E63744F49425D0226077A6F386F868A4E4B34DDB4926A554342E3F777C2993549D4045245AA591419AA7E51F0B9A611D80E16AF88CB36C1E5CBEBBB8494961C0EBD1924A0264C198B24444413C42EC93FA86A4E9A95BE2B2CAB2BA5853378853199A04342D381F60E68FCC14E98568B3F6B1009ECC408BC5F025BB3D0DE076F38C3BA0FF121A6FEB71BCC56F2BBC6347828853DE1D5029A84C5B854D31BED9DF0A54D3B61FA382A7208187966EDA5D93F887B557739D03087194134DA73B3F118B50838C1AC365418B07C9FCAF85D2048C2B2BB7E01674FA0FC9F0E7A14010C56C29339CD718C5A80C8C18663072A843986C31C641BCC17C2C9CDCBFAC3489084E53FDA0D1F981803AC89741CB6475A260EB39658600A93A319E6084C4B5D34C8AA837DBA848E23E72F43AE4F684173B86ECB33F0A14971AC0809979C0207BCB7CD3A18BC1B2AAC67D0898D07BC1CD6AFF8F6CE04B32913164B5538CEC5D294F16360F38A79F0E7961390E84D62C6674D42658EEA4C903343F20B3A33C4BC12269F3112CEACA5A57424D1678772406A42AD0EB9C29E385AD627E6D4126BB4CCB1A2CCEFF54AFA313A149D5C570DD77CEF195AD23F14CD654D2E099391842D2BE6E20F22C7A18748D07982497D3570268308C254776ADD0858BB7DCFC9196B719EDE35F08FA362954D2B7BB0BB005B53EB9B9DB0F2EE67E1BCA92380D854A6AE2382EECBD1B7726E69987486927C882E3AFEDE856DC53B9A80BB69E7D4A861D2B851B0F93A3C2F6CEE4273E84795A728618B9C140E50DE4063B3CEA985C6BB76F352E85B8A56EFE2FE06CD715E1A20ABE2E6E91750D284A7FFF3BF2EB861EBB370FEB46AA888C76C2EC0CAE0FCF0A16B8841EFAC440F0C8A002D4122816A0726E1C6ADBF868F9D4524708C34E5A98440CA0CC37C0D9A802009FF3DD2055FD9FA1C5C307D345456447446A81CA00A85920B8493868208C820E16817ACFAF11E24612C93A04B47A72A08AF16144C804302FB04D284D5F7FF062E7C4F0D54C6313AE8145714219CF21F82FF30818E9132604BC2037BE1A2F79DAECD81ACC01EA184918493D200273A18120EA226ACBA6F2FCC787F2D54913978D55FF828181202B43908093B0E1DEB4673F82DCC38671C54A13950940CEB3564043824508864126EBAFF7998F9C1F150573332ACF887FE3F4D699FA04878AB1BBEF6C03EE8ECA64C9AAFBF868D8921D580804F30245C7FEF5EF98A0FE3C3740DAA162864E3989FD33FB4A028B103B56361216BE4FB4C21B5804740210BE4B9B93A9CD79EE7DC924E2BBA0694144D012F2B8A0F28601F657BE4140165A33E242F1EF61AF07F5C1808DC69075F820000000049454E44AE426082
)
 WriteFile("images\MyClipboardManager-Left.png",left)
 left =
}
ifnotexist, images\MyClipboardManager-Right.png
 {
  right =
(join 
89504E470D0A1A0A0000000D4948445200000040000000400806000000AA6971DE0000000467414D410000AFC837058AE90000001974455874536F6674776172650041646F626520496D616765526561647971C9653C000008F14944415478DAEC5B7B7055C51DFE76CFB9B9218FA24643C02660EC38D3998AF5318E757C60AB7FA042B5C5C2806D8DD209756C7550ABD38EE0ABD88A828AC5364C6C5A463A51A674A89587E0501546ADD5A9D387768A8CE09397014C0826F7ACFBDBB3BB67CFB9F7264148EE992687ECD93D7B1E39BF6FBFDFF3042684C070DE3886F93602C00800C37C6398B224ADEF562BDBCEC178B0587D831DFB47FA80415995A98F3E25BB69B2AD94BFEBAA61A50252F8A5247C4DF5283A9C4660C8C687930D388F764BE74C42DD3195D04C681F2C10D208C0A9B4FB4265391EB8F6FC410721B55E6067471736FF6B171EBCEE02D41D3B7820A41680DE1CD0DD1B60CB7F7663D17517BA20AC3C9A20A4370E60E1AEBB4760CB9B7BB078F6248CABA9A2C92B8F26083CBDF24B0418A31F1C9220BCF4D6C75874ED249C78944148350348780B82548797FFD721D5E1A2240899FFD35098691E10125C01414C7865EB3E2CFEC1D771E2711684F6230121BD2AC02C05C2B17C5566413880879BBFE132E1738390EA64885BE1433530A0F4F40AFCEDED4E3CD27C31BE78FC9181C0D3AC005AEA5011D4D805218757B7756249F3252E08876D13281BAC97FD63B29D4F01585A0068BBE9526C7E732F380FA94FBD6D1203352FDBA88C87B31A2BF0A3C73660C7EEFD74EB6A8A176412D533500690F097A54978DADEDDDB1DB902C61C9BE03203E8C90578FD9D8378F4FA4B507F821261AA6642F94019B08F847FF22793B16367A77A20336E08D1EFB3AE49CF327B9EE59DB7EF698C99731DD36E8D33E6F87A5A4DA6E6687B6F4F3776ECED92234FAE34532BED6916D0751E1D5B6630752E5BE6E1AB0DA32413D663FB2ECB84E99209DD030260E135E7E1C9E7B7828AC4CC11243E6656703BA697D08871F758AF901240DD432FCDB4009EBE36A235533D832F7B2881C339CF9E73EF273508AFE7563D806CC6C7E9E3B3B8FE57EBB07DE7C040E025326F4E6FE3BE84EF67B19058A36E5DA3EB2EC3290E495EFCF3DD5EFCE686C968A8B5EA40DEA1B2F400B0A4D088E9B811DE1DC75CA0F3C211169197E0DA4E480F897F7F9843CB8F2FC5F8088415C540E043BAF2B1456779539C1500CC357C0E732C38FA46630FA8E52408FFFD4860D94D97F70B021F5ADABB8244948F3384E56B49CC1A3B1E41376E9AB109F29FD4066CDD2DF0F8DC297D82C04BA9F9C530B1818FABFE3A32343730B8C6386AA1710CE3042118B6ED6168BB790A26D48E2E6813521D0A47246785ED470200AE3D50182C85C7810461FB3E0F6DB74E4563DD31D0318F058197C6032041FD22F460AC4F0D8AC51B5C33873B7186B209401030BCD72141B8654A1E083C5DEBDD879EC46C06CB739F8E038DE50D4A25880972E2FD0319FC2EC1049E06921F3679FA24158B4F5BEF2A419096F183033E9EB82D02C17E19CA0542E6DA390CCE9F0B18CBCD75B81B86BFCA98A9909687E7F498E5F5E1F59CE9D09845D1A1EF51F3E1FB1C19D96732F2D897BDE721E3D3394F4590DC0B7FB7CC9D50569F43D7A1DE341941A19B7308D1C77551337BDBCB01FDD107B540B540C605B29761226702A7D5F560CE237FC6871F7F420FFC0B1F7A4113E3D8544268917F8D488CADC0811638709A8C8872391A0732C700268E39841B973E6D85976DA65FBA1567FD8224F49E1598672A6B1389D536C2CB55275509C2EBCBA4F413C77E8AB9BF5E8B5DFB3A4D92345326499DFE508B1C14D03B93819A0B0513AA67BA172C9C0FE4B147072434DDA0579F04E74670B22B39B21339F5B8ACCF70FAD85E25FC9EFD07F30A267CC8A92F446C75235570B459246C81ED85D673CB7DF913A855CF514F942710440E39991565B8C099D2E0CD6D5963845F95AC16F121A57D52DF135381485E2B2C30B637D05930E438D02090F0B9B0956504CEAA0F70EBB275E8F84495035692F09B1735C54A65FED0AA7D52F71DC19873CC341BCC3DE636AD065C44ACA1104750F2130436AA28CF7A38BB01B8BDF559ECEF3A64849FFEE283D70422881B5ABF7406D00543A8C48521326CCAF8693D0F41601133CCB110912A295500AACA3D7CAD91E3676D1B8DF0EDCF2FFCFE0CC5B020DFB5FAA5105D192D299C502B286201BE3AA78108E5352CD1E69358406BCE5CFD91AB1F7054CBC8FE5C29FC4F7FBB019DDD8AE9ED9BEEFFEE8C4088A23EC70230614C35AEBEE81455141DC4CF3D4E21D5AD05B8055299C27ED48537DEE9402FD19AA244110A2F58641BE47AABBCDF44BBD51552F8937DCC5BBEC908BFE2B95F5C3D8B5841DE44F401C00B1413CF58B83655A9F09CC9E7E0B56D1D319A33113953A5F7E416E5D1E88A0CCEFD5219EEF8FD261CFC5485B82B36DE376BD640FE0C9820FCA18E8AF6A70980C6BA4A1BE498552797173684AC906D748587731A63C22FDFB860E62C57F1CC73ECF3120CD821DBE587F372CFCC9B7A54525F965F0AC2E43B5709E3E692B101B3D17FA81A35953ECE6ECC62FE137F55891C7D50DAB060669370E20DD64F3AE997729595118C8780B1F3A1410C948D14C2E87BA032C79A2A1F674CC8E2EE152F58E19FFDF98CA6285908011505F390920310B9C0625941C8805058E1F87B02A3B63A83334ECA6241FBE648F87BA5F096211A02D17F41C12FB9B227138144EA6B58407B2EB39B31A32B30B1218B7BFEB005BDA1C76A5B7FEFF426574DC2E7252DBF28F18791BEB2BE42D6DA9A80008166C0D863CBF195FA2CEE7BEA25237CEBFA7BBED3E4E6C802708CA700FA71042566407155103ABA332B3FEEB82A7C795C16BF5CF9B2157EDDDD57CD16FA4EE682C8583CE112A905A0982AC0A6BA247C7D4D354E21E1FFF88A09675BD7DE356DB69B2B0BE69449938C622CCD00382C10711B406172C3095538796C160B57BD6A846F597BD7B79BE3F903AC0711D6104435E3BE0A9D296140BE2FA89019DD49632AD1509BC5A23FFD5DD901127ECD9DDF6A8ED822C27A910E9498A90A0B478DFAA92AA7470512208CAFAD427D6D3916AF7ECD4CB5AC997F65735427113A7F708D29B39ACF1265F2627620659FC6D45BBE48BB8D6F6CC743AB5F372766AF997F45B35B3982AD020BA74E92A8163B15E262A1701ABF0DB6D06EC9D3FF70856F8D95C5450120E0B83D51B8849E577E4F230032CF582EBBEFC9B68CFA67E67DB3353F4E10AED32FF08D205E378C0193741023FF7374986F23008C003002C0F0DE3E13600021CF3C647FD8B0F80000000049454E44AE42608200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
)
 WriteFile("images\MyClipboardManager-Right.png",Right)
 right =
} 
IfNotExist, images\clipboard.png
 {
ClipboardData =
(join
89504E470D0A1A0A0000000D4948445200000080000000800806000000C33E61CB000000097048597300000048000000480046C96B3E000000097670416700000080000000800030E1319A00000006624B474400FF00FF00FFA0BDA79300000FEB4944415478DAED5D6B6C1C57153E7776D7BB761CDBB19DE6E1D449D3E034C549D447444B91DA02094890B49440241091905AA9AA9AFC68057FF8D17F3CEA20A04188922A3F2A2101AD10144585D092A4A1A53F2038AD429587E3386FBF1367ED7DCDECE19ED9BDF69DD9597B67BD77B5E3DC13DDCCEEECC33BE77CE79CEF9C7B6706408B162D5AB4DCA6C26EB7033E7DFA348BC7E3755CD631C61A272727470F1C3870B1BBBB3BBB6EDDBA2C7F8EBB76ED420D800526A74E9DAA8F46A3DF40C45DDCF05F304D33CA1FDBAF19863178F2E4C9B70E1D3A74309148F4EED8B1C34C2693D6D34F3F8D1A000B40CE9D3BD7C58DFC376EF035D96C166890F1698442210280BDA5FDC78E1DFB654F4FCF4FB66FDF3EB46AD52A73EFDEBD590D8000CBD9B3675772E37EC88D7CA7655940438080840C1F894480A7047B643219B872E5CAF16DDBB67D73F7EEDDE36D6D6DE9975E7A69C14682D042367E7F7F3FE35EFE0B1EFA1F155E4F5B1908E4FDE170781A04B1588C1EAFE6696262DFBE7D27D7AC5993E9EDED5DB051C058C80048A7D36DDC98DF25237383DA00E0FB6074749438019C3871022E5EBC089C0F4CA7011AF5F5F5F0C4134F7C9B7F45F3912347EA9E7DF6594303208072E6CC995DDCFB6DE3D320AF1F1C1C84BEBE3EE095C0073C42FC6E7878F89FD7AE5DB3C1412010DBE6E6E6F58F3DF658D7C0C0408C7F76C1EA29BC500FECE8BB875973EBD24728B40B0F4FA55270F3E64D387EFCF80F0F1E3CF8367FDB241FE69E3D7BBEFCFCF3CFBFBC68D1A21C3162396AD4D1D1712FDF7CD47BE2DF942A4D1D0182846C030C1ECA378AD04E5B921B376E7CC08DFF57FE70848FAB7C5CDEBF7FFFEB972E5D3A2C2A03410E392768E70FEB1AEA63C6F7F73EC37404F0212FECDCCCEA4286110A3188D585A131168690413A9C07A1C6DCA7D1DEF29CCE4280461D402406E1FA16A86F5A0A2DCB3AA1A57D257BE557AF36FEE8C72FAF256F16448F481E0FFF97F95724F998E023BEF58B8F9B7F7FE7489A570BA7B76CD9B24D5407C403BABBBBEFE10F63EF1E3D1E5DDBB9C2FCC19EEF6459260E8BC21988600A18A6C1C89AF44B201F347265D53CA142C7483F239ECCC054D2C4B499C59FBE791203038017776E0EBDF15E5FF4E2503C9AFF1BAABD8749BA83AEAEAED6D75E7B6D3FCFE30D72B9D7D8D8081B376EEC24A3F241F11EB9F12D7A79C3860D5D2202D020B03CF5D4535FE3E963B2A7A767DF81D7FF30CADF97991F82CBC282F9B9EE65A917BEBE31CDC160FDFAD027A842711593E7B6771B7FF9F0427D53CCD8F4E2CE4D2FB4B52C5ECA7F3113A1B5A2DAC97F6516915959BBC4C36CA419BABEB4A7BBF3EE0DAD8E03E52E4A60B875EB16FCEB8F3FEB35873F998A860D8B7F0E632BBAEB1EDEF9BD87C8E8729388463299846B0367C72E1C7DF57F612B8EE19081068F64F63FC5B0A6C285FF08EBE889FEC33F7FEBCC6F763CD419AF8F46CCDF1FEBC39A05C0938FDC15FED3FBFD4BDEE979F2DDD5777D6AA335353263A90A1A9D6B861B1E38B3CF42C6CC42C234C05C7A1F2CBBF7F3C0C99FCDF805E8E4AD280587CEF78239390A519E3696AF7BC04E13225AC8449084BE6B7CF82AC4FBDF87E8D84750CF535A84488691AB2E58CE584A249161303066C26FFFFC8F67DE78FFCA9B8F6E5A113FF6D1B58A11D28AA7802B2393C4B6A24B5A5ABAADF1F360A56E552410A2ED0C79C3733B991642861B3F950D83D9B6195A367D055A97AFB6DF3E35350532A1139D3FAA066850B7AFB96303B4B7B7DB65E1D8D898A30F20788300016D9B5A9741ACF1AB307E690D8CF51DE640B800D108E71606B381401C73262AB08A70015B4C84A94433E75091CFF0678707C713C9CF7E7AB9F5C1A9EB589300E0448FD9D5056679D8B7CACE98B2A7D3631EDDC1A44146B70CC82CBE1BC22BEE83C59DF74363538B6D242AF3E4102E0C2FBA7F0200F49C3A7EF4787272D27E8D0C4F4451AE1A642088D1B67A13A496AF87F8601FDCBCFA5F3026CE432431041C0B10E684372400C172609877AAB00F9E680A4488BB8CDC4C865B9B62E94A71110500308A969739A362290E9FF376FE1FE5F60CF776CE842119EB0063E5FDB0A8F341686F699F0EDB14D2DDB9DB6D7CB9FD4B86A606117D9EB6C40BC4EB320064E3CB8FE9F525ABEE01EC586FFFEDD4D42D981AE9036BF4348426FA219A1A853A9E2208103418DA4828312014050CE93434329164F75430DF28A80270DA73F3FE9B0FC3F99C6D6F7176CFA7F7F10794DB9356C80EF18BD76F85A56D2B6D764E86A2302E1B5C18DD6D7C1904B425031200C888B65B4522F63E1119C8D002086E10780DFA9E454D4BA0B1790BE0DA076DD238357A192606DE83C8D8C7501FC945061111666DCA10D018E4A2482E7C481A4426924AB6827C5A692710A78D9AF3E444DAE2236B87712C6AFCDC7B53DCF8E9BA36B8E3E1676079C7DA69C326128902C3BB8D5F0C04C2E022D4CBCF0900F20491ECF5C52281CC11C4A0EF6B59B116D26DAB60E4F21918EB7D1DA238654704360B08985DAA328845429C6486F8FBA7994441D4AC6445A50C00C293C56F27D23699B2A0FB5BAF7823D8361ACFF16686939E245CB936088DED7742434343418817C4CE0B046E00C8AF0B8F26838BC92111F2C5778AADDBE07345022F30B4AE5CC711F61C2C6FAD87D6962576F46206735418AEB2CFF6FEABEFF400260673E6C79906988ACA4DF95C80C8E7E4D5E94C169A567479D83E672041CAC6C6FB61F1D24EDB9B28A47A797C2911407E5D0ED9C2E062BF48098207C88614114106850C0E3B74E7B76E2090507A184F9AB0ACA503163536DAC724DE5F3C1744721C88A9EF3A55250508992D77918289C55359263C939EFB31BE97E1A5655F05E59D0080880C3218DD20F04A01822BD0B65824A0D709C423232336E124B089BF3BABD3047D2EC0CF11C8DE4F8A6A6E6E7618DF1D9EE7F27AB1757BB9FCF784A7BBDFEB1505DC5E3FDB73F7E7E83BC9EBAF5FBF6EF71D280DCC19018AEB934185C111561DFA0B077A7A3FE5795212F5EBDDF5BC0C0461602F1EE0D5C513619F8C2086208122FF8BFDA212105E5F0CACB2B8BDDF2B0DD067E2F1B883CBCCC59F1C23A829A054EF179E373131611B4274F2BC885F3102E8051611FAC54CA04C048581A89CA4104DD5050D7A4CFBE45672B168E0DE2F7FAFFC1A7D17195F7CE75C29A08843B1400140EE03C8FF8AF29EBC618686860AC2B2573FBFD86BF2563680680193810968A212A0BF45FBC940B495BB855E5165AEADD73EFA1E01C2520C3FA33BF0D6592DF70150EEDFBB4AC1623F5CD4CF5D5D5DF68A1D8A00648C6261B8D24273FF6A66F3D8F41AC3A6A626BBFD2C93D059E73E24DDC9380C5C0A40890F1453920000E57FD1E92B25570641DC3C4394A02535D002590560F14885B3780A298A8C4F4A72E7F1208BF076AF6AC117083028007075021D4C168BB73165C52C14E37B01A194E3937537BD0C2EF08D202C4F59B7AB382200AA0B0186FA03C0191E00085AFCE94E323C53D108520A00446919AF36BEAFFC2974878A5380510D34CB5D412D65A6D0A000C0D107D036AC0C079879109C3E0082B30A9839A943C3A2940A8A7935D214840643E95154399C2DE408E09C0BC0DA07807B2600E6980BD022EB0E1DF5934ABD19EAB02B33405D08F8552116CE03384AC1DAE500E82481054373005FE11F8BF855205240C15168DBFBAC9DC16B51686D57018E0E20CE3D1BA865EE08800ABD47E99AC01C08C4CC1EEAF0EF930488F3240246029D7D802255A116FF6560C02200681258D11480D26450101A41980F6158BCA4D1525477E0BDA42E402980CDD21DD0524329C050F9C335092C5787284D09AB9D5553DA08F222811A04A556502E35CE7080609C1CEA5E07A03BC1FE2B28C400A60057292B23588BCF288A8E68804AF894E23383667EAE5E13E83F8B3A575406AC0F204E049DDE42F19343B5142A2FA73BE62EA159A54380BA2561DE5C504B0D95806A3900789CDFA691E08B3FB9F456F10A401100D05905807B564B4BC915541574A79003CC347F444363219DF3A71600D26CA0C78280DA5E10A2E887DE7629605625066551A8C72562B4F8D49DB384AEFD4E207A34331CABC2340A4A5662355652298F00209D1FA86D5F86EE00949D15A41E00052BDCB5944A02A7752635D182D507705F20425BBF3CDD79394E302E165DD8F9D7AD607F7D00D793E05D1F00403782E603806A9C52A1F83271AE8B376AEFF7C50251D221048603A05AC4DE6695A05B02749D40D7AA60D4D707F0A13A2CB8AA0A06F122513AF757863FA914551180B91705EA89207F08C09955B4624A58C97470B85A11409F19E4AF809E6D3AB8A6D704E2F4E94B5878BD7B6D7B7F51A00A2A33AA7630FAAA617EF8F3EC4E53DB9D40694590C8FD30B3C8418B1F1038AA81809C18E2310D3C7DD54BCD014A2E0373E667CAF5A5F6A65108BA31348F08E05465C0FA000E0CE819C1B28C5F8DCB2CABBB4690C75DAF740AF04F04BD2E155BC968A0FCA6517A5140F91C60261CA0B2BB86A93D3914744B78BEF449B5DEAA76B1687D6650992940B1CEAA7AEF60CD01FC5700B3EDAB650030E76210D108D2C62D3905A074B14D749C13C06AFBEC6057DDEF5E1DACA5540A5DFC5AE181B84004A0EBCA20DAF6FE59A04397D35120401C00E570A6394059550006B90AF0008196121D0767BDEF220B0400B0E016981A027E73806AF6A4FC9E41BA1154191A10981480AE52A6E0C6073A0A94E63BE84C07109C3383D05105E808304F12A8A2F653CA01B03809D4E2BF820AEEDDC3E51CA049A04FD5B948207AF3AB1AAF0210509781653B4F61E4C4609D1750C008419340BF6A9B6B5F6D9781A049604589E08CF258AD9F18E2285FF455C2CA2480F25C4AA06E18E10082F6FFF96B10E519C1207100D4E7065620FCAB16A5978BAFFAD12C34044080AF13A84960E5228074CFA0E0440037923502E6110150DDE9E1EAAE1184128141D0978A2C8B3F15E82B78770C71D7045AFC545085F75E0A5419E855CFEA2AA034E5B927838247020B1635EA0850A6EA94560355AB02B4CC8F3F07AF0F50E57A76A1868100DE34AA30ECA306813FD5E102E804BA5B40BA0C2C2F01A85E151CAE3EBA35086A49AA5306EAE960FF29003D56562B208546B50E8A71FA123298B66E89BAAA9628E804A207996560F0A38A460C6DDD528C62383BBED25A80FCE9E1B5BC28D47D42433E9491F7472321387EF0C57C89A8F341A1E733DBF8A91BD773B6C6C2D3ED034902593EAE71FB4372B45F5B7A2E5DF1FFAB9506C20A60EC4A08E8383ACD02CA49A49E41B6363940368B5EA6D7320F28B8E7524D335BBB00302D1B01596DFDCA712A77EF2463550E00154F014B1647E9D7A5D3269A88E170C6D41DC0F9F403921980144FABD92C646CC7E2BBF34E56A300688C5A7C93387FE1E291A5ABD66E4DB33AC0AC0640B90848116FB292707E70F20439969D65B3355C06662CC4752B9B1307DEFE646F77E795DDBCF6EFE2BBA3A0F95F799C0A2173FE7AFC3F03C3898FF9D3F1585D28655510014A8CF2F8E60EE3C4B9E1869B93E976FE944603B5023408CAEAAAD04891F1F918BEA3A57E62E8462253D3002079A0EB8ED0E5E178DDE0F854341F69B4F1CB172B1A09A51637D4A50DC6CCA11B5358F30020E9686F60B9FE56EE3F8D011F16E7AC8FB89E65214F0388346EC4D39A4C69A9ACFC1F35F7F6C830F305B80000002574455874646174653A63726561746500323031302D30322D31315430313A32333A35342D30363A303006534E1D0000002574455874646174653A6D6F6469667900323030362D30362D32315430323A35313A33362D30353A3030F73F0EA30000000049454E44AE426082
)
 WriteFile("images\Clipboard.png",ClipboardData)
 ClipboardData =
}
IfNotExist,images\Clipboard.ico
 {
  ClipboardData1 =
( join
000001000100404000000100200028420000160000002800000040000000800000000100200000000000004200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104080B010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020A0000011100000110000000100000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000001110000011100000111000000110000011100000110000000110000000E05080B05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000142330521F3243AB1C2F40AF1C3040B01D3041AF1D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D3041B01D2F40AF1C2F40AF1E3243B213212C930001022D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101503395D7CD83F76A4FF386D99FF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF3A6F9BFF396E9AFF396E9AFF396F9CFF3A6080FF040A0E580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070B0E08396081D93370A3FC2F6999FA2F6A9BFC2F6A9BFC2F6A9CFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9BFC2F6A9CFC2E699AFC2F699AFB2E6C9DFC366082F8060C115D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080C1007395F80D83771A4FF316999FC346B9AFF356C99FF356B99FF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356C9AFF356B99FF356B9AFF336B9AFD316C9EFF376083F9050B105C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070C10073A6081D93773A6FF2B6391FDABBAC7FFC9D0D5FFC2CAD2FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC4CCD3FFC1CAD1FFCDD3D6FF7193B1FE28669BFF396285FA060C115C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D1108396182D93674A7FF285F8DFDC8CDD2FFEDE9E5FFE4E2E1FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE6E4E2FFE3E2E0FFF1ECE6FF7E9CB6FE26669BFF3A6386FA060C105B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080C10083A6082D93774A8FF29608EFDC1C9D0FFE6E4E3FFDDDDDFFFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDFDFE0FFDCDDDEFFEAE7E4FF7C9BB5FE27679CFF3A6386FA060C115C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083B6183D93875A8FF2A608EFDC4CBD1FFE8E6E4FFDFDFE0FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFDEDFDEFFECE9E5FF7D9CB5FE28679CFF3B6487FA060B125B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083A6284D93776A9FF29618FFDC3CAD0FFE7E5E3FFDEDEDFFFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFE0E0E0FFDDDEDFFFEBE8E4FF7C9BB6FE27689DFF3A6587FA060C115A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083B6284D93877AAFF296190FDC3CBD1FFE8E6E4FFDFDFE0FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFDEDFE0FFEDE9E5FF7D9CB7FE28689EFF3B6488F9060D125B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083B6385D93977ABFF2A6291FDC4CCD2FFE9E7E5FFE0E0E1FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFDFE0E1FFEDE9E6FF7E9DB8FE29699FFF3B6589FA060C125B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083A6486D93978ADFF2B6391FDC5CBD1FFE8E6E4FFDFDFE0FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFDEDFE0FFECE8E5FF7D9EB8FE286AA0FF3A668AF9060C125A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D10083B6386D93A79AEFF2A6492FDC4CCD2FFE9E7E5FFE0E0E1FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFDFE0E1FFEEE9E6FF7E9FB9FE296BA1FF3B678BF8060D125A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083C6487D93B79B0FF2B6494FDC4CDD3FFEAE8E6FFE1E1E2FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE0E1E2FFEFEAE7FF7F9FBAFE2A6BA3FF3C678CF9050C11590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080C12083B6588D93A7AB1FF2A6595FDC5CDD4FFEAE8E6FFE1E1E2FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE0E1E2FFEFEAE7FF7EA0BBFE296CA4FF3B688CF9060D12580000000000010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083C6589D93B7BB2FF2B6696FDC5CDD4FFEAE8E6FFE1E1E2FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE0E1E2FFEFEAE7FF7FA0BBFE2A6DA5FF3C688DF9070D13590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083D668AD93B7CB3FF2B6797FDC6CED5FFEBE9E7FFE2E2E3FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE1E2E3FFF0EBE8FF7FA1BDFE2A6EA7FF3C698EF9060C12580000000000010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D12083C678BD93C7DB4FF2C6898FDC7CFD6FFECEAE8FFE3E3E4FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE2E3E4FFF1ECE9FF80A2BEFE2B6FA8FF3D698FF9070D13570000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080C11083C688CD93D7EB6FF2D689AFDC7CFD6FFECEAE8FFE3E3E4FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE2E3E4FFF1ECE9FF81A2BFFE2C6FAAFF3E6A90F9070D13580000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D12083D688CD93C7FB7FF2D699BFDC8D0D7FFEDEBE9FFE4E4E5FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE3E4E5FFF2EDEAFF81A3C0FE2C70ABFF3D6B91F9070E12570000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080E12083D698DD93D80B8FF2E699CFDC8D0D7FFEDEBE9FFE4E4E5FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE6E6E6FFE3E4E5FFF2EDEAFF82A4C0FE2D71ACFF3E6B92F9070D13560000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D11083E698ED93E81BAFF2E6A9EFDC9D1D8FFEEECEAFFE5E5E6FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE4E5E6FFF3EEEBFF82A5C1FE2D72AEFF3F6C93F9070E14560000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080E12083E6A8FD93E82BBFF2E6B9FFDC9D1D8FFEEECEAFFE5E5E6FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE4E5E6FFF3EEEBFF82A5C2FE2D73AFFF3E6C94F9070E13550000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070E13073F6B90D93E83BCFF2F6CA0FDCAD2D9FFEFEDEBFFE6E6E7FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE5E6E7FFF4EFECFF83A6C3FE2E75B0FF3F6D94F9070E14550000000001000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080E12083E6C91D93F84BEFF2F6DA1FDCAD2D9FFEFEDEBFFE6E7E7FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE5E6E7FFF4EFECFF83A6C4FE2E76B2FF406E96F8070E13540000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E13073F6C92D94085BFFF2F6EA2FDCBD3DAFFF0EEECFFE7E8E8FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE6E7E8FFF5F0ECFF84A7C5FE2E77B3FF406F97F9070D14530000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080D1306406D94D94086C0FF306FA4FDCBD4DBFFF0EEECFFE7E8E8FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE6E7E8FFF5F0ECFF84A8C6FE2F78B4FF3F6F98F8070E1453000000000101020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
)
ClipboardData2 =
( join
0000000000000000000000000000000000000000000000000000090E13073F6E94D94187C2FF316FA5FDCCD5DCFFF1EFEDFFE8E9E9FFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFE7E8E9FFF6F1EDFF85A9C7FE3079B6FF407099F7070F15520000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E1307406E95D94188C4FF3170A6FDCCD5DCFFF1EFEDFFE8E9E9FFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFE7E8E9FFF6F1EDFF86A9C8FE3079B7FF41719AF8070E14530000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F1307416F96D94289C5FF3172A7FDCDD6DDFFF2F0EEFFE9EAEAFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFE8E9EAFFF7F2EEFF85AAC9FE307AB8FF40729BF8070F15520000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E1207417097D94289C6FF3272A9FDCED6DEFFF3F1EFFFEAEBEBFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFE9EAEBFFF8F3EFFF86ABCAFE317BBAFF41739CF8060F14510000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E1307417097D9428BC8FF3373AAFDCED7DEFFF3F1EFFFEAEBEBFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFE9EAEBFFF8F3EFFF87ABCAFE327CBCFF42739DF8070F15510000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E1407427198D9438CCAFF3374ABFDCFD8DFFFF4F2F0FFEBECECFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEAEBECFFF9F4F0FF87ADCBFE327EBDFF42749DF8070F15510000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F130741719AD9438DCBFF3376ACFDCFD8DFFFF4F2F0FFEBECECFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEAEBECFFF9F4F0FF87ADCDFE327FBEFF42749EF8080E16500000000001020101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090E140742729BD9448ECCFF3377AEFDD0D9E0FFF5F3F1FFECEDEDFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEBECEDFFFAF5F1FF88AECEFE3380C0FF4275A0F8070F15500000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F140642739CD8448ECEFF3476AFFDD0D9E0FFF5F3F1FFECEDEDFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEBECEDFFFAF5F1FF89AFCEFE3380C1FF4376A1F8080F16500000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F140743749CD9448FCFFF3477B0FDD1DAE1FFF6F4F2FFEDEEEEFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFECEDEEFFFBF6F2FF89B0CFFE3381C2FF4476A2F70810154F0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F140642759DD84590D0FF3578B1FDD1DAE1FFF6F4F2FFEDEEEEFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFECEDEEFFFBF6F2FF89B0D0FE3482C4FF4377A3F8080F164F0000000001020201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F140643749ED84691D1FF3679B2FDD2DBE2FFF7F5F3FFEEEFEFFFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFEDEEEFFFFCF7F3FF8AB1D1FE3583C5FF4378A3F70810164E0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F130543759FD74692D3FF347AB4FDD3DCE4FFF8F6F4FFEFF0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFEEEFF0FFFDF8F4FF8BB1D2FE3584C7FF4479A4F70810174E0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080E14064476A0D84793D4FF367BB5FDD2DBE3FFF7F5F3FFEEEFEFFFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFEDEEEFFFFCF7F3FF8AB2D3FE3685C8FF4579A5F60810164E0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F15064577A1D84694D5FF367CB6FDD3DCE4FFF8F6F4FFEFF0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFEEEFF0FFFDF8F4FF8BB3D4FE3586C9FF447AA6F70810174D0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091014064577A2D84794D6FF367DB7FDD4DDE5FFF9F7F5FFF0F1F1FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFEFF0F1FFFEF9F5FF8CB3D4FE3686CAFF457AA7F7080F174D0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080F15064678A3D84895D7FF377CB8FDD4DDE5FFF9F7F5FFF0F1F1FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFEFF0F1FFFEF9F5FF8CB4D5FE3787CBFF467BA7F70810164C0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091015064679A3D84896D8FF377DB9FDD5DEE6FFFAF8F6FFF1F2F2FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF3F3F3FFF3F3F3FFF3F3F3FFF0F1F2FFFFFAF6FF8DB5D6FE3788CCFF457CA8F70811174C0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091015064678A4D84997D9FF387EBAFDD4DDE5FFF9F7F5FFF0F2F1FFF3F3F3FFF2F2F2FFF2F2F2FFF3F3F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF3F3F3FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFEFF0F1FFFEF9F5FF8CB4D6FE3888CDFF467BAAF70811184B0000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091014064679A5D84998DAFF387EBBFDD5DEE6FFFAF8F6FFF1F1F2FFF2F2F2FFF2F2F2FFF0F0F0FFF0F0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF0F0F0FFF0F0F0FFF2F2F2FFF2F2F2FFF2F2F2FFF3F3F3FFF0F1F2FFFFFAF5FF8DB5D7FE3889CFFF477CAAF70811184A000000000102030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101506457AA5D84899DBFF377FBBFDD6DFE7FFFAF8F6FFF1F2F2FFE6E6E6FFCCCCCCFFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC4C4C4FFC5C5C5FFC5C5C5FFC5C5C5FFC4C4C4FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC3C3C3FFC9C9C9FFE2E2E2FFF2F2F2FFF3F3F3FFF1F2F3FFFFFBF6FF8EB6D8FE378ACFFF477DABF70811184B000000000102030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101606467BA6D84999DDFF3880BCFDD5DEE6FFF9F7F5FFF2F3F3FFD3D3D3FFACACACFFAAAAAAFFA8A8A8FFA7A7A7FFA5A5A5FFA3A3A3FFA1A1A1FF9F9F9FFF9D9D9DFF9D9D9DFFA0A0A0FFABABABFFBDBDBDFFC9C9C9FFC1C1C1FFAFAFAFFFA3A3A3FF9D9D9DFF9D9D9DFF9E9E9EFFA0A0A0FFA2A2A2FFA3A3A3FFA5A5A5FFA6A6A6FFA8A8A8FFA1A1A1FFC4C5C5FFF3F4F4FFF2F2F2FFF0F1F2FFFEFAF5FF8DB6D8FE388AD0FF477EABF70811184A000000000102030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101606477AA7D84A9ADDFF3980BDFDD6DFE7FFFBF8F6FFF2F3F4FFE2E3E3FFC2C3C3FFC2C2C3FFBEBFBFFFBEBEBEFFBCBCBCFFBABABAFFB7B7B7FFB4B4B4FFB1B1B1FFAFAFAFFFAFAFAFFFB8B8B8FFCDCDCDFFDFDFDFFFD4D4D4FFBCBCBCFFB1B1B1FFAFAFAFFFB0B0B0FFB2B2B2FFB5B5B5FFB7B7B7FFB9B9B9FFBBBBBBFFBDBDBDFFBFC0C0FFB4B4B5FFCECFCFFFF3F4F4FFF3F3F3FFF1F2F3FFFEFBF6FF8EB7D9FE398BD1FF467DACF7081118490000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F1506477BA7D84A9BDEFF3981BEFDD9E1E8FFFEFAF6FFF5F4F3FFF5F3F2FFD8D6D5FFCAC7C5FFCDCBC9FFC2C3C4FFBFC0C1FFBFBFBFFFBEBEBEFFBBBBBBFFB7B7B7FFB5B5B5FFB3B3B3FFB5B5B5FFC7C7C7FFDEDEDEFFCFCFCFFFB7B7B7FFB2B2B2FFB4B4B4FFB6B6B6FFB9B9B9FFBBBBBBFFBDBDBDFFBDBEBFFFBEBFC0FFC1C2C3FFC7C5C3FFC2C0BEFFEAE8E7FFF7F5F4FFF6F5F3FFF4F3F3FFFFFDF6FF90B8DAFE388CD2FF477DADF608111849000000000001020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008101505467BA8D7499BDEFF3F8AC9FC649BC8FF6C9FC8FF6B9EC8FF6B9EC8FF679AC5FF628FB4FFACB8C2FFD5D1CDFFD5D1CEFFCCCBCAFFC5C6C7FFC3C3C4FFC1C1C1FFBEBEBEFFBABABAFFB6B6B6FFC2C2C2FFDFDFDFFFCCCCCCFFB6B6B6FFB9B9B9FFBCBCBCFFBFBFBFFFC0C0C1FFC2C3C3FFC8C7C7FFCECBC9FFD2CDCAFFD1CCC8FFA0AEB9FF6190B8FF6A9DC8FF6B9EC8FF6B9EC8FF6A9DC7FF6EA1CBFF5597CFFD4292D6FF457EADF6071017490000000001020301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090F1506467AA7D64697DBFC428ECFFA3988CCFB3687CBFC3788CBFC3687CBFC3887CBFC3787CAFC3E85C2FC6998C1FC9BB1C3FCC4C8CAFBD8D3CFFCD4D1CFFBCACACAFCC9C9C9FEC5C5C5FEBEBEBEFFBBBBBBFDDADAD9FBC2C2C2FCBABABAFEC3C3C3FFC6C6C6FFC7C7C7FDCCCBCAFBD4CFCBFCC5C6C7FCACB9C3FC8BA8C0FC6495BFFC3E86C3FC3687CBFC3787CBFC3687CBFC3788CBFC3787CBFC3686CBFB3D8CCEFB4392D4FC437CABF4091119490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080E13034D82AFDD56A7EBFF4E9CDEFF52A0E1FF52A0E2FF52A0E2FF52A0E2FF529FE1FF52A0E1FF509EE1FF4798DDFF4695D8FF599BD2FF81ADD1FFC4D0DBFFE6E5E4FFD9D9D9FFD5D5D5FFD1D1D1FFD0D0D0FFD4D8DBFFD2D4D5FFCFCECEFFD1D1D1FFD3D3D3FDDEDEDDFFD5D8DBFF93B4D0FF5F9CD1FF4B96D5FF4696DAFF4899DFFF509EE1FF51A0E1FF529FE2FF52A0E1FF52A0E2FF52A0E2FF529FE1FF509EE0FF50A1E4FF4C82B1FF0A141D3E0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002947606745759DB53F6D94B1406E95B2406E95B3406E95B3406E95B3406E95B3406E95B3416E95B3426F95B3427096B33D6D95B2366892B33A6487B185929EBEE5E4E2FBE6E6E7FDEDECEBFFA8B0B6DD4A6B88B16E8598B9E1E0E0F6E5E5E5FFEAE9E9FFB6B8BADF4D6C86B134658FB33B6C95B3416F96B3416F96B3426F95B3406E95B3406E95B3406E95B3406E95B3406E95B3406E95B3406E95B23F6D94B143739CB631567487172C3E0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B4B5B78EF3F3F3FEE9E9E9FF404040720000000000000000BFBFBFC5FCFCFCFEB4B4B4D518191A27000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020304010000000002030401000000000000000000000000000000000000000000000000000000000000
)
ClipboardData3 =
( join
0000020304010000000003040504000000009D9FA04DEDEDEDFFDFDFDFFE7F7F7FBF1C1C1C3F46464663E0E0E0F0FDFDFDFC858484AB191B1B021B1D1E01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002030401000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303010000000061616116F9F9F9F1D7D7D7FDCACACAFFACACACF0CCCCCCFCEEEEEEFDFFFFFFFF5E5E5E7B0000000007060602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010100000000C5C5C573EFEFEFFFD6D6D6FFD4D4D4FFDCDCDCFFECECECFFB5B5B5C859595918000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000A8A8A852E1E1E1B0E4E4E4CFD2D2D2C4AAAAAA767070700F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003B3B3B01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404040500000005000000000000000200000005000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFE7FFFFFFFFFFFFFFF00000000003FFFFE00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000003FFFFC00000000002FFFFC00000000003FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000002FFFFC00000000003FFFFC00000000002FFFFE00000000003FFFFFFFFE187FFFFFFFFE5FEA003FFB7FFFFFFFFA00BFFFFFFFFFFFFD00FFFFFFFFFFFFFE81FFFFFFFFFFFFFFEFFFFFFFFFFFFFFF91FFFFFFF
)
ClipboardData .= ClipboardData1 . ClipboardData2 . ClipboardData3
WriteFile("images\Clipboard.ico",ClipboardData)
loop 3
 ClipboardData%a_index% =
ClipboardData =
}
Return

6GuiSize:
7GuiSize:
UpdateScrollBars(A_Gui, A_GuiWidth, A_GuiHeight)
return
UpdateScrollBars(GuiNum, GuiWidth, GuiHeight)
 {
  static SIF_RANGE=0x1, SIF_PAGE=0x2, SIF_DISABLENOSCROLL=0x8, SB_HORZ=0, SB_VERT=1
  Gui, %GuiNum%:Default
  Gui, +LastFound
  Left := Top := 9999
  Right := Bottom := 0
  WinGet, ControlList, ControlList
  Loop, Parse, ControlList, `n
   {
    GuiControlGet, c, Pos, %A_LoopField%
    if (cX < Left)
     Left := cX
    if (cY < Top)
     Top := cY
    if (cX + cW > Right)
     Right := cX + cW
    if (cY + cH > Bottom)
     Bottom := cY + cH
   }
  Left -= 8
  Top -= 8
  Right += 8
  Bottom += 8
  ScrollWidth := Right-Left
  ScrollHeight := Bottom-Top
  VarSetCapacity(si, 28, 0)
  NumPut(28, si) ; cbSize
  NumPut(SIF_RANGE | SIF_PAGE, si, 4) ; fMask
  NumPut(ScrollWidth, si, 12) ; nMax
  NumPut(GuiWidth, si, 16) ; nPage
  DllCall("SetScrollInfo", "uint", WinExist(), "uint", SB_HORZ, "uint", &si, "int", 1)
  NumPut(ScrollHeight, si, 12) ; nMax
  NumPut(GuiHeight, si, 16) ; nPage
  DllCall("SetScrollInfo", "uint", WinExist(), "uint", SB_VERT, "uint", &si, "int", 1)
  if (Left < 0 && Right < GuiWidth)
   x := Abs(Left) > GuiWidth-Right ? GuiWidth-Right : Abs(Left)
  if (Top < 0 && Bottom < GuiHeight)
   y := Abs(Top) > GuiHeight-Bottom ? GuiHeight-Bottom : Abs(Top)
  if (x || y)
   DllCall("ScrollWindow", "uint", WinExist(), "int", x, "int", y, "uint", 0, "uint", 0)
 }
OnScroll(wParam, lParam, msg, hwnd)
 {
  static SIF_ALL=0x17, SCROLL_STEP=10
  bar := msg=0x115 ; SB_HORZ=0, SB_VERT=1
  VarSetCapacity(si, 28, 0)
  NumPut(28, si) ; cbSize
  NumPut(SIF_ALL, si, 4) ; fMask
  if !DllCall("GetScrollInfo", "uint", hwnd, "int", bar, "uint", &si)
   return
  VarSetCapacity(rect, 16)
  DllCall("GetClientRect", "uint", hwnd, "uint", &rect)
  new_pos := NumGet(si, 20) ; nPos
  action := wParam & 0xFFFF
  if action = 0 ; SB_LINEUP
   new_pos -= SCROLL_STEP
  else if action = 1 ; SB_LINEDOWN
   new_pos += SCROLL_STEP
  else if action = 2 ; SB_PAGEUP
   new_pos -= NumGet(rect, 12, "int") - SCROLL_STEP
  else if action = 3 ; SB_PAGEDOWN
   new_pos += NumGet(rect, 12, "int") - SCROLL_STEP
  else if action = 5 ; SB_THUMBTRACK
   new_pos := NumGet(si, 24, "int") ; nTrackPos
  else if action = 6 ; SB_TOP
   new_pos := NumGet(si, 8, "int") ; nMin
  else if action = 7 ; SB_BOTTOM
   new_pos := NumGet(si, 12, "int") ; nMax
  else
   return
  min := NumGet(si, 8, "int") ; nMin
  max := NumGet(si, 12, "int") - NumGet(si, 16) ; nMax-nPage
  new_pos := new_pos > max ? max : new_pos
  new_pos := new_pos < min ? min : new_pos
  old_pos := NumGet(si, 20, "int") ; nPos
  x := y := 0
  if bar = 0 ; SB_HORZ
   x := old_pos-new_pos
  else
   y := old_pos-new_pos
  DllCall("ScrollWindow", "uint", hwnd, "int", x, "int", y, "uint", 0, "uint", 0)
  NumPut(new_pos, si, 20, "int") ; nPos
  DllCall("SetScrollInfo", "uint", hwnd, "int", bar, "uint", &si, "int", 1)
 }
WriteFile(file,data)
{
   Handle :=  DllCall("CreateFile","str",file,"Uint",0x40000000
                  ,"Uint",0,"UInt",0,"UInt",4,"Uint",0,"UInt",0)
   Loop
   {
     if strlen(data) = 0
        break
     StringLeft, Hex, data, 2
     StringTrimLeft, data, data, 2
     Hex = 0x%Hex%
     DllCall("WriteFile","UInt", Handle,"UChar *", Hex
     ,"UInt",1,"UInt *",UnusedVariable,"UInt",0)
    }

   DllCall("CloseHandle", "Uint", Handle)
   return
}
  
OnLButtonDblClk(wParam, lParam, msg, hwnd) {
    WinGetClass class, ahk_id %hwnd%
    if (class = "Static") {
        if !A_Gui
            return 0  ; Just prevent Clipboard change.
        ; Send a WM_COMMAND message to the Gui to trigger the control's g-label.
        Gui +LastFound
        id := DllCall("GetDlgCtrlID", "ptr", hwnd) ; Requires AutoHotkey v1.1.
        static STN_DBLCLK := 1
        PostMessage 0x111, id | (STN_DBLCLK << 16), hwnd
        ; Return a value to prevent the default handling of this message.
        return 0
    }
}
MyClipBoardManager_MainGui.JPG
Main Gui
MyClipBoardManager_MainGui.JPG (54.81 KiB) Viewed 5760 times
MyClipBoardManager_ViewAllEntriesGui.JPG
View All Entries
MyClipBoardManager_ViewAllEntriesGui.JPG (87.57 KiB) Viewed 5760 times
MyClipBoardManager_EditPresetsGui.JPG
Edit Presets
MyClipBoardManager_EditPresetsGui.JPG (60.77 KiB) Viewed 5760 times
Last edited by DataLife on 11 Feb 2023, 00:37, edited 1 time in total.
Check out my scripts. (MyIpChanger) (ClipBoard Manager) (SavePictureAs)
All my scripts are tested on Windows 10, AutoHotkey 32 bit Ansi unless otherwise stated.

User avatar
DataLife
Posts: 445
Joined: 29 Sep 2013, 19:52

Re: Text Based Clipboard Manager w/Gui

Post by DataLife » 06 Feb 2023, 12:47

I am very surprised to see "Viewed 3576 times" but no comments.
Check out my scripts. (MyIpChanger) (ClipBoard Manager) (SavePictureAs)
All my scripts are tested on Windows 10, AutoHotkey 32 bit Ansi unless otherwise stated.

ckkeith
Posts: 2
Joined: 20 Oct 2019, 23:16

Re: Text Based Clipboard Manager w/Gui

Post by ckkeith » 08 Feb 2023, 18:55

Hey, I was going to check it out but I can't get the link to work.

gya
Posts: 25
Joined: 04 Nov 2021, 01:22

Re: Text Based Clipboard Manager w/Gui

Post by gya » 08 Feb 2023, 23:29

@DataLife
Hello,

Hello,

Your idea is interesting but searching for clips is tedious and presets have no names when they are busy.
Consider this:
-
ReClip; a Text Reformatting and Clip Management Utility - AutoHotkey Community @ viewtopic.php?f=6&t=28225
-
CLCL @ https://nakka.com/soft/clcl/index_eng.html
-
CL3 clipboard utility (text only) with menu, search, quick paste, cycle/step, plugins, API, ... - AutoHotkey Community @ viewtopic.php?f=6&t=814
-
Sincerely.

User avatar
DataLife
Posts: 445
Joined: 29 Sep 2013, 19:52

Re: Text Based Clipboard Manager w/Gui

Post by DataLife » 11 Feb 2023, 00:39

ckkeith wrote:
08 Feb 2023, 18:55
Hey, I was going to check it out but I can't get the link to work.
The link works for me.

I added a code box with the full script.
Check out my scripts. (MyIpChanger) (ClipBoard Manager) (SavePictureAs)
All my scripts are tested on Windows 10, AutoHotkey 32 bit Ansi unless otherwise stated.

User avatar
DataLife
Posts: 445
Joined: 29 Sep 2013, 19:52

Re: Text Based Clipboard Manager w/Gui

Post by DataLife » 11 Feb 2023, 01:03

gya wrote:
08 Feb 2023, 23:29
@DataLife
Hello,

Hello,

Your idea is interesting but searching for clips is tedious and presets have no names when they are busy.
Consider this:
-
ReClip; a Text Reformatting and Clip Management Utility - AutoHotkey Community @ viewtopic.php?f=6&t=28225
-
CLCL @ https://nakka.com/soft/clcl/index_eng.html
-
CL3 clipboard utility (text only) with menu, search, quick paste, cycle/step, plugins, API, ... - AutoHotkey Community @ viewtopic.php?f=6&t=814
-
Sincerely.
Thanks for the ideas.
Todo...Add ability to rename Presets, maybe change color when "busy"
Todo...Add ability to search clips

I started this Clipboard manager in 2012 because I wanted a simple clipboard manager without having to remember hotkeys and I wanted Presets.
I have very limited time to work on this script but I do like your observations and hopefully I will get time to work on this script.

This script has issues handling "Large Clipboards". I think due to Edit controls character limit. The Edit control can not be created with more than 32,767 characters. I believe I can create the edit control empty then add the text later with GuiControl.
Check out my scripts. (MyIpChanger) (ClipBoard Manager) (SavePictureAs)
All my scripts are tested on Windows 10, AutoHotkey 32 bit Ansi unless otherwise stated.

ahk7
Posts: 572
Joined: 06 Nov 2013, 16:35

Re: Text Based Clipboard Manager w/Gui

Post by ahk7 » 11 Feb 2023, 04:05

It reminds me of https://softwareok.com/?seite=Microsoft/MultiClipBoardSlots perhaps there are some ideas you can borrow from it :)

CL3 Has slots (similar) https://github.com/hi5/CL3/#slots-plugin-v12 where you can also save/load multiple "collections" if you will - that way I can use a collection for specific situations.

Post Reply

Return to “Scripts and Functions (v1)”