#NoTrayIcon #Region ;**** Directives created by AutoIt3Wrapper_GUI **** ;~ #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 #AutoIt3Wrapper_Icon=C:\ProgramData\Loupe2.ico #AutoIt3Wrapper_Outfile=Mp3SearchEngine.exe #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_UseX64=n ; not supported. #AutoIt3Wrapper_UPX_Parameters=--best --lzma #AutoIt3Wrapper_Res_Description=Mp3SearchEngine #AutoIt3Wrapper_Res_Fileversion=2.0.1.1 #AutoIt3Wrapper_Res_Comment=Mp3 Search Engine : Search, Play and Get mp3 from Internet. #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker #AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer% #AutoIt3Wrapper_Res_Field=Compile date|%longdate% %time% #AutoIt3Wrapper_Run_Au3Stripper=y #au3stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del "%scriptfile%_stripped.au3" #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** Global $__BinaryCall_Kernel32dll = DllOpen ( 'kernel32.dll' ) Global $__BinaryCall_Msvcrtdll = DllOpen ( 'msvcrt.dll' ) #Region ;************ Includes ************ #Include #Include #Include #Include #Include #Include #Include 'Curl.au3' #EndRegion ;************ Includes ************ Opt ( 'GUIOnEventMode', 1 ) Opt ( 'GUICloseOnESC', 0 ) Opt ( 'MustDeclareVars', 1 ) #Region ------ Global Variables ------------------------------ ; Memory constants. Global Const $tagIMAGE_DOS_HEADER = 'WORD e_magic;WORD e_cblp;WORD e_cp;WORD e_crlc;WORD e_cparhdr;WORD e_minalloc;WORD e_maxalloc;WORD e_ss;WORD e_sp;WORD e_csum;WORD e_ip;WORD e_cs;WORD e_lfarlc;WORD e_ovno;WORD e_res[4];WORD e_oemid;WORD e_oeminfo;WORD e_res2[10];LONG e_lfanew;' Global Const $tagIMAGE_FILE_HEADER = 'WORD Machine;WORD NumberOfSections;DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;' Global $tagIMAGE_OPTIONAL_HEADER = 'WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;DWORD SizeOfInitializedData;DWORD SizeOfUninitializedData;DWORD AddressOfEntryPoint;DWORD BaseOfCode;DWORD BaseOfData;PTR ImageBase;DWORD SectionAlignment;DWORD FileAlignment;WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;PTR SizeOfStackReserve;PTR SizeOfStackCommit;PTR SizeOfHeapReserve;PTR SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;' Global Const $tagIMAGE_NT_HEADER = 'DWORD Signature;' & $tagIMAGE_FILE_HEADER & $tagIMAGE_OPTIONAL_HEADER Global Const $tagIMAGE_SECTION_HEADER = 'CHAR Name[8];DWORD VirtualSize;DWORD VirtualAddress;DWORD SizeOfRawData;DWORD PointerToRawData;DWORD PointerToRelocations;DWORD PointerToLinenumbers;WORD NumberOfRelocations;WORD NumberOfLinenumbers;DWORD Characteristics;' Global Const $tagIMAGE_DATA_DIRECTORY = 'DWORD VirtualAddress;DWORD Size;' Global Const $tagIMAGE_BASE_RELOCATION = 'DWORD VirtualAddress;DWORD SizeOfBlock;' Global Const $tagIMAGE_IMPORT_DESCRIPTOR = 'DWORD OriginalFirstThunk;DWORD TimeDateStamp;DWORD ForwarderChain;DWORD Name;DWORD FirstThunk;' Global Const $tagIMAGE_IMPORT_BY_NAME = 'WORD Hint;char Name[1];' Global Const $tagIMAGE_EXPORT_DIRECTORY = 'DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name;DWORD Base;DWORD NumberOfFunctions;DWORD NumberOfNames;DWORD AddressOfFunctions;DWORD AddressOfNames;DWORD AddressOfNameOrdinals;' Global $_KERNEL32DLL = DllOpen ( 'kernel32.dll' ) Global $_MFHookPtr, $_MFHookBak, $_MFHookApi = 'LocalCompact' Global Const $tagModule = 'PTR ExportList;PTR CodeBase;PTR ImportList;PTR DllEntry;DWORD Initialized;' ; Global Const $TCM_FIRST = 0x1300 Global Const $TCM_GETCURSEL = ($TCM_FIRST + 11) Global Const $TCN_FIRST = -550 Global Const $TCN_SELCHANGE = ($TCN_FIRST - 1) Global Const $GUI_SS_DEFAULT_COMBO = 0x00200042 Global Const $WS_MAXIMIZEBOX = 0x00010000 Global Const $WS_MINIMIZEBOX = 0x00020000 Global Const $WS_SYSMENU = 0x00080000 Global Const $WS_SIZEBOX = 0x00040000 Global Const $WM_NOTIFY = 0x004E Global Const $WM_SIZE = 0x0005 Global Const $WM_WINDOWPOSCHANGED = 0x0047 Global Const $WM_GETMINMAXINFO = 0x0024 Global Const $WM_COMMAND = 0x0111 Global Const $NM_FIRST = 0 Global Const $NM_CLICK = $NM_FIRST - 2 Global Const $NM_DBLCLK = $NM_FIRST - 3 Global Const $NM_RCLICK = $NM_FIRST - 5 Global Const $NM_CUSTOMDRAW = $NM_FIRST - 12 Global Const $CDDS_PREPAINT = 0x00000001 Global Const $CDDS_ITEMPREPAINT = 0x00010001 Global Const $CDDS_SUBITEM = 0x00020000 Global Const $CDRF_NOTIFYSUBITEMDRAW = 0x00000020 Global Const $CDRF_NOTIFYITEMDRAW = 0x00000020 Global Const $CDRF_NEWFONT = 0x00000002 ; Bass Global Variables : Global Const $BASS_OK = 0 Global Const $BASS_STREAM_PRESCAN = 0x20000 Global Const $BASS_STREAM_AUTOFREE = 0x40000 Global Const $BASS_UNICODE = 0x80000000 Global $hBassDll = -1 ; Global $aRunning_D[1], $ahCurls_D[1], $ahFiles_D[1], $asFilePaths_D[1], $ahProgress_D[1], $aUrl_D[1], $aLVIndex_D[1], $ahListView_D[1], $aQueries[1], $aIdTabItem[1], $aIdTabListView[1] Global $iRunning_P, $sSlist_P, $hCurls_P, $hFiles_P, $hProgress, $hMulti_P, $hCurReceiver Global $MsgsInQueue, $CURLMsg, $Code, $hMulti_D, $sSlist_D, $hMulti_S, $Running=1, $Curl, $Code Global $sDownloadFileUrl, $sResearchUrl, $iExit, $iIndex, $iRunningDownloadOld, $iRunningDownload, $fProgressOld, $iResponseCode, $sHeader, $sContentType, $sContentLength, $iNoMatch Global $hGui, $idButtonSearch, $idButtonOutputDir, $idComboBoSearch, $idEditRunningDownload, $hListView, $idComboBoMaxDownload, $hStatusBar, $hTab, $idButtonSelectDir, $iChangeDir, $sSelectFolder Global $sQueryString, $aInfos, $aSplit, $iTotalIndex, $iLVIndex, $sReferer = 'http://www.audiodump.com/' Global $sRegKeySettings = 'HKCU\Software\Mp3SearchEngine\Settings' Global $Data, $hCurlKeepAlive, $sResearchUrl2, $sQueries, $sDefault, $iTabItemCount, $idButtonPaste Global $sHtml, $iGetSource, $iCancel, $iSearch, $sProgress, $hLVDoubleClick, $iColumn, $hRetListView, $iFlag, $hLVToSort, $hLVRightClick Global $hLVMenu, $iContextMenuId, $iSelectedIndices, $iBassError, $sTitlePlayed, $hProgress_P, $fLoadProgressOld_P, $aAccelKeys, $idDummyHotkey1, $idDummyHotkey2 Global $iWMin, $iHMin, $sIniFilePath = @TempDir & '\Mp3SearchEngine.ini', $sScriptVersion = _ScriptGetVersion() Global $sSoftTitle = 'Mp3SearchEngine' & ' v' & $sScriptVersion & ' by wakillon' Global $idTab, $iTotalIndex, $hLVRedraw, $iS = 1, $bGridState, $idEditPlayState, $idEditDownloadState Global Enum $iId_Play = 3000, $iId_Stop, $iId_Copy, $iId_Download Global $sTempDir = @TempDir & '\MSE', $sFileTemp = $sTempDir & '\StreamTmp.mp3', $hMp3Handle, $iPlaying, $iPercentLoadToPlay = 7, $iPlayingOld Global $sOutputDir = RegRead ( $sRegKeySettings, 'OutputDir' ) Global $aColumnWidth[7] = [ 50, 300, 70, 70, 80, 1000, 0 ] ; 400 Global $iMaxSave = 20 #EndRegion --- Global Variables ------------------------------ #Region ------ Init ------------------------------ _Gui() GUISetState ( @SW_DISABLE, $hGui ) $sQueryString = _AudiodumpGetQueryString() If @error Or Not $sQueryString Then Exit _ MsgBox ( 262144+16, 'Error', "Couldn't Connect to the Server !" & @CRLF & 'Error : ' & @error, 5 ) GUISetState ( @SW_ENABLE, $hGui ) $hCurlKeepAlive = Curl_Easy_Init() If Not $hCurlKeepAlive Then Exit _ MsgBox ( 262144+16, 'Error', 'Curl can not be Initialized !' & @CRLF, 5 ) $Data = $hCurlKeepAlive +5 ; any number as identify _BASS_Startup() If @error Then Exit _ MsgBox ( 262144+16, 'Error', 'Could not Load Bass.dll', 5 ) _BASS_Init ( 0, -1, 44100, $hGui, '' ) If @error Then Exit _ MsgBox ( 262144+16, 'Error', 'Could not Initialize Bass.dll', 5 ) GUICtrlSetState ( $idButtonSearch, $GUI_ENABLE ) If Not FileExists ( $sOutputDir ) Then $sOutputDir = @DesktopDir RegWrite ( $sRegKeySettings, 'OutputDir', 'REG_SZ', $sOutputDir ) EndIf DirCreate ( $sOutputDir ) DirCreate ( $sTempDir ) GUISetAccelerators ( $aAccelKeys, $hGui ) #EndRegion --- Init ------------------------------ #Region ------ Main Loop ------------------------------ While 1 #Region ------ Mp3 Downloads ------------------------------ If $hMulti_D <> 0 Then For $i = UBound ( $aRunning_D ) -1 To 1 Step -1 If $aRunning_D[$i] Then Curl_Multi_Perform ( $hMulti_D, $aRunning_D[$i] ) $CURLMsg = Curl_Multi_Info_Read ( $hMulti_D, $MsgsInQueue ) If DllStructGetData ( $CURLMsg, 'msg' ) = $CURLMSG_DONE Then $hCurReceiver = DllStructGetData ( $CURLMsg, 'easy_handle' ) $Code = DllStructGetData ( $CURLMsg, 'data' ) ; retrieve in Curl Handles Array which curl handle msg is from and delete it. $iIndex = _ArraySearch ( $ahCurls_D, $hCurReceiver, 1, 0, 0, 2 ) ; 2 comparison match if variables have same type and same value If $iIndex <> -1 Then FileClose ( $ahFiles_D[$iIndex] ) $iLVIndex = $aLVIndex_D[$iIndex] If $Code = $CURLE_OK Then $sContentType = Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_CONTENT_TYPE ) ; mp3 : Content-Type: application/octet-stream ;~ ConsoleWrite ( '+ Content Type: ' & $sContentType & @LF ) ;~ ConsoleWrite ( '+ Download Size: ' & Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_SIZE_DOWNLOAD ) & @LF ) $sContentLength = Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_CONTENT_LENGTH_DOWNLOAD ) ;~ ConsoleWrite ( '+ File Size: ' & $sContentLength & @LF ) $iResponseCode = Number ( Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_RESPONSE_CODE ) ) ;~ ConsoleWrite ( '>>>>>>>>>>>>>>>>>>>> RESPONSE_CODE : ' & $iResponseCode & @LF ) $sHeader = BinaryToString ( Curl_Data_Get ( $hCurReceiver +1 ) ) ;~ ConsoleWrite ( '>>>> Header : ' & $sHeader & @LF ) Switch $iResponseCode Case 200, 201, 202, 203, 226, 301, 302, 304, 307, 308 ; https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP If $sContentLength > 0 Or $sContentType Then ; adapt to your needs. _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Ok', 3 ) _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Complete', 4 ) Else _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Not Found', 3 ) _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Aborted', 4 ) FileDelete ( $asFilePaths_D[$iIndex] ) EndIf Case Else _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, _HttpGetStatusString ( $iResponseCode ), 3 ) _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Aborted', 4 ) FileDelete ( $asFilePaths_D[$iIndex] ) EndSwitch Else _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, Curl_Easy_StrError ( $Code ), 3 ) _GUICtrlListView_AddSubItem ( $ahListView_D[$iIndex], $iLVIndex, 'Aborted', 4 ) FileDelete ( $asFilePaths_D[$iIndex] ) EndIf Curl_Multi_Remove_Handle ( $hMulti_D, $hCurReceiver ) Curl_Easy_Cleanup ( $hCurReceiver ) Curl_Data_Cleanup ( $hCurReceiver ) Curl_Data_Cleanup ( $hCurReceiver + 1 ) $ahCurls_D[$iIndex] = 0 _ArrayDelete ( $aRunning_D, $iIndex ) _ArrayDelete ( $ahCurls_D, $iIndex ) _ArrayDelete ( $ahFiles_D, $iIndex ) _ArrayDelete ( $asFilePaths_D, $iIndex ) DllCallbackFree ( $ahProgress_D[$iIndex] ) _ArrayDelete ( $ahProgress_D, $iIndex ) _ArrayDelete ( $aUrl_D, $iIndex ) _ArrayDelete ( $aLVIndex_D, $iIndex ) _ArrayDelete ( $ahListView_D, $iIndex ) EndIf EndIf EndIf Next EndIf #EndRegion --- Mp3 Downloads ------------------------------ #Region ------ Mp3 Playing ------------------------------ If $hMulti_P <> 0 Then If $iRunning_P Then Curl_Multi_Perform ( $hMulti_P, $iRunning_P ) $CURLMsg = Curl_Multi_Info_Read ( $hMulti_P, $MsgsInQueue ) If DllStructGetData ( $CURLMsg, 'msg' ) = $CURLMSG_DONE Then $hCurReceiver = DllStructGetData ( $CURLMsg, 'easy_handle' ) $Code = DllStructGetData ( $CURLMsg, 'data' ) If $hCurReceiver = $hCurls_P Then If $Code <> $CURLE_OK Then ControlSetText ( $hGui, '', $idEditPlayState, ' Stop Playing Error ' & _HttpGetStatusString ( $Code ) ) FileClose ( $hFiles_P ) Curl_Multi_Remove_Handle ( $hMulti_P, $hCurReceiver ) Curl_Easy_Cleanup ( $hCurReceiver ) Curl_Data_Cleanup ( $hCurReceiver ) Curl_Data_Cleanup ( $hCurReceiver + 1 ) $hCurls_P = 0 $iRunning_P = 0 $hCurls_P = 0 $hFiles_P = 0 DllCallbackFree ( $hProgress_P ) $hProgress_P = 0 $fLoadProgressOld_P = 0 EndIf EndIf EndIf EndIf #EndRegion --- Mp3 Playing ------------------------------ #Region ------ Cancel Search ------------------------------ If $iCancel Then _Curl_Multi_S_Close() $sHtml = 0 $iGetSource = 0 $iCancel = 0 _GUICtrlStatusBar_SetText ( $hStatusBar, ' Search was Stopped by the User.', 0 ) EndIf #EndRegion --- Cancel Search ------------------------------ #Region ------ Source Download ------------------------------ If $hMulti_S Then Curl_Multi_Perform ( $hMulti_S, $Running ) $CURLMsg = Curl_Multi_Info_Read ( $hMulti_S, $MsgsInQueue ) If DllStructGetData ( $CURLMsg, 'msg' ) = $CURLMSG_DONE Then $hCurReceiver = DllStructGetData ( $CURLMsg, 'easy_handle' ) If $hCurReceiver = $hCurlKeepAlive Then $Code = DllStructGetData ( $CURLMsg, 'data' ) If $Code = $CURLE_OK Then ;~ ConsoleWrite ( 'Content Type: ' & Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_CONTENT_TYPE ) & @LF ) ;~ ConsoleWrite ( 'Download Size: ' & Curl_Easy_GetInfo ( $hCurReceiver, $CURLINFO_SIZE_DOWNLOAD ) & @LF ) $sHtml = BinaryToString ( Curl_Data_Get ( $Data ) ) ;~ ConsoleWrite ( '$sHtml : ' & $sHtml & @Crlf ) Else ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] Curl_Easy_StrError : ' & Curl_Easy_StrError ( $Code ) & @LF ) _Curl_Multi_S_Close() $sHtml = 0 _GUICtrlStatusBar_SetText ( $hStatusBar, ' Search Failed.', 0 ) ControlSetText ( $hGui, '', $idButtonSearch, 'Search' ) EndIf EndIf EndIf EndIf #EndRegion --- Source Download ------------------------------ #Region ------ Source Download Init ------------------------------ If $iGetSource Then _GUICtrlStatusBar_SetText ( $hStatusBar, ' Please Wait While Searching...', 0 ) _AudiodumpSetCurlOptions ( $sResearchUrl, $sReferer ) If @error Then ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] _AudiodumpSetCurlOptions Error : ' & @error & @Crlf ) $iGetSource = 0 EndIf #EndRegion --- Source Download Init ------------------------------ #Region ------ Source Extract Infos ------------------------------ If $sHtml Then $aInfos = _AudiodumpExtractInfos ( $sHtml, $sResearchUrl ) ;~ If @error Then ConsoleWrite ( '! @error _AudiodumpExtractInfos : ' & @error & @Crlf ) ; when there is only a unique page, error = -1. If IsArray ( $aInfos ) Then ; if links found. _GUICtrlStatusBar_SetText ( $hStatusBar, ' Extracting Infos...', 0 ) _GUICtrlListView_SetItemCount ( $hRetListView, _GUICtrlListView_GetItemCount ( $hRetListView ) + UBound ( $aInfos ) -2 ) ; allocate memory for the specified number of items For $i = 2 To UBound ( $aInfos ) -1 Step 1 $aSplit = StringSplit ( $aInfos[$i], '*', 1+2 ) For $j = 0 To UBound ( $aSplit ) -1 Step 1 Switch $j Case 0 ;~ ConsoleWrite ( '+->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] Url : ' & $aSplit[$j] & @Crlf ) Case 1 ;~ ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] $aSplit[$j] : ' & $aSplit[$j] & @Crlf ) $aSplit[$j] = StringReplace ( $aSplit[$j], '`', "'" ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' dont ', " don't " ) ; restore simple quotes. $aSplit[$j] = StringReplace ( $aSplit[$j], ' lets ', " let's " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' cant ', " can't " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' shes ', " she's " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' aint ', " ain't " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' didnt ', " didn't " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' im ', " i'm " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' youre ', " you're " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' ive ', " i've " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ' youll ', " you'll " ) $aSplit[$j] = StringReplace ( $aSplit[$j], ''', "'" ) $aSplit[$j] = StringReplace ( $aSplit[$j], "'", 'simplequotes' ) $aSplit[$j] = StringReplace ( $aSplit[$j], 'vk.com', '' ) $aSplit[$j] = StringStripWS ( _StringReplaceCyrillicChars ( _StringReplaceHtmlSymbolEntities ( _StringReplaceHtmlTags ( $aSplit[$j] ) ) ), 7 ) $aSplit[$j] = _StringRemoveFromStart ( $aSplit[$j], "'" ) $aSplit[$j] = _StringRemoveFromStart ( $aSplit[$j], '-' ) $aSplit[$j] = _StringRemoveFromEnd ( $aSplit[$j], '-' ) $aSplit[$j] = StringReplace ( $aSplit[$j], '- -', '-' ) Do $aSplit[$j] = StringReplace ( $aSplit[$j], '--', '-' ) Until Not @extended $aSplit[$j] = StringReplace ( $aSplit[$j], 'http', '' ) $aSplit[$j] = StringReplace ( $aSplit[$j], 'www', '' ) $aSplit[$j] = StringReplace ( $aSplit[$j], 'mp3', '' ) $aSplit[$j] = StringReplace ( $aSplit[$j], 'simplequotes', "'" ) $aSplit[$j] = _StringTitleCase ( $aSplit[$j] ) ;~ ConsoleWrite ( '+->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] Title : ' & $aSplit[$j] & @Crlf ) Case 2 ;~ ConsoleWrite ( '+->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] Duration : ' & $aSplit[$j] & @Crlf ) EndSwitch Next $iTotalIndex +=1 _GUICtrlListView_AddItems ( $hRetListView, $iTotalIndex, $aSplit[1], $aSplit[2], '', $aSplit[0], $sResearchUrl2 ) Next If $aInfos[0] Then ; continue search. $iGetSource = 1 $sResearchUrl = $aInfos[0] $sReferer = $aInfos[1] _GUICtrlStatusBar_SetText ( $hStatusBar, ' Please Wait While Searching...', 0 ) Else ; search is finished. _Curl_Multi_S_Close() ControlSetText ( $hGui, '', $idButtonSearch, 'Search' ) _GUICtrlStatusBar_SetText ( $hStatusBar, ' End Of Search.', 0 ) EndIf Else ; nothing found. _Curl_Multi_S_Close() ControlSetText ( $hGui, '', $idButtonSearch, 'Search' ) If $iTotalIndex Then _GUICtrlStatusBar_SetText ( $hStatusBar, ' End Of Search.', 0 ) Else _GUICtrlStatusBar_SetText ( $hStatusBar, ' No Match !', 0 ) $iNoMatch = 1 EndIf EndIf $sHtml = 0 $aInfos = 0 EndIf #EndRegion --- Source Extract Infos ------------------------------ #Region ------ Display Running Downloads Count ------------------------------ $iRunningDownload = UBound ( $aRunning_D ) -1 If $iRunningDownload <> $iRunningDownloadOld Then ControlSetText ( $hGui, '', $idEditRunningDownload, $iRunningDownload ) $iRunningDownloadOld = $iRunningDownload EndIf #EndRegion --- Display Running Downloads Count ------------------------------ #Region ------ Clean Multi when no Downloads Running ------------------------------ If $hMulti_D And Not $iRunningDownload Then Curl_Multi_Cleanup ( $hMulti_D ) $hMulti_D = 0 If $sSlist_D Then Curl_Slist_Free_All ( $sSlist_D ) $sSlist_D = 0 EndIf EndIf #EndRegion --- Clean Multi when no Downloads Running ------------------------------ #Region ------ Mp3 Download Add ------------------------------ If $sDownloadFileUrl Then $aSplit = StringSplit ( $sDownloadFileUrl, '*', 1+2 ) If _FileDownloadAdd ( $hLVDoubleClick, $aSplit[0], $aSplit[1] & '.mp3', $aSplit[2] ) Then ControlSetText ( $hGui, '', $idEditDownloadState, ' Download Mp3 Added ' & $aSplit[1] ) $aSplit = 0 $sDownloadFileUrl = 0 $hLVDoubleClick = 0 EndIf #EndRegion --- Mp3 Download Add ------------------------------ #Region ------ New Search Or Stop Search ------------------------------ If $iSearch Then GUICtrlSetState ( $idComboBoSearch, $GUI_DISABLE ) If GUICtrlRead ( $idButtonSearch ) = 'search' Then $sDefault = StringLower ( StringStripWS ( GUICtrlRead ( $idComboBoSearch ), 1+2 ) ) If _GuiCtrlComboAddString ( $sDefault ) Then ControlSetText ( $hGui, '', $idButtonSearch, 'Stop' ) $sDefault = _StringReplaceAccent ( $sDefault ) $sDefault = StringStripWS ( StringRegExpReplace ( $sDefault, '[[:^alnum:]]', ' ' ), 1+2+4 ) ConsoleWrite ( '-->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '][' & @HOUR & ':' & @MIN & ':' & @SEC & ':' & @MSEC & '] $sDefault : ' & $sDefault & @Crlf ) $sResearchUrl = 'http://www.audiodump.biz/music.html?' & $sQueryString & StringReplace ( $sDefault, ' ' , '+' ) ConsoleWrite ( '+->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] ResearchUrl: ' & $sResearchUrl & @Crlf ) $sResearchUrl2 = $sResearchUrl $iGetSource = 1 If Not $iFlag Then $hRetListView = _GuiTabAdd() Else GUICtrlSetData ( $aIdTabItem[1], '1 ' & _StringTitleCase ( GUICtrlRead ( $idComboBoSearch ) ) ) EndIf $iFlag = 0 $iTotalIndex = 0 Else _GUICtrlStatusBar_SetText ( $hStatusBar, 'No Query found.', 0 ) EndIf Else ControlSetText ( $hGui, '', $idButtonSearch, 'Search' ) $iCancel = 1 EndIf $iSearch = 0 GUICtrlSetState ( $idComboBoSearch, $GUI_ENABLE ) EndIf #EndRegion --- New Search Or Stop Search ------------------------------ #Region ------ Double Click Management ------------------------------ If $hLVDoubleClick <> 0 Then $sProgress = _GUICtrlListView_GetItemText ( $hLVDoubleClick, _GUICtrlListView_GetSelectedIndices ( $hLVDoubleClick ), 4 ) Select Case $sProgress = '' Or $sProgress = 'aborted' $sDownloadFileUrl = _GUICtrlListView_GetItemText ( $hLVDoubleClick, _GUICtrlListView_GetSelectedIndices ( $hLVDoubleClick ), 5 ) & '*' & _ _GUICtrlListView_GetItemText ( $hLVDoubleClick, _GUICtrlListView_GetSelectedIndices ( $hLVDoubleClick ), 1 ) & '*' & _ _GUICtrlListView_GetItemText ( $hLVDoubleClick, _GUICtrlListView_GetSelectedIndices ( $hLVDoubleClick ), 6 ) Case $sProgress = 'Complete' ControlSetText ( $hGui, '', $idEditDownloadState, ' Download Canceled, This Mp3 Was Already Downloaded !' ) $hLVDoubleClick = 0 Case StringIsDigit ( $sProgress ) ControlSetText ( $hGui, '', $idEditDownloadState, ' Download Canceled, Download of This Mp3 is Already Running !' ) $hLVDoubleClick = 0 EndSelect EndIf #EndRegion --- Double Click Management ------------------------------ #Region ------ Sort ListView ------------------------------ If $iColumn <> -1 Then _GUICtrlListView_SortItems ( $hLVToSort, $iColumn ) For $i = 1 To UBound ( $aLVIndex_D ) -1 If $ahListView_D[$i] = $hLVToSort Then $aLVIndex_D[$i] = _GuiListViewRetrieveSubItemByTxt ( $hLVToSort, $aUrl_D[$i], 5 ) Next $iColumn = -1 $hLVToSort = 0 EndIf #EndRegion --- Sort ListView ------------------------------ #Region ------ RightClick Context Menu ------------------------------ If $hLVRightClick <> 0 Then $hLVRedraw = $hLVRightClick If $hLVRightClick = GUICtrlGetHandle ( GUIGetCursorInfo ( $hGui )[4] ) Then ; if over listview. _GuiListViewSetContextMenu() If _GUICtrlMenu_IsMenu ( $hLVMenu ) Then _GUICtrlMenu_TrackPopupMenu ( $hLVMenu, $hGui ) $iSelectedIndices = _GUICtrlListView_GetSelectedIndices ( $hLVRightClick ) EndIf _GUICtrlMenu_DestroyMenu ( $hLVMenu ) $hLVMenu = 0 Else $hLVRightClick = 0 EndIf EndIf If $iContextMenuId Then Switch $iContextMenuId Case $iId_Play _FilePlayStop() If $iSelectedIndices <> -1 Then $sTitlePlayed = '[' & _GUICtrlListView_GetItemText ( $hLVRightClick, $iSelectedIndices, 0 ) & '] ' & _GUICtrlListView_GetItemText ( $hLVRightClick, $iSelectedIndices, 1 ) $iPlaying = _FilePlayAdd ( _GUICtrlListView_GetItemText ( $hLVRightClick, $iSelectedIndices, 5 ), _GUICtrlListView_GetItemText ( $hLVRightClick, $iSelectedIndices, 6 ) ) EndIf ControlSetText ( $hGui, '', $idEditPlayState, ' Preloading ' & $sTitlePlayed ) Case $iId_Stop _FilePlayStop() ControlSetText ( $hGui, '', $idEditPlayState, ' Stop Playing. ' & $sTitlePlayed ) Case $iId_Copy ClipPut ( _GUICtrlListView_GetItemText ( $hLVRightClick, $iSelectedIndices, 1 ) ) _GUICtrlStatusBar_SetText ( $hStatusBar, ' Title was copied to the Clipboard.', 0 ) Case $iId_Download $hLVDoubleClick = GUICtrlGetHandle ( $aIdTabListView[ _SendMessage ( $hTab, $TCM_GETCURSEL, 0, 0 ) +1 ] ) EndSwitch $iContextMenuId = 0 $hLVRightClick = 0 EndIf #EndRegion --- RightClick Context Menu ------------------------------ #Region ------ End Playing ------------------------------ If $iPlayingOld And Not _BASS_ChannelIsActive ( $hMp3Handle ) Then ControlSetText ( $hGui, '', $idEditPlayState, ' End Of ' & $sTitlePlayed ) $iPlayingOld = 0 EndIf #EndRegion --- End Playing ------------------------------ #Region ------ Start Playing ------------------------------ If $iPlaying = 1 And $fLoadProgressOld_P > $iPercentLoadToPlay Then $iPlayingOld = 0 $hMp3Handle = _BASS_StreamCreateFile ( False, $sFileTemp, 0, 0, BitOR ( $BASS_STREAM_PRESCAN, $BASS_STREAM_AUTOFREE ) ) $iBassError = @error If $iBassError = $BASS_OK And $hMp3Handle Then _BASS_ChannelPlay ( $hMp3Handle, True ) $iBassError = @error If $iBassError = $BASS_OK Then ControlSetText ( $hGui, '', $idEditPlayState, ' Playing. ' & $sTitlePlayed ) $iPlayingOld = 1 Else ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] _BASS_ChannelPlay $iBassError : ' & $iBassError & @Crlf ) ControlSetText ( $hGui, '', $idEditPlayState, ' Error ' & $iBassError & ' on Playing' & $sTitlePlayed ) EndIf Else ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] _BASS_StreamCreateFile $iBassError : ' & $iBassError & @Crlf ) ControlSetText ( $hGui, '', $idEditPlayState, ' Error ' & $iBassError & ' on Creating Stream ' & $sTitlePlayed ) EndIf $iPlaying = 0 ; simple way for redraw listview Items(titles) in column 2 for reset colored previous title played. $iS = -$iS _SendMessage ( $hLVRedraw, $LVM_SETCOLUMNWIDTH, 1, _GUICtrlListView_GetColumnWidth ( $hLVRedraw, 1 ) + $iS ) $hLVRedraw = 0 EndIf #EndRegion --- Start Playing ------------------------------ If $iChangeDir = 1 Then $sSelectFolder = FileSelectFolder ( 'Select MP3 Output Dir', '', 3 ) If FileExists ( $sSelectFolder ) Then $sOutputDir = $sSelectFolder RegWrite ( $sRegKeySettings, 'OutputDir', 'REG_SZ', $sOutputDir ) _GUICtrlStatusBar_SetText ( $hStatusBar, ' Mp3 Directory is Set to ' & $sOutputDir, 0 ) Else _GUICtrlStatusBar_SetText ( $hStatusBar, ' No Changes, Mp3 Directory is ' & $sOutputDir, 0 ) EndIf $iChangeDir = 0 EndIf If $iExit Then _Exit() Sleep ( 10 ) WEnd #EndRegion --- Main Loop ------------------------------ Func _AudiodumpExtractInfos ( $sHtml, $sUrl ) Local $aLinks = 0, $aTable, $aInfos, $S, $T, $error = 0 ; ($error for debug) Local $aNext = _StringBetween ( $sHtml, 'Total records:', 'table>' ) If Not @error Then $T = StringInStr ( $aNext[0], '<<<' ) <> 0 ; detect if nexts or last page $aNext = StringRegExp ( $aNext[0], '(?s)(?i)
' ) If Not @error Then $aInfos = StringRegExp ( $aTable[0], '(?s)(?i).
', '*' ), ' (', '*' ) Next If Not ( $T And $S ) Then $aLinks[0] = $aNext ; store next page url Else $error = -1 EndIf Else $error = -2 EndIf Else $error = -3 EndIf Else $error = -4 EndIf If IsArray ( $aLinks ) Then _ArrayInsert ( $aLinks, 1, $sUrl ) ; store next page referer Return SetError ( $error, 0, $aLinks ) EndFunc ;==> _AudiodumpExtractInfos() Func _AudiodumpGetQueryString() Local $hCurl = Curl_Easy_Init() If Not $hCurl Then Return SetError ( -1, 0, 0 ) _GUICtrlStatusBar_SetText ( $hStatusBar, 'Please Wait while trying to Connect to audiodump.', 0 ) Local $Data = 1, $Code Curl_Easy_Setopt ( $hCurl, $CURLOPT_URL, 'http://www.audiodump.com/' ) Curl_Easy_Setopt ( $hCurl, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' ) Curl_Easy_Setopt ( $hCurl, $CURLOPT_FOLLOWLOCATION, 1 ) Curl_Easy_Setopt ( $hCurl, $CURLOPT_ACCEPT_ENCODING, '' ) ; support all encodings. Curl_Easy_Setopt ( $hCurl, $CURLOPT_TIMEOUT, 10 ) ; connection timeout set to 30 Seconds. Curl_Easy_Setopt ( $hCurl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $hCurl, $CURLOPT_WRITEDATA, $Data ) $Code = Curl_Easy_Perform ( $hCurl ) Local $sQuery, $error ; ($error for debug) If $Code = $CURLE_OK Then Local $aForm, $aValue1, $aValue2, $aValue3, $sHtml $sHtml = BinaryToString ( Curl_Data_Get ( $Data ) ) $aForm = _StringBetween ( $sHtml, 'FORM method', 'FORM>' ) If Not @error Then $aValue1 = _StringBetween ( $aForm[0], 'hidden" name="', '"' ) If Not @error Then $aValue2 = _StringBetween ( $aForm[0], 'value="', '"' ) If Not @error Then $aValue3 = _StringBetween ( $aForm[0], 'tfield" type="text" name="', '"' ) If Not @error Then $sQuery = $aValue1[0] & '=' & $aValue2[0] & '&' & $aValue1[1] & '=' & $aValue2[1] & '&' & $aValue3[0] & '=' Else $error = -2 EndIf Else $error = -3 EndIf Else $error = -4 EndIf Else $error = -5 EndIf Else If Curl_Easy_StrError ( $Code ) Then $error = -6 EndIf Curl_Data_Cleanup ( $Data ) Curl_Easy_Cleanup ( $hCurl ) _GUICtrlStatusBar_SetText ( $hStatusBar, '', 0 ) Return SetError ( $error, 0, $sQuery ) EndFunc ;==> _AudiodumpGetQueryString() Func _AudiodumpSetCurlOptions ( $sUrl, $sReferer='' ) If $Data Then Curl_Data_Cleanup ( $Data ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_URL, $sUrl ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_FRESH_CONNECT, 1 ) If $sReferer Then Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_REFERER, $sReferer ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_FOLLOWLOCATION, 1 ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_ACCEPT_ENCODING, '' ) ; support all encodings. Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_WRITEDATA, $Data ) Curl_Easy_Setopt ( $hCurlKeepAlive, $CURLOPT_SSL_VERIFYPEER, 0 ) If $hMulti_S Then _Curl_Multi_S_Close() $hMulti_S = Curl_Multi_Init() If Not $hMulti_S Then Return SetError ( 1, 0, 0 ) Curl_Multi_Add_Handle ( $hMulti_S, $hCurlKeepAlive ) EndFunc ;==> _AudiodumpSetCurlOptions() Func _Base64Decode ( $input_string ) ; by trancexx Local $struct = DllStructCreate ( 'int' ) Local $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', 0, 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 ) If @error Or Not $a_Call[0] Then Return SetError ( 1, 0, '' ) Local $a = DllStructCreate ( 'byte[' & DllStructGetData ( $struct, 1 ) & ']' ) $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', DllStructGetPtr ( $a ), 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 ) If @error Or Not $a_Call[0] Then Return SetError ( 2, 0, '' ) Return DllStructGetData ( $a, 1 ) EndFunc ;==> _Base64Decode() Func _BASS_ChannelIsActive ( $handle ) Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_ChannelIsActive', 'DWORD', $handle ) If @error Then Return SetError ( 1, 1, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_ChannelIsActive() Func _BASS_ChannelPlay ( $handle, $restart ) Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_ChannelPlay', 'DWORD', $handle, 'int', $restart ) If @error Then Return SetError ( 1, 1, 0 ) If $aBASS_Ret[0] = 0 Then Return SetError ( _BASS_ErrorGetCode(), 0, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_ChannelPlay() Func _BASS_ChannelStop ( $handle ) Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_ChannelStop', 'DWORD', $handle ) If @error Then Return SetError ( 1, 1, 0 ) If $aBASS_Ret[0] = 0 Then Return SetError ( _BASS_ErrorGetCode(), 0, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_ChannelStop() Func _BASS_ErrorGetCode() Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_ErrorGetCode' ) If @error Then Return SetError ( 1, 0, -1 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_ErrorGetCode() Func _BASS_Free() Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_Free' ) If @error Then Return SetError ( 1, 1, 0 ) If $aBASS_Ret[0] = 0 Then Return SetError ( _BASS_ErrorGetCode(), 0, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_Free() Func _BASS_Init ( $flags, $device = -1, $freq = 44100, $win = 0, $clsid = '' ) Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'int', 'BASS_Init', 'int', $device, 'dword', $freq, 'dword', $flags, 'hwnd', $win, 'hwnd', $clsid ) If @error Then Return SetError ( 1, 1, 0 ) If $aBASS_Ret[0] = 0 Then Return SetError ( _BASS_ErrorGetCode(), 0, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_Init() Func _BASS_Startup() $hBassDll = MemoryDllOpen ( Bassdll() ) Return SetError ( $hBassDll = -1, 0, $hBassDll ) EndFunc ;==> _BASS_Startup() Func _BASS_StreamCreateFile ( $mem, $file, $offset, $length, $flags ) Local $tpFile = 'ptr' If IsString ( $file ) Then $tpFile = 'wstr' Local $aBASS_Ret = MemoryDllCall ( $hBassDll, 'dword', 'BASS_StreamCreateFile', 'int', $mem, $tpFile, $file, 'uint64', $offset, 'uint64', $length, 'DWORD', BitOR ( $flags, $BASS_UNICODE ) ) If @error Then Return SetError ( 1, 1, 0 ) If $aBASS_Ret[0] = 0 Then Return SetError ( _BASS_ErrorGetCode(), 0, 0 ) Return $aBASS_Ret[0] EndFunc ;==> _BASS_StreamCreateFile() Func _BinaryCall_Alloc ( $Code, $Padding = 0 ) Local $Length = BinaryLen ( $Code ) + $Padding Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'ptr', 'VirtualAlloc', 'ptr', 0, 'ulong_ptr', $Length, 'dword', 0x1000, 'dword', 0x40 ) If @Error Or Not $Ret[0] Then Return SetError ( 1, @Error, 0 ) If BinaryLen ( $Code ) Then Local $Buffer = DllStructCreate ( 'byte[' & $Length & ']', $Ret[0] ) DllStructSetData ( $Buffer, 1, $Code ) EndIf Return $Ret[0] EndFunc ;==> _BinaryCall_Alloc() Func _BinaryCall_Base64Decode ( $Src ) Static $CodeBase If Not $CodeBase Then $CodeBase = _BinaryCall_Create ( '0x55B9FF00000089E531C05756E8F10000005381EC0C0100008B55088DBDF5FEFFFFF3A4E9C00000003B45140F8FC20000000FB65C0A028A9C1DF5FEFFFF889DF3FEFFFF0FB65C0A038A9C1DF5FEFFFF889DF2FEFFFF0FB65C0A018985E8FEFFFF0FB69C1DF5FEFFFF899DECFEFFFF0FB63C0A89DE83E630C1FE040FB6BC3DF5FEFFFFC1E70209FE8B7D1089F3881C074080BDF3FEFFFF63745C0FB6B5F3FEFFFF8BBDECFEFFFF8B9DE8FEFFFF89F083E03CC1E704C1F80209F88B7D1088441F0189D883C00280BDF2FEFFFF6374278A85F2FEFFFFC1E60683C10483E03F09F088441F0289D883C0033B4D0C0F8C37FFFFFFEB0231C081C40C0100005B5E5F5DC35EC3E8F9FFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E0000003F3435363738393A3B3C3D00000063000000000102030405060708090A0B0C0D0E0F101112131415161718190000000000001A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233', '', 132, True, False ) If Not $CodeBase Then Return SetError ( 1, 0, Binary ( '' ) ) EndIf $Src = String ( $Src ) Local $SrcLen = StringLen ( $Src ) Local $SrcBuf = DllStructCreate ( 'char[' & $SrcLen & ']' ) DllStructSetData ( $SrcBuf, 1, $Src ) Local $DstLen = Int ( ( $SrcLen + 2 ) / 4 ) * 3 + 1 Local $DstBuf = DllStructCreate ( 'byte[' & $DstLen & ']' ) Local $Ret = DllCallAddress ( 'uint:cdecl', $CodeBase, 'ptr', DllStructGetPtr ( $SrcBuf ), 'uint', $SrcLen, 'ptr', DllStructGetPtr ( $DstBuf ), 'uint', $DstLen ) If $Ret[0] = 0 Then Return SetError ( 2, 0, Binary ( '' ) ) Return BinaryMid ( DllStructGetData ( $DstBuf, 1 ), 1, $Ret[0] ) EndFunc ;==> _BinaryCall_Base64Decode() Func _BinaryCall_CodePrepare ( $Code ) If Not $Code Then Return '' If IsBinary ( $Code ) Then Return $Code $Code = String ( $Code ) If StringLeft ( $Code, 2 ) = '0x' Then Return Binary ( $Code ) If StringIsXDigit ( $Code ) Then Return Binary ( '0x' & $Code ) Return _BinaryCall_LzmaDecompress ( _BinaryCall_Base64Decode ( $Code ) ) EndFunc ;==> _BinaryCall_CodePrepare() Func _BinaryCall_Create ( $Code, $Reloc = '', $Padding = 0, $ReleaseOnExit = True, $LibraryImport = True ) Local $BinaryCode = _BinaryCall_CodePrepare ( $Code ) If Not $BinaryCode Then Return SetError ( 1, _BinaryCall_LastError ( 'Invalid code' ), 0 ) Local $BinaryCodeLen = BinaryLen ( $BinaryCode ) Local $TotalCodeLen = $BinaryCodeLen + $Padding Local $CodeBase = _BinaryCall_Alloc ( $BinaryCode, $Padding ) If Not $CodeBase Then Return SetError ( 2, _BinaryCall_LastError ( 'Unable to allocate memory block' ), 0 ) If $Reloc Then $Reloc = _BinaryCall_CodePrepare ( $Reloc ) If Not $Reloc Then Return SetError ( 3, _BinaryCall_LastError ( 'Invalid relocation table' ), 0 ) _BinaryCall_Relocation ( $CodeBase, $Reloc ) EndIf If $LibraryImport Then If Not _BinaryCall_ImportLibrary ( $CodeBase, $BinaryCodeLen ) Then _BinaryCall_Free ( $CodeBase ) Return SetError ( 4, 0, 0 ) EndIf EndIf If $ReleaseOnExit Then _BinaryCall_ReleaseOnExit ( $CodeBase ) EndIf Return SetError ( 0, $TotalCodeLen, $CodeBase ) EndFunc ;==> _BinaryCall_Create() Func _BinaryCall_DoRelease() _BinaryCall_ReleaseOnExit_Handle() EndFunc ;==> _BinaryCall_DoRelease() Func _BinaryCall_Free ( $Ptr ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'bool', 'VirtualFree', 'ptr', $Ptr, 'ulong_ptr', 0, 'dword', 0x8000 ) If @Error Or $Ret[0] = 0 Then $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'bool', 'GlobalFree', 'ptr', $Ptr ) If @Error Or $Ret[0] <> 0 Then Return SetError ( 1, @Error, False ) EndIf Return True EndFunc ;==> _BinaryCall_Free() Func _BinaryCall_GetProcAddress ( $Module, $Proc ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'ptr', 'GetProcAddress', 'ptr', $Module, 'str', $Proc ) If @Error Or Not $Ret[0] Then Return SetError ( 1, @Error, 0 ) Return $Ret[0] EndFunc ;==> _BinaryCall_GetProcAddress() Func _BinaryCall_ImportLibrary ( $Base, $Length ) Static $HasMemoryDll = IsFunc(Execute ( '__MemoryModule_RuntimeLoader' ) ) Local $JmpBin, $JmpOff, $JmpLen, $DllName, $ProcName $JmpBin = Binary ( '0xB8FFFFFFFFFFE0' ) $JmpOff = 1 $JmpLen = BinaryLen ( $JmpBin ) Do Local $Ptr = _BinaryCall_MemorySearch ( $Base, $Length, $JmpBin ) If $Ptr = 0 Then ExitLoop Local $StringPtr = $Ptr + $JmpLen Local $StringLen = _BinaryCall_lstrlenA ( $StringPtr ) If Not $StringLen Then Return SetError ( 3, _BinaryCall_LastError ( 'Invalid import table' ), False ) Local $String = DllStructGetData ( DllStructCreate ( 'char[' & $StringLen & ']', $StringPtr ), 1 ) Local $Split = StringSplit ( $String, '|' ) If $Split[0] = 1 Then $ProcName = $Split[1] ElseIf $Split[0] = 2 Then If $Split[1] Then $DllName = $Split[1] $ProcName = $Split[2] EndIf If $DllName And $ProcName Then Local $Proc = 0, $Handle = _BinaryCall_LoadLibrary ( $DllName ) If Not $Handle Then Return SetError ( 1, _BinaryCall_LastError ( 'LoadLibrary fail on ' & $DllName ), False ) $Proc = _BinaryCall_GetProcAddress ( $Handle, $ProcName ) If Not $Proc Then Return SetError ( 2, _BinaryCall_LastError ( 'GetProcAddress failed on ' & $ProcName ), False ) DllStructSetData(DllStructCreate ( 'ptr', $Ptr + $JmpOff ), 1, $Proc ) EndIf Local $Diff = Int ( $Ptr - $Base + $JmpLen + $StringLen + 1 ) $Base += $Diff $Length -= $Diff Until $Length <= $JmpLen Return True EndFunc ;==> _BinaryCall_ImportLibrary() Func _BinaryCall_IsBadReadPtr ( $Ptr, $Length ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'int', 'IsBadReadPtr', 'ptr', $Ptr, 'uint_ptr', $Length ) If @Error Then Return SetError ( 1, @Error, 0 ) Return $Ret[0] EndFunc ;==> _BinaryCall_IsBadReadPtr() Func _BinaryCall_LastError ( $Error = Default ) Static $LastError If IsKeyword ( $Error ) Then Return $LastError $LastError = $Error EndFunc ;==> _BinaryCall_LastError() Func _BinaryCall_LoadLibrary ( $Filename ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'handle', 'LoadLibraryW', 'wstr', $Filename ) If @Error Then Return SetError ( 1, @Error, 0 ) Return $Ret[0] EndFunc ;==> _BinaryCall_LoadLibrary() Func _BinaryCall_lstrlenA ( $Ptr ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'int', 'lstrlenA', 'ptr', $Ptr ) If @Error Then Return SetError ( 1, @Error, 0 ) Return $Ret[0] EndFunc ;==> _BinaryCall_lstrlenA() Func _BinaryCall_LzmaDecompress ( $Src ) Static $CodeBase If Not $CodeBase Then $CodeBase = _BinaryCall_Create ( _BinaryCall_Base64Decode ( 'VYnlVzH/VlOD7EyLXQiKC4D54A+HxQAAADHA6wWD6S2I0ID5LI1QAXfziEXmMcDrBYPpCYjQgPkIjVABd/OIReWLRRSITeSLUwkPtsmLcwWJEA+2ReUBwbgAAwAA0+CNhABwDgAAiQQk6EcEAACJNCSJRdToPAQAAItV1InHi0Xkhf+JArgBAAAAdDaF9nQyi0UQg8MNiRQkiXQkFIl8JBCJRCQYjUXgiUQkDItFDIlcJASD6A2JRCQI6CkAAACLVdSJRdSJFCToAQQAAItF1IXAdAqJPCQx/+jwAwAAg8RMifhbXl9dw1dWU1WJ5YtFJAFFKFD8i3UYAXUcVot1FK2SUopO/oPI/9Pg99BQiPGDyP/T4PfQUADRifeD7AwpwEBQUFBQUFcp9laDy/+4AAMAANPgjYg2BwAAuAAEAATR6fOragVZ6MoCAADi+Yt9/ItF8Ct9JCH4iUXosADoywIAAA+FhQAAAIpN9CN97NPngOkI9tnT7lgB916NPH/B5wg8B1qNjH5sDgAAUVa+AAEAAFCwAXI0i338K33cD7Y/i23M0eeJ8SH+AfGNbE0A6JgCAACJwcHuCIPhATnOvgABAAB1DjnwctfrDIttzOh5AgAAOfBy9FqD+gSJ0XIJg/oKsQNyArEGKcpS60mwwOhJAgAAdRRYX1pZWln/NCRRUrpkBgAAsQDrb7DM6CwCAAB1LLDw6BMCAAB1U1g8B7AJcgKwC1CLdfwrddw7dSQPgs8BAACsi338qumOAQAAsNjo9wEAAIt12HQbsOTo6wEAAIt11HQJi3XQi03UiU3Qi03YiU3Ui03ciU3YiXXcWF9ZumgKAACxCAH6Ulc8B4jIcgIEA1CLbczovAEAAHUUi0Xoi33MweADKclqCF6NfEcE6zWLbcyDxQLomwEAAHUYi0Xoi33MweADaghZaghejbxHBAEAAOsQvwQCAAADfcxqEFm+AAEAAIlN5CnAQIn96GYBAACJwSnxcvMBTeSDfcQED4OwAAAAg0XEB4tN5IP5BHIDagNZi33IweEGKcBAakBejbxPYAMAAIn96CoBAACJwSnxcvOJTeiJTdyD+QRyc4nOg2XcAdHug03cAk6D+Q5zGbivAgAAKciJ8dJl3ANF3NHgA0XIiUXM6y2D7gToowAAANHr0WXcOV3gcgb/RdwpXeBOdei4RAYAAANFyIlFzMFl3ARqBF4p/0eJ+IttzOi0AAAAqAF0Awl93NHnTnXs6wD/RdyLTeSDwQKLffyJ+CtFJDlF3HdIif4rddyLVSisqjnXcwNJdfeJffwPtvA7fSgPgnH9///oKAAAACnAjWwkPItVIIt1+Ct1GIkyi1Usi338K30kiTrJW15fw15YKcBA69qB+wAAAAFyAcPB4whWi3X4O3Ucc+SLReDB4AisiUXgiXX4XsOLTcQPtsDB4QQDRegByOsGD7bAA0XEi23IjWxFACnAjWxFAIH7AAAAAXMci0wkOMFkJCAIO0wkXHOcihH/RCQ4weMIiFQkIInZD7dVAMHpCw+vyjlMJCBzF4nLuQAIAAAp0cHpBWYBTQABwI1sJEDDweoFKUwkICnLZilVAAHAg8ABjWwkQMO4///////gbXN2Y3J0LmRsbHxtYWxsb2MAuP//////4GZyZWUA' ) ) If Not $CodeBase Then Return SetError(1, 0, Binary ( '' ) ) EndIf $Src = Binary ( $Src ) Local $SrcLen = BinaryLen ( $Src ) Local $SrcBuf = DllStructCreate ( 'byte[' & $SrcLen & ']' ) DllStructSetData ( $SrcBuf, 1, $Src ) Local $Ret = DllCallAddress ( 'ptr:cdecl', $CodeBase, 'ptr', DllStructGetPtr ( $SrcBuf ), 'uint_ptr', $SrcLen, 'uint_ptr*', 0, 'uint*', 0 ) If $Ret[0] Then Local $DstBuf = DllStructCreate ( 'byte[' & $Ret[3] & ']', $Ret[0] ) Local $Output = DllStructGetData ( $DstBuf, 1 ) DllCall ( $__BinaryCall_Msvcrtdll, 'none:cdecl', 'free', 'ptr', $Ret[0] ) Return $Output EndIf Return SetError(2, 0, Binary ( '' ) ) EndFunc ;==> _BinaryCall_LzmaDecompress() Func _BinaryCall_MemorySearch ( $Ptr, $Length, $Binary ) Static $CodeBase If Not $CodeBase Then $CodeBase = _BinaryCall_Create ( '0x5589E58B4D14578B4508568B550C538B7D1085C9742139CA721B29CA8D341031D2EB054239CA740F8A1C17381C1074F34039F076EA31C05B5E5F5DC3', '', 0, True, False ) If Not $CodeBase Then Return SetError ( 1, 0, 0 ) EndIf $Binary = Binary ( $Binary ) Local $Buffer = DllStructCreate ( 'byte[' & BinaryLen ( $Binary ) & ']' ) DllStructSetData ( $Buffer, 1, $Binary ) Return DllCallAddress ( 'ptr:cdecl', $CodeBase, 'ptr', $Ptr, 'uint', $Length, 'ptr', DllStructGetPtr ( $Buffer ), 'uint', DllStructGetSize ( $Buffer ) )[0] EndFunc ;==> _BinaryCall_MemorySearch() Func _BinaryCall_RegionSize ( $Ptr ) Local $Buffer = DllStructCreate ( 'ptr;ptr;dword;uint_ptr;dword;dword;dword' ) Local $Ret = DllCall ( $__BinaryCall_Kernel32dll, 'int', 'VirtualQuery', 'ptr', $Ptr, 'ptr', DllStructGetPtr ( $Buffer ), 'uint_ptr', DllStructGetSize ( $Buffer ) ) If @Error Or $Ret[0] = 0 Then Return SetError ( 1, @Error, 0 ) Return DllStructGetData ( $Buffer, 4 ) EndFunc ;==> _BinaryCall_RegionSize() Func _BinaryCall_ReleaseOnExit ( $Ptr ) OnAutoItExitRegister ( '_BinaryCall_DoRelease' ) _BinaryCall_ReleaseOnExit_Handle ( $Ptr ) EndFunc ;==> _BinaryCall_ReleaseOnExit() Func _BinaryCall_ReleaseOnExit_Handle ( $Ptr = Default ) Static $PtrList If @NumParams = 0 Then If IsArray ( $PtrList ) Then For $i = 1 To $PtrList[0] _BinaryCall_Free ( $PtrList[$i] ) Next EndIf Else If Not IsArray ( $PtrList ) Then Local $InitArray[1] = [0] $PtrList = $InitArray EndIf If IsPtr($Ptr) Then Local $Array = $PtrList Local $Size = UBound ( $Array ) ReDim $Array[$Size + 1] $Array[$Size] = $Ptr $Array[0] += 1 $PtrList = $Array EndIf EndIf EndFunc ;==> _BinaryCall_ReleaseOnExit_Handle() Func _BinaryCall_Relocation ( $Base, $Reloc ) Local $Size = Int ( BinaryMid ( $Reloc, 1, 2 ) ) For $i = 3 To BinaryLen ( $Reloc ) Step $Size Local $Offset = Int ( BinaryMid ( $Reloc, $i, $Size ) ) Local $Ptr = $Base + $Offset DllStructSetData ( DllStructCreate ( 'ptr', $Ptr ), 1, DllStructGetData ( DllStructCreate ( 'ptr', $Ptr ), 1 ) + $Base ) Next EndFunc ;==> _BinaryCall_Relocation() Func _BinaryCall_SymbolFind ( $CodeBase, $Identify, $Length, $BeforeJump = False ) Local $Ptr $Identify = Binary ( $Identify ) If _BinaryCall_IsBadReadPtr ( $CodeBase, $Length ) Then Return SetError ( 2, 0, 0 ) If $BeforeJump Then $Ptr = _BinaryCall_MemorySearch ( $CodeBase, $Length, $Identify & Binary ( '0xE9' ) ) If $Ptr Then Return $Ptr + BinaryLen ( $Identify ) $Ptr = _BinaryCall_MemorySearch ( $CodeBase, $Length, $Identify & Binary ( '0xEB' ) ) If $Ptr Then Return $Ptr + BinaryLen ( $Identify ) Else $Ptr = _BinaryCall_MemorySearch ( $CodeBase, $Length, $Identify ) If $Ptr Then Return $Ptr + BinaryLen ( $Identify ) EndIf Return SetError ( 1, 0, 0 ) EndFunc ;==> _BinaryCall_SymbolFind() Func _BinaryCall_SymbolList ( $CodeBase, $Symbol ) If UBound ( $Symbol, 0 ) <> 1 Then Return SetError ( 1, _BinaryCall_LastError ( 'Invalid symbol array' ), 0 ) Local $Tag = '' For $i = 0 To UBound ( $Symbol ) - 1 $Tag &= 'ptr ' & $Symbol[$i] & ';' Next Local $SymbolList = DllStructCreate ( $Tag ) If @Error Then Return SetError ( 1, _BinaryCall_LastError ( 'Invalid symbol' ), 0 ) Local $Length = _BinaryCall_RegionSize ( $CodeBase ) If @Error Or Not $Length Then Return SetError ( 1, _BinaryCall_LastError ( 'Invalid codebase' ), 0 ) For $i = 0 To UBound ( $Symbol ) - 1 Local $Locate = _BinaryCall_SymbolFind ( $CodeBase, $Symbol[$i], $Length, True ) If @Error Then Return SetError ( 1, _BinaryCall_LastError ( "Unable to find symbol: '" & $Symbol[$i] & "'" ), 0 ) DllStructSetData ( $SymbolList, $Symbol[$i], $Locate ) $Length -= $Locate - $CodeBase $CodeBase = $Locate Next Return $SymbolList EndFunc ;==> _BinaryCall_SymbolList() Func _Curl_Multi_S_Close() Curl_Multi_Remove_Handle ( $hMulti_S, $hCurlKeepAlive ) Curl_Multi_Cleanup ( $hMulti_S ) $hMulti_S = 0 $iGetSource = 0 EndFunc ;==> _Curl_Multi_S_Close() Func _Exit() Local $iDownloads = UBound ( $aRunning_D ) -1 If $iDownloads And MsgBox ( 262144+4+48, 'Confirm', @CRLF & $iDownloads & ' Downloads are Running.' & @CRLF & 'Are you sure to Quit ?' & @CRLF, 6, $hGui ) <> 6 Then _GUICtrlStatusBar_SetText ( $hStatusBar, '', 0 ) $iExit = 0 Return EndIf If _BASS_ChannelIsActive ( $hMp3Handle ) Then _FilePlayStop() _BASS_Free() If $hBassDll <> -1 Then MemoryDllClose ( $hBassDll ) $hBassDll = 0 For $i = 1 To UBound ( $aIdTabListView ) -1 _GUICtrlListView_UnRegisterSortCallBack ( GUICtrlGetHandle ( $aIdTabListView[$i] ) ) Next ; save 20 ($iMaxSave) last query strings. If UBound ( $aQueries ) -1 > $iMaxSave Then _ArrayReverse ( $aQueries, 1 ) For $i = UBound ( $aQueries ) -1 To 1 Step -1 _ArrayDelete ( $aQueries, $i ) If UBound ( $aQueries ) -1 <= $iMaxSave Then ExitLoop Next _ArrayReverse ( $aQueries, 1 ) EndIf _FileWriteFromArray ( $sIniFilePath, $aQueries, 1, Default, @CRLF ) ;~ ShellExecute ( $sIniFilePath ) $aQueries = 0 GUIDelete ( $hGui ) If $hMulti_D Then For $i = 1 To UBound ( $ahCurls_D ) -1 If $aRunning_D[$i] Then FileClose ( $ahFiles_D[$i] ) FileDelete ( $asFilePaths_D[$i] ) ; delete no finished download files. EndIf If $ahCurls_D[$i] Then Curl_Multi_Remove_Handle ( $hMulti_D, $ahCurls_D[$i] ) Curl_Data_Cleanup ( $ahCurls_D[$i] ) Curl_Data_Cleanup ( $ahCurls_D[$i] + 1 ) Curl_Easy_Cleanup ( $ahCurls_D[$i] ) ; last function to call for an easy session. $ahCurls_D[$i] = 0 If $ahProgress_D[$i] Then DllCallbackFree ( $ahProgress_D[$i] ) EndIf Next $ahCurls_D = 0 Curl_Multi_Cleanup ( $hMulti_D ) $hMulti_D = 0 EndIf If $sSlist_D Then Curl_Slist_Free_All ( $sSlist_D ) If $hMulti_S Then _Curl_Multi_S_Close() If $Data Then Curl_Data_Cleanup ( $Data ) If $hCurlKeepAlive Then Curl_Easy_Cleanup ( $hCurlKeepAlive ) DirRemove ( $sTempDir ) Exit EndFunc ;==> _Exit() Func _FileDownloadAdd ( $hListView, $sUrl, $sFileName='', $sReferer='', $iBufferSize=$CURL_MAX_WRITE_SIZE ) If UBound ( $aRunning_D ) -1 >= Number ( GUICtrlRead ( $idComboBoMaxDownload ) ) Then ControlSetText ( $hGui, '', $idEditDownloadState, ' Download Canceled, Max Download Limit Reached !' ) Return EndIf $sUrl = StringStripWS ( $sUrl, 1+2 ) Local $Curl = Curl_Easy_Init() If $Curl Then DirCreate ( $sOutputDir ) If Not $sFileName Then $sFileName = 'File.unknown' Local $sFreePath = _FileGetFreePath ( $sOutputDir & '\' & $sFileName ) Local $hFile = FileOpen ( $sFreePath, 2 +16 ) If Not $sSlist_D Then $sSlist_D = Curl_Slist_Append ( $sSlist_D, 'Accept: */*' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_URL, $sUrl ) Curl_Easy_Setopt ( $Curl, $CURLOPT_FRESH_CONNECT, 1 ) ; force the use of a new connection instead of a cached one. Curl_Easy_Setopt ( $Curl, $CURLOPT_TIMEOUT, 5*60 ) ; download timeout set to 5 Minutes. Curl_Easy_Setopt ( $Curl, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_MAXFILESIZE, 20*1024*1024 ) ; CURLOPT_MAXFILESIZE - The maximum file size in bytes allowed to download is limited to 20 Mo. If $sReferer Then Curl_Easy_Setopt ( $Curl, $CURLOPT_REFERER, $sReferer ) Curl_Easy_Setopt ( $Curl, $CURLOPT_ACCEPT_ENCODING, '' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_FOLLOWLOCATION, 1 ) Curl_Easy_Setopt ( $Curl, $CURLOPT_NOPROGRESS, 0 ) Local $hProgress = DllCallbackRegister ( '_FileDownloadProgress', 'uint:cdecl', 'int;double;double;double;double' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_PROGRESSFUNCTION, DllCallbackGetPtr ( $hProgress ) ) Curl_Easy_Setopt ( $Curl, $CURLOPT_PROGRESSDATA, $hProgress ) ; set dlIdx instead of clientp. Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEFUNCTION, Curl_FileWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEDATA, $hFile ) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERDATA, $Curl + 1 ) Curl_Easy_Setopt ( $Curl, $CURLOPT_SSL_VERIFYPEER, 0 ) ; for avoid error about SSL peer certificate or SSH remote key when using https urls. If $iBufferSize > $CURL_MAX_WRITE_SIZE Then $iBufferSize = $CURL_MAX_WRITE_SIZE Curl_Easy_Setopt ( $Curl, $CURLOPT_BUFFERSIZE, $iBufferSize ) ; Set buffer size. ($CURL_MAX_WRITE_SIZE = 16384) Curl_Easy_Setopt ( $Curl, $CURLOPT_HTTPHEADER, $sSlist_D ) If Not $hMulti_D Then $hMulti_D = Curl_Multi_Init() If $hMulti_D Then Curl_Multi_Add_Handle ( $hMulti_D, $Curl ) ; if all is ok then : _ArrayAdd ( $ahCurls_D, $Curl ) _ArrayAdd ( $ahFiles_D, $hFile ) _ArrayAdd ( $asFilePaths_D, $sFreePath ) _ArrayAdd ( $aRunning_D, 1 ) _ArrayAdd ( $ahProgress_D, $hProgress ) _ArrayAdd ( $aUrl_D, $sUrl ) Local $iLVIndex = _GuiListViewRetrieveSubItemByTxt ( $hListView, $sUrl, 5 ) _ArrayAdd ( $aLVIndex_D, $iLVIndex ) _ArrayAdd ( $ahListView_D, $hListView ) If $iLVIndex <> -1 Then _GUICtrlListView_AddSubItem ( $hListView, $iLVIndex, '', 3 ) ; reset state column if mp3 already downloaded. _GUICtrlListView_AddSubItem ( $hListView, $iLVIndex, '', 4 ) EndIf Return 1 Else Return 0 EndIf EndIf EndFunc ;==> _FileDownloadAdd() Func _FileDownloadProgress ( $dlIdx, $Dltotal, $Dlnow, $Ultotal, $Ulnow ) #forceref $dlIdx, $Dltotal, $Dlnow, $Ultotal, $Ulnow ;~ int function(int dlIdx double dltotal double dlnow double ultotal double ulnow) Local $fProgress = Round ( 100*$dlnow / $dltotal, 0 ) If IsInt ( $fProgress ) And $fProgress <> $fProgressOld Then $fProgressOld = $fProgress For $i = 1 To UBound ( $ahProgress_D ) -1 If $dlIdx = $ahProgress_D[$i] Then _GUICtrlListView_AddSubItem ( $ahListView_D[$i], $aLVIndex_D[$i], $fProgress, 4 ) Return EndIf Next EndIf EndFunc ;==> _FileDownloadProgress() Func _FileGetFreePath ( $sFilePath ) Local $i, $sNewPath Do $sNewPath = _StringInsertBetweenNameAndExt ( $sFilePath, $i ) $i += 1 Until Not FileExists ( $sNewPath ) Return $sNewPath EndFunc ;==> _FileGetFreePath() Func _FilePlayAdd ( $sUrl, $sReferer='', $iBufferSize=$CURL_MAX_WRITE_SIZE ) Local $Curl = Curl_Easy_Init() If $Curl Then Local $hFile = FileOpen ( $sFileTemp, 2 +16 ) If Not $sSlist_P Then $sSlist_P = Curl_Slist_Append ( $sSlist_P, 'Accept: */*' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_URL, $sUrl ) Curl_Easy_Setopt ( $Curl, $CURLOPT_FRESH_CONNECT, 1 ) ; force the use of a new connection instead of a cached one. Curl_Easy_Setopt ( $Curl, $CURLOPT_TIMEOUT, 12*60 ) ; download timeout set to 12 Minutes. Curl_Easy_Setopt ( $Curl, $CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_MAXFILESIZE, 20*1024*1024 ) ; CURLOPT_MAXFILESIZE - The maximum file size in bytes allowed to download is limited to 20 Mo. If $sReferer Then Curl_Easy_Setopt ( $Curl, $CURLOPT_REFERER, $sReferer ) Curl_Easy_Setopt ( $Curl, $CURLOPT_ACCEPT_ENCODING, '' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_FOLLOWLOCATION, 1 ) Curl_Easy_Setopt ( $Curl, $CURLOPT_NOPROGRESS, 0 ) $hProgress_P = DllCallbackRegister ( '_FilePlayProgress', 'uint:cdecl', 'int;double;double;double;double' ) Curl_Easy_Setopt ( $Curl, $CURLOPT_PROGRESSFUNCTION, DllCallbackGetPtr ( $hProgress_P ) ) Curl_Easy_Setopt ( $Curl, $CURLOPT_PROGRESSDATA, $hProgress_P ) ; set dlIdx instead of clientp. Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEFUNCTION, Curl_FileWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_WRITEDATA, $hFile ) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback() ) Curl_Easy_Setopt ( $Curl, $CURLOPT_HEADERDATA, $Curl + 1 ) Curl_Easy_Setopt ( $Curl, $CURLOPT_SSL_VERIFYPEER, 0 ) ; for avoid error about SSL peer certificate or SSH remote key when using https urls. If $iBufferSize > $CURL_MAX_WRITE_SIZE Then $iBufferSize = $CURL_MAX_WRITE_SIZE Curl_Easy_Setopt ( $Curl, $CURLOPT_BUFFERSIZE, $iBufferSize ) ; Set buffer size. ($CURL_MAX_WRITE_SIZE = 16384) Curl_Easy_Setopt ( $Curl, $CURLOPT_HTTPHEADER, $sSlist_P ) If Not $hMulti_P Then $hMulti_P = Curl_Multi_Init() If $hMulti_P Then Curl_Multi_Add_Handle ( $hMulti_P, $Curl ) ; if all is ok then : $hCurls_P = $Curl $hFiles_P = $hFile $iRunning_P = 1 Return 1 Else Return 0 EndIf EndIf EndFunc ;==> _FilePlayAdd() Func _FilePlayProgress ( $dlIdx, $Dltotal, $Dlnow, $Ultotal, $Ulnow ) #forceref $dlIdx, $Dltotal, $Dlnow, $Ultotal, $Ulnow ;~ int function(int dlIdx double dltotal double dlnow double ultotal double ulnow) Local $fLoadProgress = Round ( 100*$dlnow / $dltotal, 0 ) If IsInt ( $fLoadProgress ) And $fLoadProgress <> $fLoadProgressOld_P Then $fLoadProgressOld_P = $fLoadProgress If $fLoadProgressOld_P <= $iPercentLoadToPlay Then ControlSetText ( $hGui, '', $idEditPlayState, ' Preloading ' & $sTitlePlayed & ' ' & Round ( $fLoadProgressOld_P*( 100/$iPercentLoadToPlay ), 1 ) & '%' ) Return EndIf EndIf EndFunc ;==> _FilePlayProgress() Func _FilePlayStop() If _BASS_ChannelIsActive ( $hMp3Handle ) Then _BASS_ChannelStop ( $hMp3Handle ) If @error Then ConsoleWrite ( '!->-- [' & StringFormat ( '%03i', @ScriptLineNumber ) & '] _BASS_ChannelStop _BASS_ErrorGetCode() : ' & _BASS_ErrorGetCode() & @Crlf ) EndIf If $hFiles_P Then FileClose ( $hFiles_P ) $hFiles_P = 0 EndIf If $hCurls_P Then Curl_Multi_Remove_Handle ( $hMulti_P, $hCurls_P ) Curl_Easy_Cleanup ( $hCurls_P ) Curl_Data_Cleanup ( $hCurls_P ) Curl_Data_Cleanup ( $hCurls_P + 1 ) $hCurls_P = 0 Curl_Multi_Cleanup ( $hMulti_P ) $hMulti_P = 0 EndIf $iRunning_P = 0 $iPlaying = 0 DllCallbackFree ( $hProgress_P ) $hProgress_P = 0 $fLoadProgressOld_P = 0 EndFunc ;==> _FilePlayStop() Func _Gui() Transico ( 'Trans.ico', @HomeDrive & '\ProgramData', 1 ) Loupe2Ico ( 'Loupe2.ico', @HomeDrive & '\ProgramData', 1 ) $hGui = GUICreate ( $sSoftTitle, 600, 520, -1, -1, BitOR ( $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SYSMENU, $WS_SIZEBOX ) ) GUISetIcon ( @HomeDrive & '\ProgramData\Trans.ico' ) GUISetOnEvent ( $GUI_EVENT_CLOSE, '_GuiEvents' ) GUISetOnEvent ( $GUI_EVENT_RESIZED, '_WM_SIZE' ) GUISetOnEvent ( $GUI_EVENT_MAXIMIZE, '_WM_SIZE' ) GUISetOnEvent ( $GUI_EVENT_MINIMIZE, '_GuiEvents' ) GUISetOnEvent ( $GUI_EVENT_RESTORE, '_WM_SIZE' ) Local $aPos = WinGetPos( $hGui ) $iWMin = $aPos[2] $iHMin = $aPos[3] Local $sDefault = '', $sQueries = '' $idComboBoSearch = GUICtrlCreateCombo ( $sDefault, 20, 20, 410, 20, $GUI_SS_DEFAULT_COMBO ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKTOP ) If FileExists ( $sIniFilePath ) Then ; load ini file. _FileReadToArray ( $sIniFilePath, $aQueries, 1+4, '' ) $aQueries = _ArrayUnique ( $aQueries, 0, 1, 0, 1, 4 ) $sDefault = $aQueries[UBound ( $aQueries ) -1] _GUICtrlComboAddString ( $sDefault ) EndIf $idButtonPaste = GUICtrlCreateButton ( 'P', 437, 19, 26, 26 ) GUICtrlSetOnEvent ( -1, '_GuiEvents' ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKTOP + $GUI_DOCKHEIGHT ) GUICtrlSetTip ( -1, 'Paste clipboard content' & @CRLF & 'to combo query' ) $idButtonSearch = GUICtrlCreateButton ( 'Search', 470, 19, 110, 26 ) GUICtrlSetOnEvent ( -1, '_GuiEvents' ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKTOP + $GUI_DOCKHEIGHT ) GUICtrlSetState ( -1, $GUI_DISABLE ) GUICtrlCreateLabel ( 'Running Downloads', 20, 395, 140, 20 ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKLEFT + $GUI_DOCKSIZE ) $idEditRunningDownload = GUICtrlCreateEdit ( '', 165, 392, 30, 20, BitOR ( 0x1000, 0x0800, 0x0002 ) ) ; $ES_WANTRETURN $ES_READONLY $ES_RIGHT GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetColor ( -1, 0xFF0000 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKLEFT + $GUI_DOCKSIZE ) GUICtrlCreateLabel ( 'Max Downloads', 220, 395, 110, 20 ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKLEFT + $GUI_DOCKSIZE ) $idComboBoMaxDownload = GUICtrlCreateCombo ( '5', 335, 392, 50, 20 ) GUICtrlSetColor ( -1, 0xFF0000 ) GUICtrlSetData ( -1, '10|15', '5' ) ; default 5 GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKLEFT + $GUI_DOCKSIZE ) $idButtonOutputDir = GUICtrlCreateButton ( 'Open Mp3 Dir', 420, 395, 120, 20 ) GUICtrlSetOnEvent ( -1, '_GuiEvents' ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT ) $idButtonSelectDir = GUICtrlCreateButton ( '...', 550, 395, 30, 20 ) GUICtrlSetOnEvent ( -1, '_GuiEvents' ) GUICtrlSetFont ( -1, 10, 600 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT ) GUICtrlSetTip ( -1, 'Change' & @CRLF & 'Mp3 Directory' ) $idEditDownloadState = GUICtrlCreateEdit ( '', 0, 434, 600, 20, 0x0800 ) ; $ES_READONLY GUICtrlSetBkColor ( -1, 0xF0F0F0 ) GUICtrlSetColor ( -1, 0x000000 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT ) $idEditPlayState = GUICtrlCreateEdit ( '', 0, 453, 600, 20, 0x0800 ) ; $ES_READONLY GUICtrlSetBkColor ( -1, 0xF0F0F0 ) GUICtrlSetColor ( -1, 0x000000 ) GUICtrlSetResizing ( -1, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT ) $hStatusBar = _GUICtrlStatusBar_Create ( $hGui ) $idTab = GUICtrlCreateTab ( 20, 50, 560, 327 ) GUICtrlSetResizing ( -1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT ) GUICtrlCreateTabItem ( '' ) $hTab = GUICtrlGetHandle ( $idTab ) $iFlag = 1 $hRetListView = _GuiTabAdd() $idDummyHotkey1 = GUICtrlCreateDummy() ; Remove a TabItem. GUICtrlSetOnEvent ( -1, '_GuiTabRemove' ) $idDummyHotkey2 = GUICtrlCreateDummy() ; Add/ Remove GridLines. GUICtrlSetOnEvent ( -1, '_GuiListViewSetGrid' ) Dim $aAccelKeys[2][2] = [['^w', $idDummyHotkey1], ['^q', $idDummyHotkey2]] GUISetState() GUIRegisterMsg ( $WM_NOTIFY, '_WM_NOTIFY' ) GUIRegisterMsg ( $WM_SIZE, '_WM_SIZE' ) GUIRegisterMsg ( $WM_GETMINMAXINFO, '_WM_GETMINMAXINFO' ) GUIRegisterMsg ( $WM_COMMAND, '_WM_COMMAND' ) GUIRegisterMsg ( $WM_WINDOWPOSCHANGED, '_WM_WINDOWPOSCHANGED' ) EndFunc ;==> _Gui() Func _GuiCtrlComboAddString ( $sString ) If StringIsSpace ( $sString ) Then Return 0 $sString = StringStripWS ( $sString, 1+2+4 ) Local $iIndex = _ArraySearch ( $aQueries, $sString, 1, 0, 0, 2 ) If $iIndex <> -1 Then _ArrayDelete ( $aQueries, $iIndex ) _ArrayAdd ( $aQueries, $sString ) _FileWriteFromArray ( $sIniFilePath, $aQueries, 1, Default, @CRLF ) Local $aQueriesSort = $aQueries _ArraySort ( $aQueriesSort, 0, 1 ) $sQueries = StringStripWS ( _ArrayToString ( $aQueriesSort, '|', 1 ), 1+2 ) GUICtrlSetData ( $idComboBoSearch, '', '' ) GUICtrlSetData ( $idComboBoSearch, $sQueries, $sString ) If $iIndex <> -1 Then _GUICtrlStatusBar_SetText ( $hStatusBar, $sString & ' is already in the List.', 0 ) Else _GUICtrlStatusBar_SetText ( $hStatusBar, $sString & ' was added.', 0 ) EndIf $aQueriesSort = 0 Return 1 EndFunc ;==> _GuiCtrlComboAddString() Func _GUICtrlListView_AddItems ( $hListView, $Index, $sTitle, $iDuration, $State, $sUrl, $sReferer='' ) Local $iItemCount = _GUICtrlListView_GetItemCount ( $hListView ) Local $iIndex If StringIsDigit ( $Index ) Then $iIndex = _GUICtrlListView_AddItem ( $hListView, StringFormat ( '%03i', $Index ), $iItemCount ) Else $iIndex = _GUICtrlListView_AddItem ( $hListView, $Index, $iItemCount ) EndIf If Not $sTitle Then $sTitle = 'Unknown' _GUICtrlListView_AddSubItem ( $hListView, $iIndex, $sTitle, 1 ) If StringLen ( $iDuration ) > 5 Or StringLen ( $iDuration ) < 1 Then $iDuration = 'Not Found' If StringLen ( $iDuration ) = 4 Then $iDuration = '0' & $iDuration _GUICtrlListView_AddSubItem ( $hListView, $iIndex, $iDuration, 2 ) _GUICtrlListView_AddSubItem ( $hListView, $iIndex, $State, 3 ) _GUICtrlListView_AddSubItem ( $hListView, $iIndex, '', 4 ) ; progress _GUICtrlListView_AddSubItem ( $hListView, $iIndex, $sUrl, 5 ) _GUICtrlListView_AddSubItem ( $hListView, $iIndex, $sReferer, 6 ) ; Show Items count to the first column header _GUICtrlListView_SetColumn ( $hListView, 0, $iItemCount +1 ) EndFunc ;==> _GUICtrlListView_AddItems() Func _GuiEvents() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE _GUICtrlStatusBar_SetText ( $hStatusBar, ' Exiting...', 0 ) $iExit = 1 Case $GUI_EVENT_MINIMIZE GUISetIcon ( @HomeDrive & '\ProgramData\loupe2.ico' ) Case $idButtonSearch $iSearch = 1 Case $idButtonOutputDir Run ( 'explorer ' & $sOutputDir ) _GUICtrlStatusBar_SetText ( $hStatusBar, ' Mp3 Directory was Opened.', 0 ) Case $idButtonSelectDir If Not $iRunningDownload Then $iChangeDir = 1 _GUICtrlStatusBar_SetText ( $hStatusBar, ' Changing Mp3 Directory.', 0 ) Else _GUICtrlStatusBar_SetText ( $hStatusBar, ' You can not change Mp3 Directory when a download is running.', 0 ) EndIf Case $idButtonPaste _GuiCtrlComboAddString ( ClipGet() ) EndSwitch EndFunc ;==> _GuiEvents() Func _GuiListViewRetrieveSubItemByTxt ( $hListView, $sUrl, $iSubItem ) For $i = 0 To _GUICtrlListView_GetItemCount ( $hListView ) -1 If _GUICtrlListView_GetItemText ( $hListView, $i, $iSubItem ) = $sUrl Then Return $i Next Return SetError ( 1, 0, -1 ) EndFunc ;==> _GuiListViewRetrieveSubItemByTxt() Func _GuiListViewSetContextMenu() $hLVMenu = GUICtrlGetHandle ( GUICtrlCreateContextMenu ( GUICtrlCreateDummy() ) ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, 'Play Mp3', $iId_Play ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, '' ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, 'Stop Mp3', $iId_Stop ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, '' ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, 'Copy Title', $iId_Copy ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, '' ) _GUICtrlMenu_AddMenuItem ( $hLVMenu, 'Download', $iId_Download ) _GUICtrlMenu_SetMenuStyle ( $hLVMenu, BitOR ( $MNS_CHECKORBMP, $MNS_AUTODISMISS, $MNS_NOCHECK ) ) EndFunc ;==> _GuiListViewSetContextMenu() Func _GuiListViewSetGrid() $bGridState = Not $bGridState If $bGridState Then For $i = 1 To UBound ( $aIdTabListView ) -1 GUICtrlSetStyle ( $aIdTabListView[$i], -1, BitOR ( $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER ) ) Next Else For $i = 1 To UBound ( $aIdTabListView ) -1 GUICtrlSetStyle ( $aIdTabListView[$i], -1, BitOR ( $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER ) ) Next EndIf EndFunc ;==> _GuiListViewSetGrid() Func _GuIsMinimized ( $hWnd ) If BitAnd ( WinGetState ( $hWnd ), 16 ) Then Return 1 EndFunc ;==> _GuIsMinimized() Func _GuiTabAdd() If $iNoMatch Then ; re use an empty listview. Local $iTab = UBound ( $aIdTabItem ) -2 ; last tab _GUICtrlListView_DeleteAllItems ( $aIdTabListView[$iTab+1] ) ; Control ID/Handle to the control GUICtrlDelete ( $aIdTabListView[$iTab+1] ) ; Control ID _ArrayDelete ( $aIdTabListView, $iTab+1 ) GUICtrlDelete ( $aIdTabItem[$iTab+1] ) ; Control ID _ArrayDelete ( $aIdTabItem, $iTab+1 ) _ArrayAdd ( $aIdTabItem, GUICtrlCreateTabItem ( $iTabItemCount & ' ' & _StringTitleCase ( GUICtrlRead ( $idComboBoSearch ) ) ) ) Else $iTabItemCount+=1 If UBound ( $aIdTabItem ) -1 < 1 Then _ArrayAdd ( $aIdTabItem, GUICtrlCreateTabItem ( $iTabItemCount & ' Search' ) ) Else _ArrayAdd ( $aIdTabItem, GUICtrlCreateTabItem ( $iTabItemCount & ' ' & _StringTitleCase ( GUICtrlRead ( $idComboBoSearch ) ) ) ) EndIf EndIf Local $aPos = ControlGetPos ( $hGui, '', $idTab ) ; memorize the listview associated to the new created TabItem. _ArrayAdd ( $aIdTabListView, GUICtrlCreateListView ( '', $aPos[0], $aPos[1]+20, $aPos[2], $aPos[3]-20 ) ) GUICtrlSetFont ( -1, 8, 600 ) Local $hListView = GUICtrlGetHandle ( -1 ) _GUICtrlListView_AddColumn ( $hListView, 'Index', $aColumnWidth[0] ) _GUICtrlListView_AddColumn ( $hListView, 'Title', $aColumnWidth[1] ) _GUICtrlListView_AddColumn ( $hListView, 'Duration', $aColumnWidth[2] ) _GUICtrlListView_AddColumn ( $hListView, 'State', $aColumnWidth[3] ) _GUICtrlListView_AddColumn ( $hListView, 'Progress', $aColumnWidth[4] ) _GUICtrlListView_AddColumn ( $hListView, 'Url', $aColumnWidth[5] ) _GUICtrlListView_AddColumn ( $hListView, 'Referer', $aColumnWidth[6] ) _GUICtrlListView_SetExtendedListViewStyle ( $hListView, BitOR ( $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER ) ) ; , $WS_EX_CLIENTEDGE GUICtrlCreateTabItem ( '' ) $iNoMatch = 0 Return $hListView EndFunc ;==> _GuiTabAdd() Func _GuiTabRemove() If UBound ( $aIdTabItem ) -1 < 2 Then Return ; tab can't be removed if alone. Local $iTab = GUICtrlRead ( $idTab ) Local $iTabCount = UBound ( $aIdTabItem ) -1 If $hMulti_S And $iTab +1 = $iTabCount Then Return ; last tab can't be removed if a search is running. For $i = 1 To UBound ( $aRunning_D ) -1 If $ahListView_D[$i] = GUICtrlGetHandle ( $aIdTabListView[$iTab +1] ) Then Return ; a tab can't be removed if a download is displayed on it. Next GUISetAccelerators ( 0, $hGui ) _GUICtrlListView_DeleteAllItems ( $aIdTabListView[$iTab +1] ) ; Control ID/Handle to the control GUICtrlDelete ( $aIdTabListView[$iTab +1] ) ; Control ID _ArrayDelete ( $aIdTabListView, $iTab +1 ) GUICtrlDelete ( $aIdTabItem[$iTab +1] ) ; Control ID _ArrayDelete ( $aIdTabItem, $iTab +1 ) ; set focus to the current listview. Local $CurrentTab = _SendMessage ( $hTab, $TCM_GETCURSEL, 0, 0 ) If UBound ( $aIdTabListView ) -1 > $CurrentTab Then GUICtrlSetState ( $aIdTabListView[$CurrentTab+1], $GUI_FOCUS ) ; 3504 Sleep ( 150 ) GUISetAccelerators ( $aAccelKeys, $hGui ) EndFunc ;==> _GuiTabRemove() Func _HttpGetStatusString ( $iStatusCode ) ; https://en.wikipedia.org/wiki/List_of_HTTP_status_codes Local $sStatusTxt Switch $iStatusCode ; http://www.ietf.org/rfc/rfc2616.txt ;~ 1xx: Informational - Request received, continuing process. Case 100 $sStatusTxt = 'Continue' Case 101 $sStatusTxt = 'Switching Protocols' Case 102 $sStatusTxt = 'Processing' ;~ 2xx: Success - The action was successfully received, understood, and accepted. Case 200 $sStatusTxt = 'OK' Case 201 $sStatusTxt = 'Created' Case 202 $sStatusTxt = 'Accepted' Case 203 $sStatusTxt = 'Non-Authoritative Information' Case 204 $sStatusTxt = 'No Content' Case 205 $sStatusTxt = 'Reset Content' Case 206 $sStatusTxt = 'Partial Content' Case 207 $sStatusTxt = 'Webdav Multi' Case 208 $sStatusTxt = 'Already Reported' Case 226 $sStatusTxt = 'IM Used' ;~ 3xx: Redirection - Further action must be taken in order to complete the request. Case 300 $sStatusTxt = 'Multiple Choices' Case 301 $sStatusTxt = 'Moved Permanently' Case 302 $sStatusTxt = 'Found' Case 303 $sStatusTxt = 'See Other' Case 304 $sStatusTxt = 'Not Modified' Case 305 $sStatusTxt = 'Use Proxy' Case 306 $sStatusTxt = 'Switch Proxy' Case 307 $sStatusTxt = 'Temporary Redirect' Case 308 $sStatusTxt = 'Permanent Redirect' ;~ 4xx: Client Error - The request contains bad syntax or cannot be fulfilled. Case 400 $sStatusTxt = 'Bad Request' Case 401 $sStatusTxt = 'Unauthorized' Case 402 $sStatusTxt = 'Payment Required' Case 403 $sStatusTxt = 'Forbidden' Case 404 $sStatusTxt = 'Not Found' Case 405 $sStatusTxt = 'Method Not Allowed' Case 406 $sStatusTxt = 'Not Acceptable' Case 407 $sStatusTxt = 'Proxy Authentication Required' Case 408 $sStatusTxt = 'Request Timeout' Case 409 $sStatusTxt = 'Conflict' Case 410 $sStatusTxt = 'Gone' Case 411 $sStatusTxt = 'Length Required' Case 412 $sStatusTxt = 'Precondition Failed' Case 413 $sStatusTxt = 'Request Entity Too Large' Case 414 $sStatusTxt = 'Request-URI Too Long' Case 415 $sStatusTxt = 'Unsupported Media Type' Case 416 $sStatusTxt = 'Requested Range Not Satisfiable' Case 417 $sStatusTxt = 'Expectation Failed' Case 418 $sStatusTxt = 'Im a teapot' Case 419 $sStatusTxt = 'Authentication Timeout' Case 420 $sStatusTxt = 'Enhance Your Calm' Case 421 $sStatusTxt = 'Misdirected Request' Case 422 $sStatusTxt = 'Unprocessable Entity' Case 423 $sStatusTxt = 'Locked' Case 424 $sStatusTxt = 'Failed Dependency' Case 426 $sStatusTxt = 'Upgrade Required' Case 428 $sStatusTxt = 'Precondition Required' Case 429 $sStatusTxt = 'Too Many Requests' Case 431 $sStatusTxt = 'Request Header Fields Too Large' Case 440 $sStatusTxt = 'Login Timeout' Case 444 $sStatusTxt = 'No Response' Case 449 $sStatusTxt = 'Retry With' Case 450 $sStatusTxt = 'Blocked by Windows Parental Controls' Case 451 $sStatusTxt = 'Unavailable For Legal Reasons' Case 494 $sStatusTxt = 'Request Header Too Large' Case 495 $sStatusTxt = 'Cert Error' Case 496 $sStatusTxt = 'No Cert' Case 497 $sStatusTxt = 'HTTP to HTTPS' Case 498 $sStatusTxt = 'Token expired/invalid' Case 499 $sStatusTxt = 'Client Closed Request' ;~ 5xx: Server Error - The server failed to fulfill an apparently valid request. Case 500 $sStatusTxt = 'Internal Server Error' Case 501 $sStatusTxt = 'Not Implemented' Case 502 $sStatusTxt = 'Bad Gateway' Case 503 $sStatusTxt = 'Service Unavailable' Case 504 $sStatusTxt = 'Gateway Timeout' Case 505 $sStatusTxt = 'HTTP Version Not Supported' Case 506 $sStatusTxt = 'Variant Also Negotiates' Case 507 $sStatusTxt = 'Insufficient Storage' Case 508 $sStatusTxt = 'Loop Detected' Case 509 $sStatusTxt = 'Bandwidth Limit Exceeded' Case 510 $sStatusTxt = 'Not Extended' Case 511 $sStatusTxt = 'Network Authentication Required' Case 520 $sStatusTxt = 'Unknown Error' Case 598 $sStatusTxt = 'Network read timeout error' Case 599 $sStatusTxt = 'Network connect timeout error' Case Else Return 'Unknown Error' EndSwitch Return $sStatusTxt EndFunc ;==> _HttpGetStatusString() Func _IsPressedEx ( $HexKey ) Local $aRet = DllCall ( 'user32.dll', 'int', 'GetAsyncKeyState', 'int', '0x' & $HexKey ) If Not @error Then Return Int ( $aRet[0] <> 0 ) EndFunc ;==> _IsPressedEx() Func _LzntDecompress ( $bBinary ); by trancexx $bBinary = Binary ( $bBinary ) Local $tInput = DllStructCreate ( 'byte[' & BinaryLen ( $bBinary ) & ']' ) DllStructSetData ( $tInput, 1, $bBinary ) Local $tBuffer = DllStructCreate ( 'byte[' & 16*DllStructGetSize ( $tInput ) & ']' ) Local $a_Call = DllCall ( 'ntdll.dll', 'int', 'RtlDecompressBuffer', 'ushort', 2, 'ptr', DllStructGetPtr ( $tBuffer ), 'dword', DllStructGetSize ( $tBuffer ), 'ptr', DllStructGetPtr ( $tInput ), 'dword', DllStructGetSize ( $tInput ), 'dword*', 0 ) If @error Or $a_Call[0] Then Return SetError ( 1, 0, '' ) Local $tOutput = DllStructCreate ( 'byte[' & $a_Call[6] & ']', DllStructGetPtr ( $tBuffer ) ) Return SetError ( 0, 0, DllStructGetData ( $tOutput, 1 ) ) EndFunc ;==> _LzntDecompress() Func _ScriptGetVersion() Local $sFileVersion If @Compiled Then $sFileVersion = FileGetVersion ( @ScriptFullPath, 'FileVersion' ) Else $sFileVersion = _StringBetween ( FileRead ( @ScriptFullPath ), '#AutoIt3Wrapper_Res_Fileversion=', @CR ) If Not @error Then $sFileVersion = $sFileVersion[0] Else $sFileVersion = '0.0.0.0' EndIf EndIf RegWrite ( $sRegKeySettings, 'Version', 'REG_SZ', $sFileVersion ) Return $sFileVersion EndFunc ;==> _ScriptGetVersion() Func _StringInsertBetweenNameAndExt ( $sFullPath, $sInsertString ) Local $szDrive, $szDir, $szFName, $szExt _PathSplit ( $sFullPath, $szDrive, $szDir, $szFName, $szExt ) Return $szDrive & $szDir & $szFName & $sInsertString & $szExt EndFunc ;==> _StringInsertBetweenNameAndExt() Func _StringRemoveFromEnd ( $sString, $sStringToRemove ) While StringRight ( StringStripWS ( $sString, 7 ), 1 ) = $sStringToRemove $sString = StringTrimRight ( $sString, 1 ) WEnd Return StringStripWS ( $sString, 7 ) EndFunc ;==> _StringRemoveFromEnd() Func _StringRemoveFromStart ( $sString, $sStringToRemove ) While StringLeft ( StringStripWS ( $sString, 7 ), 1 ) = $sStringToRemove $sString = StringTrimLeft ( $sString, 1 ) WEnd Return StringStripWS ( $sString, 7 ) EndFunc ;==> _StringRemoveFromStart() Func _StringReplaceAccent ( $sString ) $sString = StringReplace ( $sString, '°', '°' ) $sString = StringReplace ( $sString, 'ç', 'c' ) $sString = StringReplace ( $sString, 'ß', 'ss' ) $sString = StringReplace ( $sString, "’", "'" ) $sString = StringReplace ( $sString, '€', '€' ) $sString = StringRegExpReplace ( $sString, '(Ú|ê|é|è|ë|«|©|ã©|ãš|ãª|ã¨|ã«|â«|â©|è|é|ê)', 'e' ) $sString = StringRegExpReplace ( $sString, '(ç|Ç)', 'c' ) $sString = StringRegExpReplace ( $sString, '(ÃŽ|ö|ó|ô|ãŽ|ã¶|ã³|ã´|ô)', 'o' ) $sString = StringRegExpReplace ( $sString, '(û|ü|ù|ÃŒ|ú|ã»|ã¼|ã¹|ãŒ|ãº|û|ù)', 'u' ) $sString = StringRegExpReplace ( $sString, '(ï|î|ã¯|ã®|î)', 'i' ) $sString = StringRegExpReplace ( $sString, '(à |â|ä|À|ã|á|Ã¥|ã |ã¢|ã¤|ã€|ã£|ã¡|ã¥|â|ÃÂ|ãƒâ)', 'a' ) $sString = StringReplace ( $sString, 'Ã', 'a' ) Local $aPattern[7][2] = [['[àáãâáäåÁÀÄÂÅœŒÆ]', 'a'], ['[éêèéëÉÈËÊ]', 'e'], ['[íîïìÍÌÏÎ]', 'i'], ['[óõôòöÓÒÖÔøØ]', 'o'], ['[úûùüÚÙÜÛ]', 'u'], ['[ýÿÝ]', 'y'], ['[çÇ]', 'c']] For $i = 0 To 6 $sString = StringRegExpReplace ( $sString, $aPattern[$i][0], $aPattern[$i][1] ) Next Return $sString EndFunc ;==> _StringReplaceAccent() Func _StringReplaceCyrillicChars ( $sString ) Return StringRegExpReplace ( $sString, '[^[:alnum:]\-\s\x{0400}-\x{04FF}]', '' ) EndFunc ;==> _StringReplaceCyrillicChars() Func _StringReplaceHtmlSymbolEntities ( $sString ) Return StringRegExpReplace ( $sString, '&#([[:xdigit:]]+);', Execute ( Chrw ( '0x$1' ) ) ) EndFunc ;==> _StringReplaceHtmlSymbolEntities() Func _StringReplaceHtmlTags ( $sString ) ; By Robjong. If $sString = '' Then Return SetError ( 1, 0, $sString ) Local $oHTML = ObjCreate ( 'HTMLFILE' ) If @error Then Return SetError ( 1, 0, $sString ) $oHTML.Open() $oHTML.Write ( $sString ) $sString = $oHTML.Body.InnerText $oHTML = 0 Return SetError ( 0, 0, $sString ) EndFunc ;==> _StringReplaceHtmlTags() Func _WM_COMMAND ( $hWnd, $iMsg, $wParam, $lParam ) #forceref $hWnd, $iMsg, $wParam, $lParam Switch $hWnd Case $hGui If $wParam Then $iContextMenuId = $wParam Local $nID = BitAND ( $wParam, 0x0000FFFF ) Switch $nID Case 1 ; Enter key If Not $hMulti_S Then $iSearch = 1 EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==> _WM_COMMAND() Func _WM_GETMINMAXINFO ( $hWnd, $iMsg, $wParam, $lParam ) #forceref $hWnd, $iMsg, $wParam, $lParam Switch $hWnd Case $hGui Local $tMinMaxInfo = DllStructCreate ( 'int;int;int;int;int;int;int;int', $lParam ) DllStructSetData ( $tMinMaxInfo, 7, $iWMin ) ; min w DllStructSetData ( $tMinMaxInfo, 8, $iHMin ) ; min h $tMinMaxInfo = 0 ; Release the resources used by the structure. EndSwitch EndFunc ;==> _WM_GETMINMAXINFO() Func _WM_NOTIFY ( $hWnd, $iMsg, $wParam, $lParam ) #forceref $hWnd, $iMsg, $wParam, $lParam Local $hWndFrom, $iCode, $tNMHDR, $tInfo, $iItem $tNMHDR = DllStructCreate ( $tagNMLISTVIEW, $lParam ) $hWndFrom = HWnd ( DllStructGetData ( $tNMHDR, 'hWndFrom' ) ) $iCode = DllStructGetData ( $tNMHDR, 'Code' ) $tInfo = DllStructCreate ( $tagNMLISTVIEW, $lParam ) Switch $hWndFrom Case $hTab Local $CurrentTab = _SendMessage ( $hTab, $TCM_GETCURSEL, 0, 0 ) Switch $iCode Case $TCN_SELCHANGE GUICtrlSetState ( $aIdTabListView[$CurrentTab+1], $GUI_FOCUS ) EndSwitch EndSwitch Local $tNMHEADER = DllStructCreate ( $tagNMHEADER, $lParam ) Local $iCodeHDN = DllStructGetData ( $tNMHEADER, 'Code' ) For $i = 0 To UBound ( $aIdTabListView ) -1 Switch $hWndFrom Case GUICtrlGetHandle ( $aIdTabListView[$i] ) $iItem = DllStructGetData ( $tInfo, 'Item' ) Switch $iCode Case $NM_DBLCLK If $iItem >= 0 Then $hLVDoubleClick = $hWndFrom Case $LVN_COLUMNCLICK $iColumn = DllStructGetData ( $tInfo, 'SubItem' ) ; UnRegister previous Sort CallBack. For $j = 1 To UBound ( $aIdTabListView ) -1 If $hWndFrom <> GUICtrlGetHandle ( $aIdTabListView[$j] ) Then _GUICtrlListView_UnRegisterSortCallBack ( GUICtrlGetHandle ( $aIdTabListView[$j] ) ) Next ; select sort type. Switch $iColumn ; 0 to 6 Case 1, 3, 5 ; title, state, url. _GUICtrlListView_RegisterSortCallBack ( $hWndFrom, False ) ; Do not treat number strings as numbers. Case 6 ; referer. ; nothing to do. Case Else ; index, duration, progress. _GUICtrlListView_RegisterSortCallBack ( $hWndFrom, True ) ; Treat number strings as numbers. EndSwitch $hLVToSort = $hWndFrom Case $NM_CLICK If $iItem >= 0 And _IsPressedEx ( '10' ) Then ; 10 Left SHIFT key ClipPut ( _GUICtrlListView_GetItemText ( $hWndFrom, $iItem, 1 ) ) _GUICtrlStatusBar_SetText ( $hStatusBar, ' Title was copied to the Clipboard.', 0 ) EndIf $hLVRightClick = 0 Case $NM_RCLICK If $iItem >= 0 Then $hLVRightClick = $hWndFrom Case $NM_CUSTOMDRAW Local $tNMLVCUSTOMDRAW = DllStructCreate ( $tagNMLVCUSTOMDRAW, $lParam ) Local $dwDrawStage = DllStructGetData ( $tNMLVCUSTOMDRAW, 'dwDrawStage' ) Switch $dwDrawStage Case $CDDS_PREPAINT Return $CDRF_NOTIFYITEMDRAW Case $CDDS_ITEMPREPAINT Return $CDRF_NOTIFYSUBITEMDRAW Case BitOR ( $CDDS_ITEMPREPAINT, $CDDS_SUBITEM ) Local $iIndex = DllStructGetData ( $tNMLVCUSTOMDRAW, 'dwItemSpec' ) Switch DllStructGetData ( $tNMLVCUSTOMDRAW, 'iSubItem' ) ; Subitem index Case 0 ; column 1 DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0xFF0000 ) ; subitem 0 in blue Case 1 ; column 2 Local $sStatusBarTxt = GUICtrlRead ( $idEditPlayState ) Local $sItemText1 = _GUICtrlListView_GetItemText ( $hWndFrom, $iIndex, 0 ) Local $sItemText2 = _GUICtrlListView_GetItemText ( $hWndFrom, $iIndex, 1 ) If StringInStr ( $sStatusBarTxt, $sItemText1 ) And StringInStr ( $sStatusBarTxt, $sItemText2 ) Then DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x0000FF ) ; subitem 1 in red Else DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x000000 ) ; subitem 1 in black EndIf Case 2 DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x0000FF ) ; subitem 0 in red Case 3 ; column 4 Local $sItemText3 = _GUICtrlListView_GetItemText ( $hWndFrom, $iIndex, 3 ) Switch $sItemText3 Case 'ok' DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x3F8500 ) ; BGR green Case Else DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x0000FF ) ; BGR red EndSwitch Case 4 ; column 5 Local $sItemText4 = _GUICtrlListView_GetItemText ( $hWndFrom, $iIndex, 4 ) Switch $sItemText4 Case 'complete' DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x3F8500 ) ; BGR green Case 'aborted' DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x0000FF ) ; BGR red Case Else ; progress DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0xFF0000 ) ; BGR blue EndSwitch Case Else ; columns 6 & 7 DllStructSetData ( $tNMLVCUSTOMDRAW, 'clrText', 0x000000 ) ; in black EndSwitch Return $CDRF_NEWFONT EndSwitch EndSwitch ExitLoop EndSwitch Local $iCol = DllStructGetData ( $tNMHDR, 'Item' ) Switch $iCodeHDN Case $HDN_BEGINTRACKW If $iCol = 6 Then Return True ; disallow resising column 6 Case $HDN_ENDTRACKW ; $HDN_ITEMCHANGEDW ; $HDN_BEGINTRACKW Local $iColumnWidth = _GUICtrlListView_GetColumnWidth ( $aIdTabListView[$i], $iCol ) If $iColumnWidth Then $aColumnWidth[$iCol] = $iColumnWidth EndSwitch Next $tInfo = 0 $tNMHDR = 0 Return $GUI_RUNDEFMSG EndFunc ;==> _WM_NOTIFY() Func _WM_SIZE ( $hWnd, $iMsg, $wParam, $lParam ) #forceref $hWnd, $iMsg, $wParam, $lParam _GUICtrlStatusBar_Resize ( $hStatusBar ) If Not _GuIsMinimized ( $hGui ) Then Local $aPos = ControlGetPos ( $hGui, '', $idTab ) If IsArray ( $aPos ) Then For $i = 0 To UBound ( $aIdTabListView ) -1 GUICtrlSetPos ( $aIdTabListView[$i], $aPos[0], $aPos[1]+20, $aPos[2], $aPos[3]-20 ) Next EndIf EndIf Return $GUI_RUNDEFMSG EndFunc ;==> _WM_SIZE() Func _WM_WINDOWPOSCHANGED ( $hWnd, $iMsg, $wParam, $lParam ) #forceref $hWnd, $iMsg, $wParam, $lParam Switch $hWnd Case $hGui If _GuIsMinimized ( $hWnd ) Then GUISetIcon ( @HomeDrive & '\ProgramData\loupe2.ico' ) Else GUISetIcon ( @HomeDrive & '\ProgramData\Trans.ico' ) EndIf EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==> _WM_WINDOWPOSCHANGED() Func API_FreeLibrary ( $Module ) Local $Ret = DllCall ( $_KERNEL32DLL, 'bool', 'FreeLibrary', 'handle', $Module ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_FreeLibrary() Func API_GetProcAddress ( $Module, $Procname ) If IsNumber ( $Procname ) Then Local $Ret = DllCall ( $_KERNEL32DLL, 'ptr', 'GetProcAddress', 'handle', $Module, 'int', $Procname ) Else Local $Ret = DllCall ( $_KERNEL32DLL, 'ptr', 'GetProcAddress', 'handle', $Module, 'str', $Procname ) EndIf If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_GetProcAddress() Func API_IsBadReadPtr ( $Ptr, $Len ) Local $Ret = DllCall ( $_KERNEL32DLL, 'int', 'IsBadReadPtr', 'ptr', $Ptr, 'UINT_PTR', $Len ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_IsBadReadPtr() Func API_LoadLibrary ( $Filename ) Local $Ret = DllCall ( $_KERNEL32DLL, 'handle', 'LoadLibraryW', 'wstr', $Filename ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_LoadLibrary() Func API_lstrlenA ( $Address ) Local $Ret = DllCall ( $_KERNEL32DLL, 'int', 'lstrlenA', 'ptr', $Address ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_lstrlenA() Func API_lstrlenW ( $Address ) Local $Ret = DllCall ( $_KERNEL32DLL, 'int', 'lstrlenW', 'ptr', $Address ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_lstrlenW() Func API_VirtualProtect ( $Address, $Size, $Protection ) Local $Ret = DllCall ( $_KERNEL32DLL, 'bool', 'VirtualProtect', 'ptr', $Address, 'dword_ptr', $Size, 'dword', $Protection, 'dword*', 0 ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_VirtualProtect() Func API_ZeroMemory ( $Address, $Size ) Local $Ret = DllCall ( $_KERNEL32DLL, 'none', 'RtlZeroMemory', 'ptr', $Address, 'dword_ptr', $Size ) If @Error Then Return SetError ( @Error, @Extended, 0 ) Return $Ret[0] EndFunc ;==> API_ZeroMemory() Func Base64Decode ( $input_string ) ; by trancexx Local $struct = DllStructCreate ( 'int' ) Local $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', 0, 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 ) If @error Or Not $a_Call[0] Then Return SetError ( 1, 0, '' ) Local $a = DllStructCreate ( 'byte[' & DllStructGetData ( $struct, 1 ) & ']' ) $a_Call = DllCall ( 'Crypt32.dll', 'int', 'CryptStringToBinary', 'str', $input_string, 'int', 0, 'int', 1, 'ptr', DllStructGetPtr ( $a ), 'ptr', DllStructGetPtr ( $struct, 1 ), 'ptr', 0, 'ptr', 0 ) If @error Or Not $a_Call[0] Then Return SetError ( 2, 0, '' ) Return DllStructGetData ( $a, 1 ) EndFunc ;==> Base64Decode() Func Bassdll() ; bass.dll x86 Code Generated by BinaryToAu3Kompressor. Local $sFileBin = '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= 'We7PKV+IwFH13i6rHcHqsIeZVBIsuuVwOb5nRf9ioxsO6jFYa2dHZzJoBoZ4OFjJDg0MRpiKbtU2sYGnMKLas2XwWHSEkeggtcaXN2JEG7rxCp8wF0wH3bIgi347F4dP+0CC9sPd68MrsXMDgA8G2Ce8f9s+h2aROqBitTagbr2LomgHeHNQV/2KgBRTAHhgiqIIkE1KeEWKqqAudU13i6JXLFVbs2FfGUwxZMKUxa9xg8UOBtHHpyqHYKObZy30rLMErs4cMAFY0qzCpolEmt3BDsLcHx+RpmmaGgUVFSHlNE3TNO7GxvH50zRN0+H8/I3tH8c0Te3t0MhdqAcmflqspUlAElCjmJ2WmSwDAwCsAciN3w/Hh4dJkqQKfH59dfQ7MCR2cVyR4hFBsB5BMOgV7yNmXrF4tA1dHA7uPUmg6kNG7itZr05IJqrAQ74/oB8fW+MRIL1DFmp7ZXtAr0TE7CduXSJro+bLGdaZ2UptolVh6uqtVCnsdWxeAJxjXYCCi6oyiypBmJgVEN8II6JOwNyiOoHXYp9Bmi+RdZWkBtOPfIth4qMKjET5DUz8EvcAGFVW9ATcoFQj7OQIo7Exh6g1mVEkVA0RCUiiIbifzit6IyiKJKw4pzgSXr0Hrsjpy2/nu8QS96ORXSI0q7MNQky7SoXGCqqgVxy2h40gcDnxV+4RqX9v1USZlYOXPtaU5wQefWHMrq0vq7JAbeqUq5UlYdVtmv7OUHejsUJUzVTs9n0qg0jhL5zjIGJoqfZLbXV/1VRipEwV0Ue6Jg6aZwh6PxUIjIhWklvfF9s9XwfgNGxFJ/86y4eLFz4nKvlHw1LwFatWsO8fGfX78yGHfUIaKmkn5oZcqBPdnypU115KXJSWXL5HBUAkIubQUsdIXG5Bvp9chWCxAVCWQvMutTTK0LK9Nr9qBUN0PTHpqiuo7P6KuJ9czXOBqhZshD81UYKFw4aDnWZ9/o5DKZHa6ucdyvFcIX3KhrbVbcQOLEap5OVE/E1kkque2ESrtKqnBC7JI+Rc+Sk5qhwbE98aWFLW1eh1+QVScoGbTg+f5HpaWCc01LlKNL/9RbVfs9GBijAtDN7oyU8tMKYgGKbKHdSyyX4To7dLn3AjVrCANzrhKaaYdoh+mcFqGFMF/5XyuhFgYvmjkvlVQgcQB4hFdLio7UchoBE8Uviv/hYOWwBZ35ditm0DNYIqZhToFJTLcQ4qC210OWFRWzcslWzeLFlxVzCQgaz5nJpfGgKQqyj+eweiuUIwCmj3y+uN0i4SNa2EW0wLd9GFAVvRLgBApOuTl+BtFXXuotFts5s3zSTLRrJalseoWRLxp0zCInVMAC4whGHABHc2RTb3DbLCIm6q5NnbhFvyJQimmAHOpEmwC0CF+kR/6DYvjnm7vJjXnSZ1YphDhLXeWC/y2j+owkW6vGkAHrlPYQGMXJd5p7ycPjpU7Bex3n6hwkNXCZApSNXoTUKslJHqcBcWof3PSRowyYDtlMHb5qo0ZEciSVSBpb90s54FFoKRH7KSEUQiUbEIqYegGiabiaSRRUYfKFWU0Md372vYHO+zq3XwObaeiQdvf6ABhGC+pFFd5axYXBVo7/NWCtUZyCAr+k+mzxXT6Q+MVaElCv5yOItKSHPhm18jmrnvUOSBa+TBqxqBtTvVUIvXQA7VE4QOgmMTt8gfkk+Kx4GrkQl7WpFErTKzamf8cF+ggx/0ZdmopVycA1Hq1bZ0aPqbg+0RSMc1S6Sew/tcYMVVN+suGxYTmcFO1tbvGgZa+IyoAUIOgNQ6OHPdi+FC+DWmYfpoa1SR37Vhl4L+1zItB0Ns3vAHVk0t2ALDAFhPhLnATHFEXBkHLA0m1Fchhl0FgsW8ZTdYdEMwe+4xcnW/nLrDPBu3S0zxPuCfjVQB5AA7Bth6hnUI9q36mAMNDHwJrLTyiCmzrh14YBGp7RqjqzBIif3UG3Ed2ijMaxv335eRvjbgMB+Up50OCmQVtrFhRXkTDGUgmOLRRDJFTjEe1IyIiGIYQ5EHAB68J6I/yh4KfYXCqEpsTRfEUHheDFoq4Kpeo6HE9yvmXabAXbawnFam2iOp7npcGNsWspQT3d1hKIA4ms/37/LvodupwYQcIqTh98UoioSEmVZLqkUPsERFPmeqzmM/hXcXFTa4Hte74k1Rvnzts78KXGXfiX1AtTJRXVAq5XVORii5UH6Bw0MOfYFCqc9a79HG1FUT2MJ8l6L8FwtjylVYhUZEhks93d2XISnG3qr9cJn4AUUcgUdpvCYSspM/C495Bw9aHlqRGDsb+D+tVUWPZVFwi62pKQ3vw3/xPLRDzFGj75EgzZbZzRtd/8rcqDkCJ0qb5WmBLv9pRjjz60+IKf6YoiapjaBq0GWZ/63hAmQrUFaZfTrbx171Iimq3xcF7Y8rJnaXPwar64nLoG1LmqRb7tEfwfNpAfGrivybUl8FoXK9CEu6B2HdmFUQsYWQWYNpFHyZiKSeJiUidZuBmWGVmVWGJVTrUU7CyRhgtAdhPYiteLAkJ9Zly+Axah/tF4YzKk+qPS14akAi/pTu3OLGFg8WYbLjuoW/zPKkfMtZZLQXvN3yGMh5NL3TqlYxaQ35sZXOy9aWaUoWzRYxnt5s9GxsFT2mGi36fglbeKJW1mlRsO5ssnyTVUNiysSy6UVKapg1+jqVyO9/QTd6JrY6GbAcLLI0s4ogMSsulkvkE4wEDBhzxRR7whd1ey82K06rBjrTosiCHFHoJN1T13rPINaXPTBqMqHp+tKBfTK6EmuVq1QmdNHflSHGcKkYhlCCG4d8jrMaJTIKxE+2Y1pbDBMMyMOo3CedsCmn+grH4FQxmIOImpkmisZp6m2JEjBRmIixvQWXcKUGHJJdCVARkQYUYZnzGpyrVlqrwFJgIVhRULzFqGDgAzmuYg14cqM/BBOP5ejf9bXglizzWJhELYnVQFXKwLpbfLRSrJ3f2Nq7F2j8YJONEWLtbdna6iCawcD/Pw9JY2FqvtP2YNMp81dfrYX6SgKgiWs4PD1lEpogeuV5F6BWR2rA6E7F98WfApmfNyrpqRQeELBj+d6fCmLY6nFH9xDihooeAFWYIMx1DatrCqd9CUmaoJ16ubntIElovYuGS8HAjNDHwkx7tAJaILaNJYDQNE4GEVYjJAlJ4xocF5L/eWDJJ/OaZoJSKv0bPU187PumuQ9i/lxe0wNkiSpIAqD13zJ7v6McJ+rLG1qrIryI42wsvOLztHPVRWin2Q0F8vXHxU4O5j3OMc9amlq80R0QhbKy9D7G/0oukQF1E5fkINW/57KvCN9H0hVLC3QC5XLRn1B9QZcolq65iVnefZHJrn2Ea3xN8ABVgiNAXHCjOamvsK8cwr0i7i7Fp22IejrqYigE0zIBOcn1CdwrsAuta1+dm2uI1nKOTk76EPYdgHO04C2snXWyfo18kKQUx3rJrpc6MyRFV+wWE5PeSF2A2gxJUTjE+Wk3ZgB0bgwBtUF4YS3hbFMQ0bxVHTY/e26Yi6MoZJR4XvKBbTlatectRW73TJCugi7cBYxTDL7NAnqxWg2DXUOyKasKLKqXiChWGtggzAw8cRx0cMy4cNyc4QZE7XYM4rYWNjSp4SqzHEx35NxnnYF1ZB7OmfisGF9byg5bYEE+HdkDI4k59mvBGjCoOsCrMZhIXPI0rRjSVg24C6tMsipe7YRGOaYeMSe1rfW0tK5LNcWAoxgsbzSuQdLO6vpq0mesewLAHMQ++s7QrR1aGYxxCbpVUwW/jXWzjtFda6iCdAFjZ5yOAsveuP0eq18dsQQMGSWu5O2gP0y8FibJSDHBZ+UvmvNBNbuwadem/g7yy8bWXYwmfC5MMECn5q71h9adCYzvjygDP+7k7qqytkytq2vers7h4HRpdotv1oHYHDgnjYWLmI+py1c1yVVJLElWMuZPFFk1Q0O5WClPS98llsr514rdMqrAGlMyHJYkSTcIIbuABAaq1L7hUBqU' $sFileBin &= 'qxFaQF/2XV6LEf+BbQQFBWHwjZwFz52qSorBR85VZUh1HbNjbpQHMdyvTonEOkwYwfTjwWYr/jUAoEYD7LCASMugju2nwKDHqpXUvNmgIkQJ2VW5hWhKkYLlYUGZE8mcTEvGi4pYjP4niACB9Rs1LQuAlKqriOXL78TirqIUfxOdPMPr8pYEALJ7BVZR1ckuV688drIfY88oxHJhtstETpgPvLtKygj7Dkh/h4C1fGXjBAF7qtOSo68u73Vt4P5v2nQHR0aImYqEmuiqB4YnN5iMcG6GAgYWXKpu8l9JUm9gaYkCt8Jdrl6nr3Rq3BB37KqCmSTiHwA1wDK9wvwAt8i0ybhbpC4oNO/K8wFr2a/N68/uKgQUqQITMhpgzSRJkiRew1zJQtdw7UuSWOXzzq+Lrg3Id2CmSr1muxRodFWk5O3rKGILTPfhUjddgQwLXDFdA5TvV8OAj8rCkqPV4MgoJzolqi5ll7gpLbxM3SlAVJNf/g1cCakbGFt7qauvBgyNWiMaOBI+TAPrXH8jXAN76XjCddlk0VO/1LhxOtVswywLmftcc03GdXMFg2gIku56+VB81O7XRYqI1PiNEZF+JMPdh5zcwspQARUyVQTZsnymknPSkYL3wPq/rVoD5oSqtBjRLMZqtJMsufgUiRtXkYcrM9HpWOl+N8lEwDZjKVHvrAtILXMcVIaIENhhoRhVmnt5q3rk+gIx6yR8NNzW+a5aMaT+SZJrsbJDPDA7XFlFOUY1FhkjeSeHPsxMq0piTTyzclWh7xkVUq1rPcEY3a3EVY/Bn72rVEBmEs/U35b4K3FwE7udWWKZUYjbC6mS9ldvzP60/Mtgd++q4NaSXUdvtI2ZcNcUebeve8ox5PWVDNZXvlZFa7W+iKn1XZjFvAX53mF9eP+TBcMM/1KxpTsugAPII4WfsZwHTlm1xrjZwOpk5nwg/9KwMZAKx6thtm9vflaJ3XJeM1pPhbXCQvbuWnffMKBYk2t4YLA0fJqDnV0M5G8lJQPaz/wyTCfq0wAgDzcr8uj1/fv9zyH80PkCDxz5wSnQ9FXN+VyHRn0pUoroLGNdHFQ/s0Vs1HyGqcnz/Txsjl4VdT+E5jFG+MckgQxvy+6FJ1jSXFVUodHKG1/HUEWBg4On6jIZwAuupWUfbZ7iMqUvzK6OCV9fowWt65ONYFHxryUIdg2KIH7AVW3p3ws1RBorhPG/1SKSNesowMErXQ3Oynjciz6mSNvx+Zzmr8eK/XHH/l6koPrikm7CYJBhVkXR5CtcV9AmajkBKjswuKPWG4R61/XGREzdHf0G2I/vFpnqkPav4+QPaQ6Nrb7CQn+b0qBLyq+G5obsL0+d3l9a2cOKByOoypqDiF0w4dlTig+CXe0Y/cJn02NTylCrjuUzn7rbByUBrzE6tt8+BNVDVy5ElKNgT0BfR0kldUR2hUadJHCVBY97iYprehptl7Y/GxG8joj2UEspNb4KzzvgN9W2LyYn8rYagzj6ohMKHho4mRY3FDXwIrIXK0z6f/L7wh0BvAoqelaqjY6MtKJmY6A4kRjSS9LSPY2KQhexxA12HnigrkYt7J4VThGWEdUV/XjIQjqsVbJRIpj99CfY1bCuwjB0gFuUx7JlH2uJ4EBm6yIIdf+C9xjjg5RFDPuIAzYo/gFpJ9kCodW9Y69P1S8TXl9ge+vakai9WPS+wmAJAadD9LV9qSEkKkNcbdCWbTQpU01SUQRVEsGUYoajo2H9X+WyFG9j5EhLT/mX3wUXdgvdpcQFNMfYl9/60XEbBoTk1ZWmnfq43jCgE+9S5zJlFSFSdXXGQLxfMcxqb/5bNSDEM8nmDJDy1eOjHIxNDmsmyVYpwIGL5w0vy2E57JR+/DaAcZ0FEzmQ8POm+oqyNha0c3Dmc4zWLoOK5EitLgYdZNLsvkT2+0Jr9HFl4OO5s6DrY7cl1K4tEk2ONgBSDxwYg6LGChQSpLgjNrwv8JtNxxujVmm6rDhhVVkG+PHJeV2FaeHMArLDvL+YxaMixu8Kp8O9RjjXB0z89u/cB2o0xJgE0sNT14Ci4f/BOFpcxn18aFJi6yLlxSfn1dao5vX7pmeZ4BopbmB7sPzpGlfh2F/N68XetrxXG1DMqkuGBePWvc+MMM3RGXWJYYiYcChSrGVpqcViIpgUJif+VLSvGx2TfVMMkVzMH9MSnpGISthW4p6uV094B1z8/twZUwp1t6Ca4AAcA6/7VJZpmhow64fr+/sz/Y+m6+tOF2wxuN1RryqnKwyxZXHM5pd6SPrS1Fn/afTe4JS6Ldzmw27BIgWlM6TtV2mnu8WYd/RfCuuvk3qhNIeWuuhn53xN6waDre/o0iywZVwvodF3nSxSZpbjW04qa+VVm/AB8HftYFqc/l9HcCgDD8k+KFpyMLpI8AZoUgIbHQVf8vb/GKmubh/7cwc8v0hzDzyl2lFQCTmUHHR4Lz/jXa0sqPD4V9xedSxIk5cBDZ3caMXEgAtBst2zqx4mvK1XYZoQTd+cfoJs4rP7tmDGkM4lbCw23w0kjzh4O/KCKQEK2vimrvBymYg5ae6QGSY9VZ0SKWZ8e90RhNhVMXPMbBQ/hF72uvkPrDzXhvTvXH1yw1VwoNsi2ciy/+fh1613w/OrG7P7xeFj8I6urqLppV2i6bGVIF552t/VbYhPzZIvn+FFIQzXwKd5CuwtPwVlGZhvMG9w+gdp02+qDdi+9ikY+VQ5VJquj/INC92jXTViyBujFMM5dB1jHWZD+18hFn4Ps/jAWjCeY2pnckOKqmBaFkqsyXGhtQ2LVIrbKUBv/wU5FgEk5seostKrw5Xiy/Z10R7fp0q7+2UCk16kpM8ZHzhoaN3DaOaJ+t23popgwY2QHqKP6nsYJHutIXbAp+AehU1pH/j9uylykbDB3GK3UW8PnwhSfbL8M1BcItlNmS40ohJqz5PgbEq86oSgF2DwYFtu8xZBwEgdQPgUUT5AKOv3S8n1dtokSQrB08zV5gsMSJL34F7rT9Ul+0UHRhRI9NlV8yZiCOi7jP9KrgiIDRnzisdptn8DvelPOdPoHLVMdAVs2oFx4NxVrRZBiC0g/WmRqh0eO5y/XrPC3wlyuV3JxPSjk9utdR1O+Hf1Nv1tnKODHOfNX5R44roYvRxLHj4JgwhqcAZHKOKHByZrI6HatioJm1yDVio8/4KlwMkBkmfVBYIKU2w1u00niJUseO9vUhJU8/FczY7IyK7VNcGRDf93F7GmFyDJMoyoZsBfgZXgNAF+v2bMm3Rd8LXZ7mALLse+YT04I+lBrYSlKEX4DKt5DdbmqNERVpGAmNP8b0wrk4T0xajW0tup8VJDSZPvFcbCts4EyOoQpYE4y8qG3pPMkZ10ImE5LAIFvCL/asj+C31srcrKobkaqsAjCj1ESsQrgpLn7gUDyHIogLKGYDR7mfZj1RG7r0w5yy07LN8drhx2+bHZTiSxcV5fTBBBrDAuMrHN5btTOkPz3Veluzvhqd033/1isN74CC3VpcfGg6uKBdctceGI43SSIfZAvpI6CN8hfmgsGb6mCdI58gAuyXbkJTndyYUql0Q1+NcpSWoKrgsDLjozRL/g9wFRat23Kb7HPBqQDcOFgcZ17d1jzBR1CyV9+zEAZXKoI+BYSZVFSk0Ekc+GeQVUBmVSHUBOBa/5i7AQ457VgFW2TUVA3jSu7BdnK7VCQ57EL2Sm/bLJtJLrhGf3gAhxcnM6MeZVooXKrOxMgtasxUQXPBm7O2CLiZlvRwV0DnF8TwC+JCS0u6NlwSmDEk9hynYMUiObAhikV2hNa/qclT8djNkSV+CaodheKBnlly+qPBrVYNjgTFUJpZQWaN7Evir4dkqsTovX9UouBvhqSqA74uLfv6GlK6sP2xiiMu1Z4KXAsws65veqo5PursCtCs0xNWaNFLnYuDvKuy6YKU4oqgVu+goRFv+V8JDFnT5ePMSzihx9gI7UfFNMUIJiim5VVouifbqE0Jvg' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= 'qKNDHVUyaMb8z3XjmT8k561VMkJqMURRLt4nR4cdA7aH/n2AMAVww0EKGk3neWR874jdtcGrytUk1B8v5GSP4gN8XPFHXafj/7ULhb5HgAzm3l/Epqzpsjm4icbu2LcXQsvgBYdwVJ8gdkEzFHLh2UG5MyVh6su4svahEA/MpWFHlVXa7qZtZ+GqsKkrC9yozbfgE6eZDOwv+wlJzCkU1MQUvNldstjpro7UiXXjvl6gI+ULorwEe+oqNEZStkD74YVEvFRdKHrkSIhMSzknwyXv5WVl4nW7LyaTJIWkg0kAEdeZXxyJX1UChpxmPzgTCedhhLAk7BBA6WKkwxNKV/YkYCAduaqyZanOxyH67NyJ/MN34XS+XC9sxHyvX7vfnfVfEBVo/0IBlrM0ggv7L3D+hPcFGuyn4SKPKOyNhhGf8d974BywCrCnmozVL9auEYVO75HjAA579WRomHK7fJNs+hfrASRz5yc4dh5rfUmXJmdmXhm0JTJaV8JnOlJXHWqfGP8FDnvFvrtZ2SM+XCVheC1XF6BgOdnt9xXRG2doJeKxEKyJH3vGFShxJ7ABPvYqtwDIfXrwxf+PLxYBfMFmjcgaBvWcC+HB5uxbZN3yQDn6zdX8Kh4ukepXABHVbUOBgMj2YMQXV+ESPeERv/SpwzUuYvLuwC2IY8a23dlrpErzb19V7fdogNhc3hLTa6g/7k1dok5XVY671nXUyiQavp6v6yYifrqqNmnmhIpBcYY4IVShaJtpmHSjBROGFl8kSJ4hONUZPS0vRgmTihlusuI4AH8Bc19EWfsB/HCG1jgh0jdOAub7KtpH7g7hCDE4A5f/1VQLQNrUTj3MeESBzDrHO3FkoBNHS3Qlle6uBoOBn/ComPkAKUO6AxmrqjX0opNqlwoMJZ+QVlTt6jqfVUI47StxCvqhVZ0jPbN1XVenvDAcMst/QzaTV00fICzatwHSwL0MG0iy6ZoszBNOxPFfFLGOQ2Qqibe5fIqus4xaapSgzQKhcXuki9u6KxBIeHFL2i50mB0oUKNImGAybTVI8si+KjoUNuyuSNnRS+7pzzfUYEjYIH8KyOrMv/2KwQlisOgM5ppTzQUIU6mZifHz/NaNVykUIPkLQBTxNxvnMh39MQTkwKjjzGQAXykSSQTtA9w/FW2UZuZfvKuicZSzltOCbjkWQ5jUganVkkLKmsEiURS+mki2rtWOlSiz0qu6rxxcp6pL1aFXqhxhklcItcF1ajqZxUWHdD1hrujfghVol0CBcoBzdcwyaGLnoRbT61hrt3CCKjMSU/SNr91wwbC6OrYRFUjGmgw5QkQaNkF1sq1RkCibqzdZ8XJlVWA/ISMq6EpqE0cjaNJnCT3SnT8ihzyEQ9AiBEI8qsvCo1J85aosh+w86rro85xWKu3laSeZWAijHusXHuMFlIGKJjh4YlOvKwBUOKN/jV/RD+b3tduAQHU1YVPdLjlk0LwJqpGuR5NdRcDJ2KemoDivu4Yi/S5OrHWvr2H/R2I3VIPRxiqqv3oPhi96cdLFGMydR/yxEMGxU/DGsXhdfVP9/lChffrWcHIC56gt/jv+JyXXnv8O9YO2RH8/WAduAgQkAUkZFhXq4UlAEpDu7fLJxpAEJAHF+vH+AUlAEv3i+fb1EpAEJIqBjo2V/LlLkvV7bUUl/KwdflG/D1SUXWSFGG+/owqDr36Oc8h9FrGGc3lD87ZlGTJCK/HaiLOTNkJtJIloG7nmCmy5yGbY85YWyNTs8RiYoV2+hALFPI6IUSmA6kG6o7+THfGnv7vYD0SUUK6tExcEZJAENys/J5AEZJAjJ1dbZJAEZG9Hc3cEZJAEd0tfZ1M0WZBDKqGq1moESY+AffIO4oIyxN5Q9GAwsoiMiN0dpBZN+2vkQIKajpX/hVsQan2980a9yvVvC0381ffVFf/bdfGAl6Qgf6ov1Y7qXwF52Ai7gCz+LtzIx0N0cIzHFEn9Biq0h1tWD+8y9urTVsV9sCa9SwzfXOuqatzJ6MpDKaEMXXraRvsuMPkAk0pC4nc7VPqpUmEMm2Ph2A9rmGU7ZnQ0WjApDIXCP8PQlYXx1r5ndpn65I6QBlMYRv44DQL6DTOfrsiKnOrPmqJWiJmcKJcUZVrZX15VwZxh9dgTQoVhLAvfK2ljjMcgB1NHsOA8/bzCD5ssMMBL/7bzOFqZUGDstJvUNjh3XdqQUdtUKFhV4jDINJ6aVQmw9LjvHUvbjjRg3LUjJnD+r5K7v35pkW9/p0W0gy0EI9Wmu44rNIKjFYK0SJI+cbozJJae/wK7t2ZH4ddqC5F/NTYK81zW9z/Zdn7BvouzJ4GL06AWbCx4/TOd4cjhAwK+BeVpIHEyrFMfaXxMVZhzKq1L3J1MFP7FF7bgR0y+XybMXnd0OvHvguZM2u6z6dSCLTC1R0k/wkIWbY2CW9T9Z/sshYDD0NGaZlyhIryIhHl8YSGCaZ9yCXVhZdCAstO6AAm8kjUSSsOoMAbFrc+L8CAWDBVwgd+xqlnOdCXpaGCQLBQv0ggdmhQdcgMJe5aE0XC1jxOVAkIse/6sBya1ZPvgd75w7PK0B4tKGVfpE9N94ekslMmCAZlKSz9SPDEBJ+qssQyIIKELDR8dTAhIOhA9J0gISCIB58UGAwIi7tEmBRkEpCHjk5PJICASCQXG//eJMDDYHTG8UUWEwZfLgAhZEM/zvXxLcMOcgjOmhXJE18xnAxJ2WsASVQMSXtwaOwwvBiwYKFAYCnLEE6YecTOpMSAPeKHWyV6EGeciupJuxEzCTDwlqBEmti6WImRBFAbe9LFYIQsC+mIx4sJ7UIvCpS1Rzfcfi5sLrg/D4OqBDqc3XXCl7xfEcHBJFgSEkN98ufo2V1EQQcvAi0S4hGY8uzct70s7QQZJCSQwBhlkkAwIFBlkkEEgXFhEZJBBBlBsaGH43xl0c+Dc556Ai6hTL9MuXppCD2uEpYkDVn4UuMolWOh1K71bxQjtrZ+7cIv2e8j6z+AG0M8ZxrG1C0gM8iDe83wpCDNAsrU4K6k3L3UXBOV0alcTpgb4YhGMmbwKOKS1RgaJF7F6ihwssnQI+JdTNPHXZO1JVxdk12C/XfJP/lCYkR/2cqr+crFrMChfzceiYP/e4XdI1dXNqhlY1PHpogYWQDEgY07J21qPOo4O/0KFfjGxkayMj4NLSy9GLxHABLiLGokgYWZTisdB0n5glCFeoREQrHObkNRmsldXk9F1alJt5UKsrxJ0dwQGtr3xR7qx45aOjXaxyf8QLnHI6sRm7ATvgIMXgag47ipYKghK/4Xa5VmSO5lBZu7BPZ/PPgBWZWBVS3tXAFFyPBx9ORDVZFHMkldzXiMV8LzuvvjoQV5I/QXL0UuUn4RIK9jQSsVEtJEyoLffJqlHeQ3hnpRI2gxfGHKAL6YrhdhF/xVdhsRPL5VUqa/jBXhUAfS+d0mfes64Vl25VnmiIgqNIxG2xG61uCgQ6K8WfL1JwDgwlJ2llMQsjfMeFN1aM338HWWiPUOfCXENfWC0MeXkUah+PRjUzmanhWFIx/+5UKFcn0hqXiHUlRn4leTObcR+e7uEq20bX+kXhrDN6gIdzW9FFW2I5xfTUifnxydWlbJts0x0xJVrBWhyzq8QRRObgAiOCEY4439Dn5emeDmt8rDoYqcLiq6ZEZBXlFUPH6B2GSCXBRN0U1i8XFeFtWrOy4NN74686psYSSAeJU90WM5uxFRCMCCZbVRT8ArP4MVmtwoN/a4WGBhXRXgIIFQmo9VxVy7xe8WZdeb/P7dfv5e114McoPJ3KRBH0SMmJgCplpohODqf3CnsblP6MnQX7tmNy2TzSlJhWn2sDFUbiXU2plQ6TxqTxr8KWnRZDKhDuywSo6Xkcj/lGs7fVGcGawiSY2UzPIiG6uCnOAO7b6l5Ub4At18fIPf3kvyqWmQyjSHucgUSRu0Xrq603opLprHYuyetCYYzLaa6Nr+gZD6qE9Z7wrWuOBbR' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= 'ifg6xqM74Ko9fwp7dfGt70fFwb6/GoWC52DE/d9jsQ7ooiWEo+LLgJsw0/tmriQrndsd+rR61i7d0y6K/avDN46r87YvUYK9xdflm/8k0GTkXWIUtKElfVWpJ1F3N0cLiiZsoK45zo8ArDgWs04UpLRS+/fxqyqh/vpBQ2zUnyCfTtqn7IMFv/w/Zx8k1kvwYt+SBJyywcp8fwcHUMqnhMdhUH9jFOu/aFEVr1eqURGc1Tf5vRqh7zuRgmUsQUX4u5PA8cDgvqgvMThg3DBoqqsoHUuEtGCQBwPXnJ0b7ZaHtRz5knpjAKHFO/q8vtCSLU4Ox/v6FdLm+SmTFGxAGZoxu/eMxVwtO5AVHeZxTr0GN2uH1TVRClYcPbB1vaSn1XVr7W+A+1MOVb6L2FQuxGGGyY6CiouKdPCCQal6sCh+9lVioao6LBaL7VVwpfokBaxvC0SXqeq2hmmQ63hDPQwaOekUceH/RHcSUBXf2Zmirofjfok34kPouqMmj+/Wk1m2jtowaJnIC0XOvvAZZ+99cqBVUwDxe8b079RjNihWFqxl3o1pV9UQIgBf3PU/L8WS/+M/i+1TRnhXDdKwi1k9etqC5mt4hVWNmK7jO6xTy7CnsoBn/xX37keg6pKvHk7ceYjAo2F/ucz50BPG/s+ynyJj3nMQrLTfMDGCOjqezTjsmtP3hZkf1FcVTZF/BAQcYEJp+10fCK0IV4rdargIRGw3wiXaP2PR5gxMkWH0FXS5cDF4SV7V6nKg9lzQ8hsI/kxoNxUWkFkIbJZfW/4V/1umWS0xyA+u8Zm+kyLi9N11FHShsXwgMa7jv++2CxRKTPGuYTmeQviN63d/zI7vOPydc/nE4ytUgyCHxj/YtK/CGlUNFW4dibWeNhcGL7i9qkQy3rsgTYd41ezu3yMMYwgsrzgzggmVL9ABMkjIz4+Hd4PCW/FaD0UAx07r5SC6+8ZhMhPmorxXlckbL9vMRRxXvRsfcfcF0aA19LVtfepX90999rev63Jd0Q6QeNKOLPbBpXPz1rzqIq2e4PhsZlcvya+IcmQUd8faZS9OqzrTKnSzIcBuOXnV6E+qeL1MmP/3J+xXKcOBagS0O1Mgt0ljIcNmk7vn8Q/vch4+feGmRG+HcPz7XOzwe7vMHVkaP2/I0Lr4ZAnVcUhEsdfS8rzybRbLva2yy1jy5wLdJPOyx98R8/muqLjSDE9ZL/HN6YBPr48CFzrR9qQ2SuSxYLtKwBq+oyNdgUMSR0UfSdQIGMAUnEIjEReeQeH7Gg+/Hv03pub/l/uoEu+h1YOkx2IspbFAAd8WUgQbxCnqsyixXTk7cI/olfbWsuynKqXpG3kyYyNd3reJiF61FtxEcZUKziso4E/PQ+HGKupOkpHLwpCxwIJguFAqMIqrJbciExanelq311W7wUKyiBn3rGVTXYbgYu06v5NGdZqZhIE9tV1ZMXt9L2zQGmL5AtonCzBvSSheP3pbWf9MqJmyE1gSlXbMwmcvuXc3KC3BitWLYznX+Ik0jvxBQ5NeV7PP8FP02CTouoC3Q7Pqg3YjyLDGh+8rjyv09uWzk21w/AZlCvM/j3Ghdqi/cDVI0NRgqJkyAvZgT3WlgllJzGomUdtfBfpaL6/MdWrk+4bixFa5az8WGP5f03wfsfETmHzXAYIvlL3F7xAUMNf+O+KXcADW/NVop+uq/qRE6jqyjnz3D0DFUSrassqnxiA+/YF2+j8VO+SelbH81WDcBrJdyn+qKnP9V9vpqzdT46eSKScCS0n6gLJK5NFeCzOCaptGt9RXX7LhHLwuot0qwYzr1Ri0FUxafLEYemmZvgCGDmY5fRvywcH/cKg+LXgoVbHKu2gXl03DDrWtWjx9AHZfpGlVVRYZZ1eAA1d0oNktEKkN5w4S/MIiUNxm0a5jpvqnxKUxuuosLY2CJ1/9BSg2XxJYBDzoyITLpbXLoEMRdpCbV9eo/hpi48a7msTnwu3ua6EN87ZlmE+Cta6Tr/UIZKoKwPMzeBrZeavrRGIyaRJpd13/P5gV5/y3y1y5roLA111h60fq38z4NwbTd+Ual4pXpaq1/a7SmBVvpqkOdGa/fOC01Mbj0mzQ/3LtX6pKdP0nXTwfDevmUzHnP4DxfZvE+wwU8igHZX5VJWs8VGSrAkc/AGDW3tHWEMz+uk7wS26ozwOQFa3dnb6tsy7KMceaHf2Fh0wtBt5ub1qV/0Kk1OfPGlEUpBS4uJSqafoEIyIOZcq5WboRCP2Bg81ehkpaejeEEyVdI7NMmAq8skrLsglRFB4briUftAJbqUFoLYW/Bb4k1l9fw5LjoOxgsLkFk5/iCAyJSIdJgBaIBPsnXCp0ZI/UBHYmQIr9p4zVAJjx8c4562Afm/t9UBKX5Z2VblcnaZ7AgOFrrp/I2GmR9nXaOwGT2HuU8ESZLlKu2QjmKteiIYFMRMbXpvrDop4MYGTO/4vNoZLKV1+nXc+nQkHRGizoMioP5Ux8Z6gSKFf3/SuuOLVXSWabGeb8ZRUXVJdGLFo2j/8i7GswhDfVVeXrD6v3McuHH6kFEUQboZeeXf9ehDzGfPXg3/GvfyQwtfyiKmN4x3L3BunSn7a6pEKtj6sGzAfGEDb3cO+W9NpnrLH96V4XeobTpWP+EcQXZHpBCgVbZg8q7HuzUen+BM1GZzyBgQVjVQLioC1DWEO1ICAfLSjHFsL172mxDmNAAGIIA5gQTXPJO4jHwhMmOLIsCCFMBgQhphwXYUA8OAUAKwTEY0pNAgeofA0W6wWbkTMczBPA4MAAYbGwdpSAicS+nbb7rFu+eJwFAVlxbOwCNRMD9yZw0bkgP7QtQKTLXQEksp5pgwlzwXDjjXkqCwLyWl1LtKJCtSILnobt5Pg+mk6ak0rgOuYMiIe8h/mIcy/KEA+RAdVzyBlKEH7RlK5KBNy8sLsZ9frL4UA0LtQSAcTzZC0THm7xR6vKhAO26+r4EgPg1naecCwCAsLFD5uKgCymuXcTA8jiXlnTH4QiIIuGiTdofQG2VEftl9RovftN+sp2uxoBKFn1h42esbsQNS+aM9dInLSVK12yArO70gB/yGtHVgWxITh2a+8imeIjHaiyryV8DpgIzAGSAEgTgkhJhxyD7zC0sZGmaZouQ2h1oZiOrNg0tRBROkVVCulWAelmHd/+U/9C7Feh/4u5vq7Z10V4Vqv9GCLIPEArOHrMdOT/cuhEVQSO3DJss4pexQFfFfsGpX0TyQ/KAxrcodUmViUkO500o6xKiL+Bj/6N3R19ua6+sq4ispWzAeFRgWfLuIqIxYBRFCP1pFpV2/0LXCqyUFkQcPRPG5GNvgqZqhjIi8uQSrNVRWqli5jrBOVhGIoMBUdjSJ3invt3uUj3GgyyFnQQr2ICv5hoQLIPUrY9ASlDAG5r/6Y2oXRHc6ofLWbsM7hdptEn0TYvQzwh+44KHboPBqCswIlD3DCeht7O8w/KutjXIJUE/BOLi6ILglyWmzOEqPoaVRlX6+HFTnEmNB2hGrV+iYkZyXKN7o3ZNVcVm1vuYfW9L8d6pPuOKn+RfaRsqP41VrWqKogfTCEdJue/o2CRhkNhsX6uWkrZ326D6yl8YWqYzNjUs/J6HzC8++22wkLXwk/46cQ8/yCvAoZYt6XuLqLY4YJnfmKNBJb5qjT11u2ti0IcjLvuKEADIxZnbSQwUvjjBeflBB9kW5KtXdXHVU3o1HSynxSncFVVcjyX9V1Ly/6SG2mZvENV+S7sf6f11OjqXUdz1hJRsfh/CezsaWAwpsHkVwgxUvnfGAyp8iFGJExq8/WmLUgRnHWVIkJMNML9jNXO1Qq9ND4gmymRV7Zyo+QTxevAfXG9g0Yurm907usbwHIds9HlGoQaqiUkq7uCPO6mYlVZYzH5/GmEM3f/VwnKVDFnvh+Funtt+9x1sSL5PlMFACsNFhclEjoTWZqNHDEcS0cb7r6QuPt5xG/B1NU0FA/5L8KrWrHfQUM0Iufg' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= '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' $sFileBin &= 'C3TQMwBjUvg03ZCAHQBVoBR9NmWXRABMYz4slTQARQAMR2ppH9/jTwA0H6VObJ1wRAAaU9RBZChdKgAIKg4GAICWCAAaPT0AI25yIAA7JRgnOig1PgAGOi0DJtaLFAALSA4PGfbHJABNGVb+MeIFBQByITs1G/vTpwBEjiGZvVVQcQDPx8307si2vwD9pvHlDEmSawDbyY/YVNNZ1QCgZsSQv43UnADcAQCIz8PhlwCdy93LpKuxmwDvHyC3vqeyigAb4r2jzo3vKgDkvGdP12FJBwBKvZiYr5YekwCZnnDDutaWeQCNDxCTm6uQmQCOC50Z34Z5vgBoyFuEbV5XIgAOeSxu/tye8ACiLGmqDgkPUgBjTPZeflITWADbKUuRxW95rwB4iHtjayxMTQBTcoAIZkYwnwA74Tt+XCSToQD1GjGQE4vzhQCKRV/zuyUBUwCflOIISQ4GFgDbVgWs7BgDjgBVABIqvyoMHwACucpekEREEgCGFdr56djg7QBMx8buVicBAADXwtnBxvfl5gD33v2l7uzz5gAAcf6kiN/+0ADQ3tva1jlgAwCOBqLUyc/VwwDU2sjZ0po+dwCKsa+/tmgkvQBLsr6ou2XgKgAlp7Kfv7ZWoQDpu6+Ig72KlQC5AKm+B4+dvgCauZvt3O3RJQBBydmWhW95BwBpijZ+ZmhQFQBoXVcULYAOQQB7ZgB+X0BycgD7RE7+BTszfQCA3b8ABhV5OgDe23BLBNCNIgDfTyvEuAJcGYBcVHcDOPqHAJgAXHEWA/7JWEQASV/nknKvOOkAAbImDw4yBbIAOVuOIl8oVRAABh8RHw45dW4AjDAn2sQYxAsAFxkELQcyFDMAWOzm2BQRyaYA9c/Dws2CJWwActTS1qKx9AEA4sDKxLhbsEYAufor1qGa9ZYA6QiotI5v1k8AlLyi7pElKTkAromocw1YF5gAg8J0BUi9sJAAmraDgp+EFUAA1y+ThJSljaEAs6KKb1agRyEA6ktTdWAVc/8Ad0d1PYJeWn4AY31ggC4sgkMATE+soGtFWU0ARFpJQV1d8ZsA/GZoh6DXYlIAVHs3vStpNTEAPRaz1zmsavUAWjVxDXpESw4AD59zI+2w484AyBEfTxCrKnQAf8X4g2MdP/kA7VuhnwFLWfUA+PcfglbG5+wAy/q7EnmVNKoA8uJyj1tM00cAbcjg0rHwzzAAg0wAa9cvDrAAc1jGB+HCG2AAC6LqRBz+EAIAbUc+WA0shQsAijPaIQAbbDsgAEAGABCA0jcw/FEwwAAfAB8AHwAfAAwA9gEyClB3gH0BAXWAC34BIAkIAABIkABgEBgGANhBAgwA2AE0QVAAVgBTAF9QAEUEAFKQAEkATwBONfAASVAARrAAAQC9BETv/vEEBAACUAAI63IAAQA/dAQEMAATAQcACjjwBgHwBHQAcgAgaQBuAGfQBGkACGwAZZAFbgBmACpvMAIUMgIwFgA0AEJicQwASgAVcAFDQTACbQBwAGHwAnlV0Ahh0ABlsgVVEAE0FABz0ABlkAAgAERVcAB2MABsEANwUgJuxXAHc7ICMgAFsAS1B1GRAnMAYzIJcDACaUUQA25yAkIAQdAKU1GyACwABjgDVjAAciNQA7cCMgAu8AcuAKI4sABQABawAkwwAmpnEApsUgtw8AoRBme0AGgwBgA/ATALqTAAqDEAORIALRAFMNAA1jGwAuGYATAHYdACHxNoAAAk0hZU0AFxEXMF8AFhegwAALAE' $sFileBin = Binary ( _Base64Decode ( $sFileBin ) ) $sFileBin = Binary ( _LzntDecompress ( $sFileBin ) ) Return SetError ( 0, 0, $sFileBin ) EndFunc ;==> Bassdll() Func Loupe2Ico ( $sFileName, $sOutputDirPath, $iOverWrite=0 ) ; Code Generated by BinaryToAu3Kompressor. Local $sFileBin = 'AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AHh1mQCDgKMAf3qlAGxmbgDWmNoAoIegAINAeQCjV48A146yAGNhYgCKU20AtHKQAJ9lfQCja30AuXyMAMiLmwDAlJsAqIOHAJ1pbQCZZmYAnWpqAKFubgClcnIAm2trAKNxcQCpdnYAn29vAKZ2dgC0gYEAgl1dALaDgwC4hYUAtYODAHhXVwCec3MAgF1dAINgYADBjo4AsoODAMeUlADGk5MAy5iYAMmWlgCwh4cAtZKSAGFPTwDHpKQAdWFhAGxcXACmpKQAdHNzALa1tQCxf34AvouKAKd1cgCjcm8ArXx5ALyJhgCvgHsAqnx3ALuPigDJmpQAzJ6XALuSigDRpJoAwpGDALaNgADUpJMAxJiFAMObigDVtKQA3q+RAMqljgDas5sA4bujANCskwDIp5EA57eVAPG/lgDqw6AA48mxAP/OmwD/0Z4A/9KgAPjRpQDgxKYA/9ShAP/VogD/1qMA+9OjAP/YqQD/2aoA99OnAPXSqQDrzagA18GoAP/XpAD/2aYA+dWlAP/aqwD/3bAA/9uoAP/cqQD/3aoA/92sAP/htQD/3qsA/9+sAP/grQD/47cA/+W9AP/hrgD/4q8A/+OwAP/ktgD/5bgA7tauAP/ovgD/5LEA/+WyAP/mswD/6sIA//HWAP/ntAD/6LUA/+i3AP/pugD/7soA//DRAP/qtwD/67gA/+u6APvouAD/7L0A/+y/AP/uwwD05LwA/+7GAOzgwwD/7LkA/+26AP/uvwD/8s0A/fbiAP/uuwD/77wA//HEAP/yygD/8L0A//G+AP/11AD/+ugA//32AP/yvwD/88AA//THAP/32AD//fUA//TBAP/2zQD/99EA//jZAP/53gD69+kA//XCAP/2wwD58cUA9/DKAP/40wD07s0A//jFAPPtxAD//e8A//3wAP/5xgD/+scA//vIAP/70wD//NUA//zJAP/80AD//NIA//3XAP/92gD//coA//3MAP/+ywD//8wA///PAP//0QD//9MA///VAP//1gD//9kA///bAP//3AD//98A///hAP//4gD//+UA///mAP//6QD//+oA///tAP//7gD///AA///zAP//9AD///cA///4AP//+gD///0AAAAAAGHH/wBRt/8AVbv/AFms4gBvwvkAZbj0AEKo/wBPm+kAu8HHADaU9gBAjNsAZGhtAGdrcABAfdIAZGZqAJWWmABJarUATmqnAFJtqgBfbaoAgpT/AIqc/QCLi4sAhISEAHt7ewBra2sAXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1iIFBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbvBRAQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW7ePqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tY04OfqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tzd4OfqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3NnY4OfqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3Nnd4OTqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3NnY4OfqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3Nnd4OTqAxIQBdbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3Nfd4OfqAxIQ1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW3NnY4OTqAw3W1gUFBQUFBQUFBdbW1tbW1tbW1tbW1tbW3Nnd4OfjAgUFKkRERDoqKw0VDAXW1tbW1tbW1tbW1tbW3Nfd7O4HMw8eS2CXsbuhjEgeFAXW1tbW1tbW1tbW1tbW2NwGNe8iRWyHobfAwsLDw6tBDgXW1tbW1tbW1tbW1tbW1tY1O09llbu6vsLFxsbL0qU/DgXW1tbW1tbW1tbW1tbW1i5PXbabl7vAxMjLzQEBAaVEDAXW1tbW1tbW1tbW1tbWRVihl36mvsLGys7RAQEBzowUBdbW1tbW1tbW1tbW1gpRd6dyg6e+w8bM0NTV1dPFwj4UBdbW1tbW1tbW1tbWK2e2fW2Dp77DxsvP09PPy8TDYQwF1tbW1tbW1tbW1kJCdbJpbH6cvcLGyczOzszJxcGKFAXW1tbW1tbW1tbWS0yJsFpneJK6v8PGycrKycbDv7IVBdbW1tbW1tbW1tZCV5WwWWJug6C7wMPFxsbFw7+9nBUF1tbW1tbW1tbW1ktCiLFqe4mDprG7vsDBwcC+vaFgFQXW1tbW1tbW1tbW1kCFtqNvZmV4m6Cxur29urCylEsO1tbW1tbW1tbW1tbWS3ahmYJ8cGVznISWlpaTlrZzRAzW1tbW1tbW1tbW1tbWQpTVAQGZa2OPcnh5eX2yf1EU1tbW1tbW1tbW1tbW1tYRTJoBAa5wcGZiY2h+sYlTPAzW1tbW1tbW1tbW1tbW1tYRjAEBrp6qbWl+prZ1U0M81tbW1tbW1tbW1tbW1tbW1tYQSJ6etLe2traUbFFDPNbW1tbW1tbW1tbW1tbW1tbW1tYRIkt2fnhyZlFFENbW1tbW1tbW1tbW1tbW1tbW1tbW1tbWEToVOiorCtbW1tbW1tbW1v/////H////g////wH///8A////AH///wA///+AH///wA///+AH///wB///+AYA//wAAD/+AAAf/wAAD//gAAf/4AAD/+AAA//AAAH/wAAB/4AAAf+AAAH/gAAB/4AAAf/AAAP/wAAD/+AAB//gAAf/8AAP//gAH//8AH///wH/' $sFileBin = Binary ( _Base64Decode ( $sFileBin ) ) If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath ) If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\' Local $sFilePath = $sOutputDirPath & $sFileName If FileExists ( $sFilePath ) Then If $iOverWrite = 1 Then If Not Filedelete ( $sFilePath ) Then Return SetError ( 2, 0, $sFileBin ) Else Return SetError ( 0, 0, $sFileBin ) EndIf EndIf Local $hFile = FileOpen ( $sFilePath, 16+2 ) If $hFile = -1 Then Return SetError ( 3, 0, $sFileBin ) FileWrite ( $hFile, $sFileBin ) FileClose ( $hFile ) Return SetError ( 0, 0, $sFileBin ) EndFunc ;==> Loupe2Ico() Func MemLib_BuildImportTable ( $CodeBase, $PEHeader ) Local Const $IMAGE_DIRECTORY_ENTRY_IMPORT = 1 Local Const $SizeOfPtr = DllStructGetSize ( DllStructCreate ( 'ptr', 1 ) ) Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) Local $SizeOfDataDirectory = DllStructGetSize ( DllStructCreate ( $tagIMAGE_DATA_DIRECTORY ) ) Local $ImportDirectoryPtr = $PEHeader + DllStructGetSize ( $IMAGE_NT_HEADER ) + $IMAGE_DIRECTORY_ENTRY_IMPORT * $SizeOfDataDirectory Local $ImportDirectory = DllStructCreate ( $tagIMAGE_DATA_DIRECTORY, $ImportDirectoryPtr ) Local $ImportSize = DllStructGetData ( $ImportDirectory, 'Size' ) Local $ImportVirtualAddress = DllStructGetData ( $ImportDirectory, 'VirtualAddress' ) Local $SizeOfImportDir = DllStructGetSize ( DllStructCreate ( $tagIMAGE_IMPORT_DESCRIPTOR ) ) Local $ImportList = '' If $ImportSize > 0 Then Local $ImportDescPtr = $CodeBase + $ImportVirtualAddress While 1 If API_IsBadReadPtr ( $ImportDescPtr, $SizeOfImportDir ) Then ExitLoop Local $ImportDesc = DllStructCreate ( $tagIMAGE_IMPORT_DESCRIPTOR, $ImportDescPtr ) Local $NameOffset = DllStructGetData ( $ImportDesc, 'Name' ) If $NameOffset = 0 Then ExitLoop Local $Name = Peek ( 'str', $CodeBase + $NameOffset ) Local $OriginalFirstThunk = DllStructGetData ( $ImportDesc, 'OriginalFirstThunk' ) Local $FirstThunk = DllStructGetData ( $ImportDesc, 'FirstThunk' ) Local $Handle = API_LoadLibrary ( $Name ) If $Handle Then $ImportList &= $Handle & ',' Local $FuncRef = $CodeBase + $FirstThunk Local $ThunkRef = $CodeBase + $OriginalFirstThunk If $OriginalFirstThunk = 0 Then $ThunkRef = $FuncRef While 1 Local $Ref = Peek ( 'ptr', $ThunkRef ) If $Ref = 0 Then ExitLoop If BitAND ( Peek ( 'byte', $ThunkRef + $SizeOfPtr - 1 ), 0x80 ) Then Local $Ptr = API_GetProcAddress ( $Handle, BitAND ( $Ref, 0xffff ) ) Else Local $IMAGE_IMPORT_BY_NAME = DllStructCreate ( $tagIMAGE_IMPORT_BY_NAME, $CodeBase + $Ref ) Local $NamePtr = DllStructGetPtr ( $IMAGE_IMPORT_BY_NAME, 2 ) Local $FuncName = Peek ( 'str', $NamePtr ) Local $Ptr = API_GetProcAddress ( $Handle, $FuncName ) EndIf If $Ptr = 0 Then Return SetError ( 1, 0, False ) Poke ( 'ptr', $FuncRef, $Ptr ) $ThunkRef += $SizeOfPtr $FuncRef += $SizeOfPtr WEnd Else Return SetError ( 1, 0, False ) EndIf $ImportDescPtr += $SizeOfImportDir WEnd EndIf Return $ImportList EndFunc ;==> MemLib_BuildImportTable() Func MemLib_CopySections ( $CodeBase, $PEHeader, $DllDataPtr ) Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) Local $SizeOfFileHeader = DllStructGetPtr ( $IMAGE_NT_HEADER, 'Magic' ) - $PEHeader Local $SizeOfOptionalHeader = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfOptionalHeader' ) Local $NumberOfSections = DllStructGetData ( $IMAGE_NT_HEADER, 'NumberOfSections' ) Local $SectionAlignment = DllStructGetData ( $IMAGE_NT_HEADER, 'SectionAlignment' ) Local $SectionPtr = $PEHeader + $SizeOfFileHeader + $SizeOfOptionalHeader For $i = 1 To $NumberOfSections Local $Section = DllStructCreate ( $tagIMAGE_SECTION_HEADER, $SectionPtr ) Local $VirtualAddress = DllStructGetData ( $Section, 'VirtualAddress' ) Local $SizeOfRawData = DllStructGetData ( $Section, 'SizeOfRawData' ) Local $PointerToRawData = DllStructGetData ( $Section, 'PointerToRawData' ) If $SizeOfRawData = 0 Then Local $Dest = _MemVirtualAlloc ( $CodeBase + $VirtualAddress, $SectionAlignment, $MEM_COMMIT, $PAGE_READWRITE ) API_ZeroMemory ( $Dest, $SectionAlignment ) Else Local $Dest = _MemVirtualAlloc ( $CodeBase + $VirtualAddress, $SizeOfRawData, $MEM_COMMIT, $PAGE_READWRITE ) _MemMoveMemory ( $DllDataPtr + $PointerToRawData, $Dest, $SizeOfRawData ) EndIf DllStructSetData ( $Section, 'VirtualSize', $Dest - $CodeBase ) $SectionPtr += DllStructGetSize ( $Section ) Next EndFunc ;==> MemLib_CopySections() Func MemLib_FinalizeSections ( $CodeBase, $PEHeader ) Local Const $IMAGE_SCN_MEM_EXECUTE = 0x20000000 Local Const $IMAGE_SCN_MEM_READ = 0x40000000 Local Const $IMAGE_SCN_MEM_WRITE = 0x80000000 Local Const $IMAGE_SCN_MEM_NOT_CACHED = 0x4000000 Local Const $IMAGE_SCN_CNT_INITIALIZED_DATA = 64 Local Const $IMAGE_SCN_CNT_UNINITIALIZED_DATA = 128 Local Const $PAGE_WRITECOPY = 0x0008 Local Const $PAGE_EXECUTE_WRITECOPY = 0x0080 Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) Local $SizeOfFileHeader = DllStructGetPtr ( $IMAGE_NT_HEADER, 'Magic' ) - $PEHeader Local $SizeOfOptionalHeader = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfOptionalHeader' ) Local $NumberOfSections = DllStructGetData ( $IMAGE_NT_HEADER, 'NumberOfSections' ) Local $SectionAlignment = DllStructGetData ( $IMAGE_NT_HEADER, 'SectionAlignment' ) Local $SectionPtr = $PEHeader + $SizeOfFileHeader + $SizeOfOptionalHeader For $i = 1 To $NumberOfSections Local $Section = DllStructCreate ( $tagIMAGE_SECTION_HEADER, $SectionPtr ) Local $Characteristics = DllStructGetData ( $Section, 'Characteristics' ) Local $SizeOfRawData = DllStructGetData ( $Section, 'SizeOfRawData' ) Local $Executable = ( BitAND ( $Characteristics, $IMAGE_SCN_MEM_EXECUTE ) <> 0 ) Local $Readable = ( BitAND ( $Characteristics, $IMAGE_SCN_MEM_READ ) <> 0 ) Local $Writeable = ( BitAND ( $Characteristics, $IMAGE_SCN_MEM_WRITE ) <> 0 ) Local $ProtectList[8] = [$PAGE_NOACCESS, $PAGE_EXECUTE, $PAGE_READONLY, $PAGE_EXECUTE_READ, $PAGE_WRITECOPY, $PAGE_EXECUTE_WRITECOPY, $PAGE_READWRITE, $PAGE_EXECUTE_READWRITE] Local $Protect = $ProtectList[$Executable + $Readable * 2 + $Writeable * 4] If BitAND ( $Characteristics, $IMAGE_SCN_MEM_NOT_CACHED ) Then $Protect = BitOR ( $Protect, $PAGE_NOCACHE ) Local $Size = $SizeOfRawData If $Size = 0 Then If BitAND ( $Characteristics, $IMAGE_SCN_CNT_INITIALIZED_DATA ) Then $Size = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfInitializedData' ) ElseIf BitAND ( $Characteristics, $IMAGE_SCN_CNT_UNINITIALIZED_DATA ) Then $Size = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfUninitializedData' ) EndIf EndIf If $Size > 0 Then Local $PhysicalAddress = $CodeBase + DllStructGetData ( $Section, 'VirtualSize' ) API_VirtualProtect ( $PhysicalAddress, $Size, $Protect ) EndIf $SectionPtr += DllStructGetSize ( $Section ) Next EndFunc ;==> MemLib_FinalizeSections() Func MemLib_FreeLibrary ( $ModulePtr ) If Not MemLib_Vaild ( $ModulePtr ) Then Return 0 Local $Module = DllStructCreate ( $tagModule, $ModulePtr ) Local $CodeBase = DllStructGetData ( $Module, 'CodeBase' ) Local $DllEntry = DllStructGetData ( $Module, 'DllEntry' ) Local $Initialized = DllStructGetData ( $Module, 'Initialized' ) Local $ImportListPtr = DllStructGetData ( $Module, 'ImportList' ) Local $ExportListPtr = DllStructGetData ( $Module, 'ExportList' ) If $Initialized And $DllEntry Then Local $Success = MemoryFuncCall ( 'bool', $DllEntry, 'ptr', $CodeBase, 'dword', 0, 'ptr', 0 ) ; DLL_PROCESS_DETACH DllStructSetData ( $Module, 'Initialized', 0 ) EndIf If $ExportListPtr Then _MemGlobalFree ( $ExportListPtr ) If $ImportListPtr Then Local $ImportList = StringSplit ( Peek ( 'str', $ImportListPtr ), ',' ) For $i = 1 To $ImportList[0] If $ImportList[$i] Then API_FreeLibrary ( $ImportList[$i] ) Next _MemGlobalFree ( $ImportListPtr ) EndIf If $CodeBase Then _MemVirtualFree ( $CodeBase, 0, $MEM_RELEASE ) DllStructSetData ( $Module, 'CodeBase', 0 ) DllStructSetData ( $Module, 'ExportList', 0 ) _MemGlobalFree ( $ModulePtr ) Return 1 EndFunc ;==> MemLib_FreeLibrary() Func MemLib_GetExportList ( $CodeBase, $PEHeader ) Local Const $IMAGE_DIRECTORY_ENTRY_EXPORT = 0 Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) Local $SizeOfDataDirectory = DllStructGetSize ( DllStructCreate ( $tagIMAGE_DATA_DIRECTORY ) ) Local $ExportDirectoryPtr = $PEHeader + DllStructGetSize ( $IMAGE_NT_HEADER ) + $IMAGE_DIRECTORY_ENTRY_EXPORT * $SizeOfDataDirectory Local $ExportDirectory = DllStructCreate ( $tagIMAGE_DATA_DIRECTORY, $ExportDirectoryPtr ) Local $ExportSize = DllStructGetData ( $ExportDirectory, 'Size' ) Local $ExportVirtualAddress = DllStructGetData ( $ExportDirectory, 'VirtualAddress' ) Local $ExportList = '' If $ExportSize > 0 Then Local $IMAGE_EXPORT_DIRECTORY = DllStructCreate ( $tagIMAGE_EXPORT_DIRECTORY, $CodeBase + $ExportVirtualAddress ) Local $NumberOfNames = DllStructGetData ( $IMAGE_EXPORT_DIRECTORY, 'NumberOfNames' ) Local $NumberOfFunctions = DllStructGetData ( $IMAGE_EXPORT_DIRECTORY, 'NumberOfFunctions' ) Local $AddressOfFunctions = DllStructGetData ( $IMAGE_EXPORT_DIRECTORY, 'AddressOfFunctions' ) If $NumberOfNames = 0 Or $NumberOfFunctions = 0 Then Return '' Local $NameRef = $CodeBase + DllStructGetData ( $IMAGE_EXPORT_DIRECTORY, 'AddressOfNames' ) Local $Ordinal = $CodeBase + DllStructGetData ( $IMAGE_EXPORT_DIRECTORY, 'AddressOfNameOrdinals' ) For $i = 1 To $NumberOfNames Local $Ref = Peek ( 'dword', $NameRef ) Local $Idx = Peek ( 'word', $Ordinal ) Local $FuncName = Peek ( 'str', $CodeBase + $Ref ) If $Idx <= $NumberOfFunctions Then Local $Addr = $CodeBase + Peek ( 'dword', $CodeBase + $AddressOfFunctions + $Idx * 4 ) $ExportList &= $FuncName & Chr ( 1 ) & $Addr & Chr ( 1 ) EndIf $NameRef += 4 ; DWORD $Ordinal += 2 ; WORD Next EndIf Return $ExportList EndFunc ;==> MemLib_GetExportList() Func MemLib_GetProcAddress ( $ModulePtr, $FuncName ) Local $ExportPtr = Peek ( 'ptr', $ModulePtr ) If Not $ExportPtr Then Return 0 Local $ExportList = Peek ( 'str', $ExportPtr ) Local $Match = StringRegExp ( $ExportList, '(?i)' & $FuncName & '\001([^\001]*)\001', 3 ) If Not @Error Then Return Ptr ( $Match[0] ) Return 0 EndFunc ;==> MemLib_GetProcAddress() Func MemLib_LoadLibrary ( $DllBinary ) $DllBinary = Binary ( $DllBinary ) Local $DllData = DllStructCreate ( 'byte[' & BinaryLen ( $DllBinary ) & ']' ) Local $DllDataPtr = DllStructGetPtr ( $DllData ) DllStructSetData ( $DllData, 1, $DllBinary ) Local $IMAGE_DOS_HEADER = DllStructCreate ( $tagIMAGE_DOS_HEADER, $DllDataPtr ) If DllStructGetData ( $IMAGE_DOS_HEADER, 'e_magic' ) <> 0x5A4D Then Return SetError ( 1, 0, 0 ) EndIf Local $PEHeader = $DllDataPtr + DllStructGetData ( $IMAGE_DOS_HEADER, 'e_lfanew' ) Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) If DllStructGetData ( $IMAGE_NT_HEADER, 'Signature' ) <> 0x4550 Then Return SetError ( 1, 0, 0 ) EndIf Switch DllStructGetData ( $IMAGE_NT_HEADER, 'Magic' ) Case 0x20B ; IMAGE_NT_OPTIONAL_HDR64_MAGIC Return SetError ( 2, 0, 0 ) EndSwitch Local $ImageBase = DllStructGetData ( $IMAGE_NT_HEADER, 'ImageBase' ) Local $SizeOfImage = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfImage' ) Local $SizeOfHeaders = DllStructGetData ( $IMAGE_NT_HEADER, 'SizeOfHeaders' ) Local $AddressOfEntryPoint = DllStructGetData ( $IMAGE_NT_HEADER, 'AddressOfEntryPoint' ) Local $ModulePtr = _MemGlobalAlloc ( DllStructGetSize ( DllStructCreate ( $tagModule ) ), $GPTR ) If $ModulePtr = 0 Then Return SetError ( 3, 0, 0 ) Local $Module = DllStructCreate ( $tagModule, $ModulePtr ) Local $CodeBase = _MemVirtualAlloc ( $ImageBase, $SizeOfImage, $MEM_RESERVE, $PAGE_READWRITE ) If $CodeBase = 0 Then $CodeBase = _MemVirtualAlloc ( 0, $SizeOfImage, $MEM_RESERVE, $PAGE_READWRITE ) If $CodeBase = 0 Then Return SetError ( 3, 0, 0 ) DllStructSetData ( $Module, 'CodeBase', $CodeBase ) _MemVirtualAlloc ( $CodeBase, $SizeOfImage, $MEM_COMMIT, $PAGE_READWRITE ) Local $Base = _MemVirtualAlloc ( $CodeBase, $SizeOfHeaders, $MEM_COMMIT, $PAGE_READWRITE ) _MemMoveMemory ( $DllDataPtr, $Base, $SizeOfHeaders ) MemLib_CopySections ( $CodeBase, $PEHeader, $DllDataPtr ) Local $LocationDelta = $CodeBase - $ImageBase If $LocationDelta <> 0 Then MemLib_PerformBaseRelocation ( $CodeBase, $PEHeader, $LocationDelta ) Local $ImportList = MemLib_BuildImportTable ( $CodeBase, $PEHeader ) If @Error Then MemLib_FreeLibrary ( $ModulePtr ) Return SetError ( 2, 0, 0 ) EndIf Local $ExportList = MemLib_GetExportList ( $CodeBase, $PEHeader ) Local $ImportListPtr = _MemGlobalAlloc ( StringLen ( $ImportList ) + 2, $GPTR ) Local $ExportListPtr = _MemGlobalAlloc ( StringLen ( $ExportList ) + 2, $GPTR ) DllStructSetData ( $Module, 'ImportList', $ImportListPtr ) DllStructSetData ( $Module, 'ExportList', $ExportListPtr ) If $ImportListPtr = 0 Or $ExportListPtr = 0 Then MemLib_FreeLibrary ( $ModulePtr ) Return SetError ( 3, 0, 0 ) EndIf Poke ( 'str', $ImportListPtr, $ImportList ) Poke ( 'str', $ExportListPtr, $ExportList ) MemLib_FinalizeSections ( $CodeBase, $PEHeader ) Local $DllEntry = $CodeBase + $AddressOfEntryPoint DllStructSetData ( $Module, 'DllEntry', $DllEntry ) DllStructSetData ( $Module, 'Initialized', 0 ) If $AddressOfEntryPoint Then Local $Success = MemoryFuncCall ( 'bool', $DllEntry, 'ptr', $CodeBase, 'dword', 1, 'ptr', 0 ) ; DLL_PROCESS_ATTACH If Not $Success[0] Then MemLib_FreeLibrary ( $ModulePtr ) Return SetError ( 4, 0, 0 ) EndIf DllStructSetData ( $Module, 'Initialized', 1 ) EndIf Return $ModulePtr EndFunc ;==> MemLib_LoadLibrary() Func MemLib_PerformBaseRelocation ( $CodeBase, $PEHeader, $LocationDelta ) Local Const $IMAGE_DIRECTORY_ENTRY_BASERELOC = 5 Local Const $IMAGE_REL_BASED_HIGHLOW = 3 Local Const $IMAGE_REL_BASED_DIR64 = 10 Local $IMAGE_NT_HEADER = DllStructCreate ( $tagIMAGE_NT_HEADER, $PEHeader ) Local $SizeOfDataDirectory = DllStructGetSize ( DllStructCreate ( $tagIMAGE_DATA_DIRECTORY ) ) Local $RelocDirectoryPtr = $PEHeader + DllStructGetSize ( $IMAGE_NT_HEADER ) + $IMAGE_DIRECTORY_ENTRY_BASERELOC * $SizeOfDataDirectory Local $RelocDirectory = DllStructCreate ( $tagIMAGE_DATA_DIRECTORY, $RelocDirectoryPtr ) Local $RelocSize = DllStructGetData ( $RelocDirectory, 'Size' ) Local $RelocVirtualAddress = DllStructGetData ( $RelocDirectory, 'VirtualAddress' ) If $RelocSize > 0 Then Local $Relocation = $CodeBase + $RelocVirtualAddress While 1 Local $IMAGE_BASE_RELOCATION = DllStructCreate ( $tagIMAGE_BASE_RELOCATION, $Relocation ) Local $VirtualAddress = DllStructGetData ( $IMAGE_BASE_RELOCATION, 'VirtualAddress' ) Local $SizeOfBlock = DllStructGetData ( $IMAGE_BASE_RELOCATION, 'SizeOfBlock' ) If $VirtualAddress = 0 Then ExitLoop Local $Dest = $CodeBase + $VirtualAddress Local $Entries = ( $SizeOfBlock - 8 ) / 2 Local $RelInfo = DllStructCreate ( 'word[' & $Entries & ']', $Relocation + 8 ) For $i = 1 To $Entries Local $Info = DllStructGetData ( $RelInfo, 1, $i ) Local $Type = BitShift ( $Info, 12 ) If $Type = $IMAGE_REL_BASED_HIGHLOW Or $Type = $IMAGE_REL_BASED_DIR64 Then Local $Addr = DllStructCreate ( 'ptr', $Dest + BitAND ( $Info, 0xFFF ) ) DllStructSetData ( $Addr, 1, DllStructGetData ( $Addr, 1 ) + $LocationDelta ) EndIf Next $Relocation += $SizeOfBlock WEnd EndIf EndFunc ;==> MemLib_PerformBaseRelocation() Func MemLib_Vaild ( $ModulePtr ) Local $ModuleSize = DllStructGetSize ( DllStructCreate ( $tagModule ) ) If API_IsBadReadPtr ( $ModulePtr, $ModuleSize ) Then Return False Local $Module = DllStructCreate ( $tagModule, $ModulePtr ) Local $CodeBase = DllStructGetData ( $Module, 'CodeBase' ) If Not $CodeBase Then Return False Return True EndFunc ;==> MemLib_Vaild() Func MemoryDllCall ( $Module, $RetType, $FuncName, $Type1 = '', $Param1 = 0, $Type2 = '', $Param2 = 0, $Type3 = '', $Param3 = 0, $Type4 = '', $Param4 = 0, $Type5 = '', $Param5 = 0, $Type6 = '', $Param6 = 0, $Type7 = '', $Param7 = 0, $Type8 = '', $Param8 = 0, $Type9 = '', $Param9 = 0, $Type10 = '', $Param10 = 0, $Type11 = '', $Param11 = 0, $Type12 = '', $Param12 = 0, $Type13 = '', $Param13 = 0, $Type14 = '', $Param14 = 0, $Type15 = '', $Param15 = 0, $Type16 = '', $Param16 = 0, $Type17 = '', $Param17 = 0, $Type18 = '', $Param18 = 0, $Type19 = '', $Param19 = 0, $Type20 = '', $Param20 = 0 ) Local $Ret, $OpenFlag = False Local Const $MaxParams = 20 If ( @NumParams < 3 ) Or ( @NumParams > $MaxParams * 2 + 3 ) Or ( Mod ( @NumParams, 2 ) = 0 ) Then Return SetError ( 4, 0, 0 ) If Not IsPtr ( $Module ) Then $OpenFlag = True $Module = MemoryDllOpen ( $Module ) If @Error Then Return SetError ( 1, 0, 0 ) EndIf Local $Addr = MemLib_GetProcAddress ( $Module, $FuncName ) If Not $Addr Then Return SetError ( 3, 0, 0 ) Poke ( 'ptr', $_MFHookPtr + 1, $Addr ) Switch @NumParams Case 3 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi ) Case 5 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1 ) Case 7 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2 ) Case 9 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3 ) Case 11 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4 ) Case 13 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5 ) Case Else Local $DllCallStr = 'DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi', $n = 1 For $i = 5 To @NumParams Step 2 $DllCallStr &= ', $Type' & $n & ', $Param' & $n $n += 1 Next $DllCallStr &= ' )' $Ret = Execute ( $DllCallStr ) EndSwitch Local $Err = @Error If $OpenFlag Then MemoryDllClose ( $Module ) Return SetError ( $Err, 0, $Ret ) EndFunc ;==> MemoryDllCall() Func MemoryDllClose ( $Module ) MemLib_FreeLibrary ( $Module ) EndFunc ;==> MemoryDllClose() Func MemoryDllOpen ( $DllBinary ) If Not IsDllStruct ( $_MFHookBak ) Then MemoryFuncInit() Local $Module = MemLib_LoadLibrary ( $DllBinary ) If @Error Then Return SetError ( @Error, 0, -1 ) Return $Module EndFunc ;==> MemoryDllOpen() Func MemoryFuncCall ( $RetType, $Address, $Type1 = '', $Param1 = 0, $Type2 = '', $Param2 = 0, $Type3 = '', $Param3 = 0, $Type4 = '', $Param4 = 0, $Type5 = '', $Param5 = 0, $Type6 = '', $Param6 = 0, $Type7 = '', $Param7 = 0, $Type8 = '', $Param8 = 0, $Type9 = '', $Param9 = 0, $Type10 = '', $Param10 = 0, $Type11 = '', $Param11 = 0, $Type12 = '', $Param12 = 0, $Type13 = '', $Param13 = 0, $Type14 = '', $Param14 = 0, $Type15 = '', $Param15 = 0, $Type16 = '', $Param16 = 0, $Type17 = '', $Param17 = 0, $Type18 = '', $Param18 = 0, $Type19 = '', $Param19 = 0, $Type20 = '', $Param20 = 0 ) If Not IsDllStruct ( $_MFHookBak ) Then MemoryFuncInit() Poke ( 'ptr', $_MFHookPtr + 1, $Address ) Local $Ret Switch @NumParams Case 2 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi ) Case 4 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1 ) Case 6 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2 ) Case 8 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3 ) Case 10 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4 ) Case 12 $Ret = DllCall ( $_KERNEL32DLL, $RetType, $_MFHookApi, $Type1, $Param1, $Type2, $Param2, $Type3, $Param3, $Type4, $Param4, $Type5, $Param5 ) Case Else Local $DllCallStr = 'DllCall($_KERNEL32DLL, $RetType, $_MFHookApi', $n = 1 For $i = 4 To @NumParams Step 2 $DllCallStr &= ', $Type' & $n & ', $Param' & $n $n += 1 Next $DllCallStr &= ')' $Ret = Execute ( $DllCallStr ) EndSwitch Return SetError ( @Error, 0, $Ret ) EndFunc ;==> MemoryFuncCall() Func MemoryFuncInit() Local $KernelHandle = API_LoadLibrary ( 'kernel32.dll' ) API_FreeLibrary ( $KernelHandle ) Local $HookPtr = API_GetProcAddress ( $KernelHandle, $_MFHookApi ) Local $HookSize = 7 $_MFHookPtr = $HookPtr $_MFHookBak = DllStructCreate ( 'byte[' & $HookSize & ']' ) If Not API_VirtualProtect ( $_MFHookPtr, $HookSize, $PAGE_EXECUTE_READWRITE ) Then Return False DllStructSetData ( $_MFHookBak, 1, Peek ( 'byte[' & $HookSize & ']', $_MFHookPtr ) ) Poke ( 'byte', $_MFHookPtr, 0xB8 ) Poke ( 'word', $_MFHookPtr + 5, 0xE0FF ) Return True EndFunc ;==> MemoryFuncInit() Func Peek ( $Type, $Ptr ) If $Type = 'str' Then $Type = 'char[' & API_lstrlenA ( $Ptr ) & ']' ElseIf $Type = 'wstr' Then $Type = 'wchar[' & API_lstrlenW ( $Ptr ) & ']' EndIf Return DllStructGetData ( DllStructCreate ( $Type, $Ptr ), 1 ) EndFunc ;==> Peek() Func Poke ( $Type, $Ptr, $Value ) If $Type = 'str' Then $Type = 'char[' & ( StringLen ( $Value ) + 1 ) & ']' ElseIf $Type = 'wstr' Then $Type = 'wchar[' & ( StringLen ( $Value ) + 1 ) & ']' EndIf DllStructSetData ( DllStructCreate ( $Type, $Ptr ), 1, $Value ) EndFunc ;==> Poke() Func Transico ( $sFileName, $sOutputDirPath, $iOverWrite=0 ) ; Code Generated by BinaryToAu3Kompressor. Local $sFileBin = '0x9CB04800000100101818017020000088090000160000CC00280018009000300018015CFD010060006CFF031F001F001F001F00FF1F001F001F001F001F001F001F001F00FF1F001F001F001F001F001F001F001F00FF1F001F001F001F001F001F001F001F00FF1F000F000F000F000F000F000F000F00FF0F000F000F000F000F000F000F000F00830F000F000000FFFFFF3F001F3F003F003F003F003000' $sFileBin = Binary ( _LzntDecompress ( $sFileBin ) ) If Not FileExists ( $sOutputDirPath ) Then DirCreate ( $sOutputDirPath ) If StringRight ( $sOutputDirPath, 1 ) <> '\' Then $sOutputDirPath &= '\' Local $sFilePath = $sOutputDirPath & $sFileName If FileExists ( $sFilePath ) Then If $iOverWrite = 1 Then If Not Filedelete ( $sFilePath ) Then Return SetError ( 2, 0, $sFileBin ) Else Return SetError ( 0, 0, $sFileBin ) EndIf EndIf Local $hFile = FileOpen ( $sFilePath, 16+2 ) If $hFile = -1 Then Return SetError ( 3, 0, $sFileBin ) FileWrite ( $hFile, $sFileBin ) FileClose ( $hFile ) Return SetError ( 0, 0, $sFileBin ) EndFunc ;==> Transico()