Commits

Lenard Lindstrom  committed fef6e4b

NSIS Windows installer script

  • Participants
  • Parent commits 27fb74d

Comments (0)

Files changed (4)

File AdvUninstLog.nsh

+;_____________________________ HEADER FILE BEGIN ____________________________
+
+# Advanced Uninstall Log NSIS header
+# Version 1.0 2007-01-31
+# By Red Wine (http://nsis.sf.net/User:Red_Wine)
+# Modified by Tobbe
+
+# Usage: See included examples Uninstall_Log_Default_UI.nsi - Uninstall_Log_Modern_UI.nsi
+
+!verbose push
+!verbose 3
+
+!ifndef ADVANCED_UNINSTALL.LOG_NSH
+	!define ADVANCED_UNINSTALL.LOG_NSH
+
+	!ifndef INSTDIR_REG_ROOT | INSTDIR_REG_KEY
+		!error "You must properly define both INSTDIR_REG_ROOT and INSTDIR_REG_KEY"
+	!endif
+
+	!ifndef UNINSTALL_LOG
+		!define UNINSTALL_LOG "Uninstall"
+	!endif
+
+	!ifndef UNINST_LOG_VERBOSE
+		!define UNINST_LOG_VERBOSE "3"
+	!endif
+
+	!verbose pop
+
+	!echo "Advanced Uninstall Log NSIS header v1.0 2007-01-31 by Red Wine (http://nsis.sf.net/User:Red_Wine)"
+
+	!verbose push
+	!verbose ${UNINST_LOG_VERBOSE}
+
+	var unlog_header
+	var unlog_dat_not_found
+	var unlog_del_file
+	var unlog_del_dir
+	var unlog_empty_dir
+	var unlog_error_log
+	var unlog_error_create
+
+	!define UNINST_EXE "$INSTDIR\${UNINSTALL_LOG}.exe"
+	!define UNINST_DAT "$INSTDIR\${UNINSTALL_LOG}.dat"
+	!define UNLOG_PART "$PLUGINSDIR\part."
+	!define UNLOG_TEMP "$PLUGINSDIR\unlog.tmp"
+	!define EXCLU_LIST "$PLUGINSDIR\exclude.tmp"
+	!define UNLOG_HEAD "$unlog_header"
+
+	var unlog_tmp_0
+	var unlog_tmp_1
+	var unlog_tmp_2
+	var unlog_tmp_3
+	var unlog_error
+
+	!include FileFunc.nsh
+	!include TextFunc.nsh
+	
+	!insertmacro Locate
+	!insertmacro un.Locate
+	!insertmacro DirState
+	!insertmacro un.DirState
+	!insertmacro FileJoin
+	!insertmacro TrimNewLines
+	!insertmacro un.TrimNewLines
+	
+	;.............................. Uninstaller Macros ..............................
+	
+	!macro UNINSTALL.LOG_BEGIN_UNINSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		IfFileExists "${UNINST_DAT}" +3
+		MessageBox MB_ICONSTOP|MB_OK $unlog_dat_not_found /SD IDOK
+		Quit
+	
+		StrCmp "$PLUGINSDIR" "" 0 +2
+		InitPluginsDir
+	
+		CopyFiles "${UNINST_DAT}" "${UNLOG_TEMP}"
+		FileOpen $unlog_tmp_2 "${UNLOG_TEMP}" r
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNINSTALL.LOG_END_UNINSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		FileClose $unlog_tmp_2
+		DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat"
+		DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory"
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNINSTALL.LOG_UNINSTALL TargetDir
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		!ifndef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL
+			!error "You must insert either Interactive or Unattended Uninstall neither both, neither none."
+		!endif
+	
+		!ifdef INTERACTIVE_UNINSTALL
+			GetTempFileName $unlog_tmp_5 "$PLUGINSDIR"
+			FileOpen $unlog_tmp_4 "$unlog_tmp_5" a
+		!endif
+	
+		${PerfomUninstall} "${TargetDir}" "${UnLog_Uninstall_CallBackFunc}"
+	
+		!ifdef INTERACTIVE_UNINSTALL
+			FileClose $unlog_tmp_4
+		!endif
+	
+		!verbose pop
+	!macroend
+	
+	!define PerfomUninstall "!insertmacro PERFORMUNINSTALL"
+	
+	!macro PERFORMUNINSTALL TargetDir UninstCallBackFunc
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		!define ID ${__LINE__}
+	
+		${un.Locate} "${TargetDir}" "/L=F" "${UninstCallBackFunc}"
+	
+		loop_${ID}:
+	
+		StrCpy $unlog_tmp_1 0
+	
+		${un.Locate} "${TargetDir}" "/L=DE" "${UninstCallBackFunc}"
+		StrCmp $unlog_tmp_1 "0" 0 loop_${ID}
+	
+		${un.DirState} "${TargetDir}" $unlog_tmp_0
+		StrCmp "$unlog_tmp_0" "0" 0 +2
+		RmDir "${TargetDir}"
+	
+		IfErrors 0 +2
+		MessageBox MB_ICONEXCLAMATION|MB_OK "$unlog_error_log" /SD IDOK
+	
+		!undef ID
+	
+		!verbose pop
+	!macroend
+	
+	!macro INTERACTIVE_UNINSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		!ifdef INTERACTIVE_UNINSTALL
+			!error "INTERACTIVE_UNINSTALL is already defined"
+		!endif
+	
+		var unlog_tmp_4
+		var unlog_tmp_5
+	
+		!define INTERACTIVE_UNINSTALL
+	
+		!ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL
+			!error "You must insert either Interactive or Unattended Uninstall neither both, neither none."
+		!endif
+	
+		!ifdef UnLog_Uninstall_CallBackFunc
+			!undef UnLog_Uninstall_CallBackFunc
+		!endif
+	
+		!ifndef UnLog_Uninstall_CallBackFunc
+			!insertmacro UNINSTALL.LOG_UNINSTALL_INTERACTIVE
+			!define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Interactive"
+		!endif
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNATTENDED_UNINSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		!ifdef UNATTENDED_UNINSTALL
+			!error "UNATTENDED_UNINSTALL is already defined"
+		!endif
+	
+		!define UNATTENDED_UNINSTALL
+	
+		!ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL
+			!error "You must insert either Interactive or Unattended Uninstall neither both, neither none."
+		!endif
+	
+		!ifdef UnLog_Uninstall_CallBackFunc
+			!undef UnLog_Uninstall_CallBackFunc
+		!endif
+	
+		!ifndef UnLog_Uninstall_CallBackFunc
+			!insertmacro UNINSTALL.LOG_UNINSTALL_UNATTENDED
+			!define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Unattended"
+		!endif
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNINSTALL.LOG_UNINSTALL_UNATTENDED
+		Function un._LocateCallBack_Function_Unattended
+			start:
+				FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN}
+				${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3"
+				StrCmp "$unlog_tmp_3" "$R9" islog
+				IfErrors nolog
+				goto start
+		
+			islog:
+				IfFileExists "$R9\*.*" isdir
+		
+			isfile:
+				Delete "$R9"
+				goto end
+		
+		    isdir:
+				RmDir "$R9"
+				IntOp $unlog_tmp_1 $unlog_tmp_1 + 1
+				goto end
+		
+			nolog:
+				ClearErrors
+				StrCmp "$R9" "${UNINST_EXE}" isfile
+				StrCmp "$R9" "${UNINST_DAT}" isfile
+		
+			end:
+			FileSeek $unlog_tmp_2 0 SET
+			Push $unlog_tmp_0
+		FunctionEnd
+	!macroend
+	
+	!macro UNINSTALL.LOG_UNINSTALL_INTERACTIVE
+		Function un._LocateCallBack_Function_Interactive
+			start:
+				FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN}
+				${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3"
+				StrCmp "$unlog_tmp_3" "$R9" islog
+				IfErrors nolog
+				goto start
+	
+			islog:
+				IfFileExists "$R9\*.*" isdir
+	
+			isfile:
+				Delete "$R9"
+				goto end
+	
+			isdir:
+				RmDir "$R9"
+				IntOp $unlog_tmp_1 $unlog_tmp_1 + 1
+				goto end
+	
+			nolog:
+				ClearErrors
+				FileSeek $unlog_tmp_4 0 SET
+			read:
+				FileRead $unlog_tmp_4 "$unlog_tmp_3"
+				${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3"
+				StrCmp "$unlog_tmp_3" "$R9" end
+				IfErrors +2
+				goto read
+				ClearErrors 
+				StrCmp "$R9" "${UNINST_EXE}" isfile
+				StrCmp "$R9" "${UNINST_DAT}" isfile
+				IfFileExists "$R9\*.*" msgdir
+	
+				MessageBox MB_ICONQUESTION|MB_YESNO "$unlog_del_file" /SD IDNO IDYES isfile IDNO nodel
+				msgdir:
+					MessageBox MB_ICONQUESTION|MB_YESNO "$unlog_del_dir" /SD IDNO IDYES isdir IDNO nodel
+	
+			nodel:
+				FileSeek $unlog_tmp_4 0 END
+				FileWrite $unlog_tmp_4 "$R9$\r$\n"
+	
+			end:
+			FileSeek $unlog_tmp_2 0 SET
+			Push $unlog_tmp_0
+		FunctionEnd
+	!macroend
+	
+	;................................. Installer Macros .................................
+	
+	!macro UNINSTALL.LOG_INSTALL_UNATTENDED
+		Function _LocateCallBack_Function_Install
+			loop:
+				FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN}
+				${TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3"
+				IfErrors 0 +4
+				ClearErrors
+				FileSeek $unlog_tmp_2 0 SET
+				goto next
+				StrCmp "$R9" "$unlog_tmp_3" end
+				goto loop
+			next:
+				FileWrite $unlog_tmp_1 "$R9$\r$\n"
+			end:
+			Push $unlog_tmp_0
+		FunctionEnd
+	!macroend
+	
+	!ifdef UnLog_Install_Func_CallBack
+		!undef UnLog_Install_Func_CallBack
+	!endif
+	
+	!ifndef UnLog_Install_Func_CallBack
+		!insertmacro UNINSTALL.LOG_INSTALL_UNATTENDED
+		!define UnLog_Install_Func_CallBack "_LocateCallBack_Function_Install"
+	!endif
+	
+	!macro UNINSTALL.LOG_PREPARE_INSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		Push $0
+		Push $1
+		ClearErrors
+		ReadRegStr "$0"  ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory"
+		IfErrors next
+		${DirState} "$0" $1
+		StrCmp "$1" "-1" next
+		StrCmp "$1" "0" next
+		IfFileExists "$0\${UNINSTALL_LOG}.dat" next
+		MessageBox MB_ICONEXCLAMATION|MB_OK "$unlog_empty_dir" /SD IDOK
+		StrCpy $unlog_error "error"
+	
+		next:
+		ClearErrors
+		StrCmp "$PLUGINSDIR" "" 0 +2
+			InitPluginsDir
+
+		StrCpy $unlog_header "=========== Uninstaller Log please do not edit this file ==========="
+		StrCpy $unlog_dat_not_found "${UNINST_DAT} not found, unable to perform uninstall."
+		StrCpy $unlog_del_file 'Delete File "$R9"?'
+		StrCpy $unlog_del_dir 'Delete Directory "$R9"?'
+		StrCpy $unlog_empty_dir "Previous installation detected at $0.$\nRequired file ${UNINSTALL_LOG}.dat is missing.$\n$\nIt is highly recommended to select an empty directory and perform a fresh installation."
+		StrCpy $unlog_error_log "Error in log ${UNINSTALL_LOG}."
+		StrCpy $unlog_error_create "Error creating ${UNINSTALL_LOG}."
+
+		!ifdef UNINSTALLOG_LOCALIZE ; Needed to get rid of compiler warnings when not doing any localization
+			StrCmp $(UNLOG_HEADER) "" +2 0
+				StrCpy $unlog_header $(UNLOG_HEADER)
+			StrCmp $(UNLOG_DAT_NOT_FOUND) "" +2 0
+				StrCpy $unlog_dat_not_found $(UNLOG_DAT_NOT_FOUND)
+			StrCmp $(UNLOG_DEL_FILE) "" +2 0
+				StrCpy $unlog_del_file $(UNLOG_DEL_FILE)
+			StrCmp $(UNLOG_DEL_DIR) "" +2 0
+				StrCpy $unlog_del_dir $(UNLOG_DEL_DIR)
+			StrCmp $(UNLOG_EMPTY_DIR) "" +2 0
+				StrCpy $unlog_empty_dir $(UNLOG_EMPTY_DIR)
+			StrCmp $(UNLOG_ERROR_LOG) "" +2 0
+				StrCpy $unlog_error_log $(UNLOG_ERROR_LOG)
+			StrCmp $(UNLOG_ERROR_CREATE) "" +2 0
+				StrCpy $unlog_error_create $(UNLOG_ERROR_CREATE)
+		!endif
+
+		GetTempFileName "$1"
+		FileOpen $0 "$1" w
+		FileWrite $0 "${UNLOG_HEAD}$\r$\n"
+		FileClose $0
+		Rename "$1" "${UNLOG_TEMP}"
+		Pop $1
+		Pop $0
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNINSTALL.LOG_UPDATE_INSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		Delete "${UNINST_DAT}"
+		Rename "${UNLOG_TEMP}" "${UNINST_DAT}"
+		WriteUninstaller "${UNINST_EXE}"
+		WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" "${UNINST_DAT}"
+		WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" "$INSTDIR"
+	
+		!verbose pop
+	!macroend
+	
+	!define uninstall.log_install "!insertmacro UNINSTALL.LOG_INSTALL"
+	
+	!macro UNINSTALL.LOG_INSTALL FileOpenWrite FileOpenRead TargetDir
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		FileOpen $unlog_tmp_1 "${FileOpenWrite}" w
+		FileOpen $unlog_tmp_2 "${FileOpenRead}" r
+	
+		${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}"
+	
+		StrCmp $unlog_error "error" 0 +2
+		ClearErrors
+	
+		IfErrors 0 +2
+		MessageBox MB_ICONEXCLAMATION|MB_OK "$unlog_error_create" /SD IDOK
+	
+		FileClose $unlog_tmp_1
+		FileClose $unlog_tmp_2
+	
+		!verbose pop
+	!macroend
+	
+	!define uninstall.log_mergeID "!insertmacro UNINSTALL.LOG_MERGE"
+	
+	!macro UNINSTALL.LOG_MERGE UnlogPart
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		${FileJoin} "${UNLOG_TEMP}" "${UnlogPart}" "${UNLOG_TEMP}"
+	
+		!verbose pop
+	!macroend
+	
+	!macro UNINSTALL.LOG_OPEN_INSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		StrCmp $unlog_error "error" +2
+		${uninstall.log_install} "${EXCLU_LIST}" "${UNINST_DAT}" "$OUTDIR"
+	
+		!verbose pop
+	!macroend
+	
+	
+	!macro UNINSTALL.LOG_CLOSE_INSTALL
+		!verbose push
+		!verbose ${UNINST_LOG_VERBOSE}
+	
+		!define ID ${__LINE__}
+	
+		${uninstall.log_install} "${UNLOG_PART}${ID}" "${EXCLU_LIST}" "$OUTDIR"
+		${uninstall.log_mergeID} "${UNLOG_PART}${ID}"
+	
+		!undef ID ${__LINE__}
+	
+		!verbose pop
+	!macroend
+!endif
+
+!verbose pop
+;_____________________________ HEADER FILE END ____________________________
+

File pygame-docs.nsh

+#  Header for the Pygame Documents and Examples installer script.
+
+!define APP_VERSION "1.8"
+
+!define SOURCE_DIRECTORY "."

File pygame-docs.nsi

+#  NSIS Install script for Pygame Documents and Examples.
+#  NSIS (Nullsoft Scriptable Install System) can be downloaded at
+#  <http://nsis.sourceforge.net/Main_Page>.
+#  Information is take from header pygame-docs.nsh, which
+#  contains the constants APP_VERSION, SOURCE_DIRECTORY.
+
+!include "MUI2.nsh"
+
+!include "pygame-docs.nsh"
+
+!define APP_NAME "Pygame ${APP_VERSION} Documents and Examples"
+!define SHORT_APP_NAME "pygame-${APP_VERSION}-docs"
+!define INSTDIR_REG_ROOT "HKLM"
+!define INSTDIR_REG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${SHORT_APP_NAME}"
+
+!include "AdvUninstLog.nsh"
+
+Name "${APP_NAME}"
+OutFile "${SHORT_APP_NAME}-setup.exe"
+InstallDir "$PROGRAMFILES\${APP_NAME}"
+ShowInstDetails show
+ShowUninstDetails show
+InstallDirRegKey ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "InstallDir"
+
+Var StartMenuFolder
+Var InstalledSomething
+
+;!insertmacro UNATTENDED_UNINSTALL
+!insertmacro INTERACTIVE_UNINSTALL
+
+!define MUI_WELCOMEPAGE_TITLE "${APP_NAME}"
+!define MUI_WELCOMEPAGE_TEXT \
+    "This will install the Pygame ${APP_VERSION} HTML documents and tutorials and the example programs."
+!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome.bmp"
+!insertmacro MUI_PAGE_WELCOME
+!define MUI_COMPONENTSPAGE_NODESC
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_STARTMENU "ProgramFolder" $StartMenuFolder
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+!insertmacro MUI_LANGUAGE "English"
+
+Section "HTML Documents and Tutorials"
+    SetOutPath '$INSTDIR'
+ 
+    !insertmacro UNINSTALL.LOG_OPEN_INSTALL
+
+    File /r /x .svn /x *.*~ "${SOURCE_DIRECTORY}\docs"
+ 
+    !insertmacro UNINSTALL.LOG_CLOSE_INSTALL
+
+    StrCpy $InstalledSomething 'true'
+SectionEnd
+
+Section "Example Programs"
+    SetOutPath '$INSTDIR'
+ 
+    !insertmacro UNINSTALL.LOG_OPEN_INSTALL
+
+    File /r /x .svn /x *.*~ /x *.pyc "${SOURCE_DIRECTORY}\examples"
+
+    !insertmacro UNINSTALL.LOG_CLOSE_INSTALL
+
+    StrCpy $InstalledSomething 'true'
+SectionEnd
+
+Function .onInit
+    !insertmacro UNINSTALL.LOG_PREPARE_INSTALL
+FunctionEnd
+
+Function .onInstSuccess
+    Push $0
+    Push $1
+
+    StrCmp $InstalledSomething 'true' +1 InstallationEnd
+        !insertmacro MUI_STARTMENU_WRITE_BEGIN ProgramFolder
+
+            StrCpy $1 "$SMPROGRAMS\$StartMenuFolder"
+            WriteRegStr ${INSTDIR_REG_ROOT} ${INSTDIR_REG_KEY} 'StartMenuPath' "$1"
+            CreateDirectory "$1"
+            StrCpy $0 "$INSTDIR\docs\index.html"
+            IfFileExists "$0" +1 +2
+                CreateShortcut "$1\Documents.lnk" "$0"
+            StrCpy $0 "$INSTDIR\examples"
+            IfFileExists "$0" +1 +2
+                CreateShortCut "$1\Examples.lnk" "$0"
+            CreateShortCut "$1\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+  
+        !insertmacro MUI_STARTMENU_WRITE_END
+
+        WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "InstallDir" "$INSTDIR"
+        WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "DisplayName" "${APP_NAME}"
+        WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "UninstallString" "${UNINST_EXE}"
+    InstallationEnd:
+
+    !insertmacro UNINSTALL.LOG_UPDATE_INSTALL
+
+    Pop $1
+    Pop $0
+FunctionEnd
+
+Section UnInstall
+    push $0
+
+    !insertmacro UNINSTALL.LOG_UNINSTALL "$INSTDIR"
+    !insertmacro UNINSTALL.LOG_UNINSTALL "$APPDATA\${APP_NAME}"
+    !insertmacro UNINSTALL.LOG_END_UNINSTALL
+
+    ReadRegStr $0 ${INSTDIR_REG_ROOT} ${INSTDIR_REG_KEY} 'StartMenuPath'
+    IfErrors StartMenuEnd
+        Delete "$0\Documents.lnk"
+        Delete "$0\Examples.lnk"
+        Delete "$0\Uninstall.lnk"
+        RMDir "$0"
+        DeleteRegValue ${INSTDIR_REG_ROOT} ${INSTDIR_REG_KEY} 'StartMenuPath'
+    StartMenuEnd:
+    ClearErrors
+    DeleteRegKey /ifempty ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}"
+
+    pop $0
+SectionEnd
+
+Function UN.onInit
+    !insertmacro UNINSTALL.LOG_BEGIN_UNINSTALL
+    StrCpy $InstalledSomething 'false'
+FunctionEnd

File welcome.bmp

Added
New image