#pragma once

#ifndef		NZ_API
#	define	NZ_API __declspec(dllexport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

#pragma region "NZ_SDK"

typedef enum
{
	NZ_MODEL_UNKNOWN = 0,
	NZ_MODEL_RHINO,
	NZ_MODEL_LEOPARD,
}NZ_MODEL;

typedef enum{ NZ_SESSION_TYPE_LIVE, NZ_SESSION_TYPE_PB }NZ_SESSION_TYPE;
NZ_API HANDLE __stdcall NZ_Create	( NZ_SESSION_TYPE session_type );
NZ_API HANDLE __stdcall NZ_CreateEx	( NZ_SESSION_TYPE session_type, NZ_MODEL model );
NZ_API void   __stdcall NZ_Delete	( HANDLE handle );

typedef enum{ NZ_STREAM_TYPE_VIDEO, NZ_STREAM_TYPE_AUDIO, NZ_STREAM_TYPE_EVENT, NZ_STREAM_TYPE_CAMERA_DISCONNECTED, NZ_STREAM_TYPE_SERVER_DISCONNECTED }NZ_STREAM_TYPE;
typedef enum{ NZ_CODEC_H264, NZ_CODEC_MPEG4, NZ_CODEC_JPEG, NZ_CODEC_YUV420P, NZ_CODEC_PCM, NZ_CODEC_G711A, NZ_CODEC_G711U, NZ_CODEC_G726 }NZ_CODEC;
typedef enum{ NZ_EVT_TYPE_RECORD, NZ_EVT_TYPE_ALARM, NZ_EVT_TYPE_MOTION, NZ_EVT_TYPE_VLOSS_H, NZ_EVT_TYPE_VLOSS_L, NZ_EVT_TYPE_TEXTIN, NZ_EVT_TYPE_DISK_TEMP, NZ_EVT_TYPE_SMART, NZ_EVT_TYPE_DISK_BAD, NZ_EVT_TYPE_TRIPWIRE }NZ_EVT_TYPE;
typedef enum{ NZ_STATUS_TYPE_CAMERA_CONNECTED, NZ_STATUS_TYPE_CAMERA_VIDEO_LOSS, NZ_STATUS_TYPE_SERVER_CONNECTED, NZ_STATUS_TYPE_SERVER_VIDEO_LOSS }NZ_STATUS_TYPE;

typedef struct
{
	NZ_CODEC						codec;
	DWORD64							stream;
	int								stream_length;
	BOOL							key_frame;
	DWORD							width;
	DWORD							height;
	BOOL							recording_status;
}NZ_STREAM_VIDEO;

typedef struct
{
	NZ_CODEC						codec;
	DWORD64							stream;
	int								stream_length;
	int								bitrate;
	int								sampling_rate;
	int								channels;
	int								bits_per_sample;
}NZ_STREAM_AUDIO;

typedef struct
{
	NZ_EVT_TYPE						type;
	BOOL							triggered;
	int								data_size;
	DWORD64							extra_data;
}NZ_STREAM_EVENT;

typedef struct
{
	NZ_STATUS_TYPE					type;
	BOOL							triggered;
	int								data_size;
	DWORD64							extra_data;
}NZ_STREAM_STATUS;

typedef struct
{
	NZ_STREAM_TYPE					type;
	int								channel;
	int								stream_no;
	SYSTEMTIME						time;
	DWORD							t;
	WORD							ms;
	union
	{
		NZ_STREAM_VIDEO				video;
		NZ_STREAM_AUDIO				audio;
		NZ_STREAM_EVENT				evt;
		NZ_STREAM_STATUS			status;
	}DATA;
}NZ_STREAM;

typedef struct  
{
	// Pan / Tilt ÁÂÇ¥ Á¤º¸ Áö¿øÀ¯¹«
	BOOL bSupportPanTiltPosition;
	// Zoom ÁÂÇ¥ Á¤º¸ Áö¿øÀ¯¹«
	BOOL bSupportZoomPosition;
	// Pan ÁÂÇ¥ ÃÖ¼Ò°ª
	double dMinPanPosition;
	// Pan ÁÂÇ¥ ÃÖ´ë°ª
	double dMaxPanPosition;
	// Tilt ÁÂÇ¥ ÃÖ¼Ò°ª
	double dMinTiltPosition;
	// tilt ÁÂÇ¥ ÃÖ´ë°ª
	double dMaxTiltPosition;
	// Zoom ÁÂÇ¥ ÃÖ¼Ò°ª
	double dMinZoomPosition;
	// Zoom ÁÂÇ¥ ÃÖ´ë°ª
	double dMaxZoomPosition;
}NZ_PTZ_POSITION_SPECIFICATION;

typedef struct  
{
	// ÃÖ´ë ¼Ò¼öÁ¡ 9ÀÚ¸® ½Ç¼ö
	double dPanPosition;
	// ÃÖ´ë ¼Ò¼öÁ¡ 9ÀÚ¸® ½Ç¼ö
	double dTiltPosition;
	// ÃÖ´ë ¼Ò¼öÁ¡ 9ÀÚ¸® ½Ç¼ö
	double dZoomPosition;
}NZ_PTZ_POSITION;

typedef struct 
{
	// ÆùÆ®¸í
	char szFontName[32];
	// ÆùÆ® ³ôÀÌ
	// (5~100, default:15)
	int nHeight;
}NZ_VIEW_FONT;

#define NZ_CMD_BASEA					0x00000000
#define NZ_CMD_BASEW					0x10000000

#define IS_UNICODE_COMMAND(x)			((x & NZ_CMD_BASEW) != 0)

#ifdef _UNICODE
#define NZ_CMD_BASE						NZ_CMD_BASEW
#else
#define NZ_CMD_BASE						NZ_CMD_BASEA
#endif

/*
	ÁÖ¼®¿¡ ´ëÇÑ Á¤º¸
	[NRS/Rhino] : NRS / Rhino SDK ·Î ÀÌ¿ëÇÒ ¶§ÀÇ Á¤º¸
	[VMS/NVR] : VMS / NVR SDK ·Î ÀÌ¿ëÇÒ ¶§ÀÇ Á¤º¸
*/
typedef enum
{
	NZ_CMD_UNKNOWN					= (NZ_CMD_BASE | 0x00000000),
	/*
	// ´ë»ó ¼­¹ö¿Í ¿¬°á
	// arg1: LPCSTR 
	//    addr
	// arg2: LPCSTR 
	//    port : (http=80&rtsp=554)
	// arg3: LPCSTR 
	//    id
	// arg4: LPCSTR 
	//    password
	// arg5: [NRS/Rhino] BOOL 
	//    bAsync
	//       TRUE : ºñµ¿±â·Î ¼­¹ö¿Í ¿¬°á »óÅÂ È®ÀÎ (¼­¹ö¿Í ¿¬°áÇÒ ¼ö ¾ø´Â »óÅÂÀÌ´õ¶óµµ TRUE °ªÀ» ¸®ÅÏ)
	//       FALSE : µ¿±â·Î ¼­¹ö¿Í ¿¬°á »óÅÂ È®ÀÎÇÏ¿© °á°ú¸¦ ³Ñ±è
	*/
	NZ_CMD_CONNECT					= (NZ_CMD_BASE | 0x00000001),
	NZ_CMD_DISCONNECT				= (NZ_CMD_BASE | 0x00000002),
	/*
	// arg1: BOOL 
	//	 use secure socket
	// arg2: BOOL 
	//	 use digest auth
	*/
	NZ_CMD_SET_SETTINGS				= (NZ_CMD_BASE | 0x00000003),
	/*
	// arg1 : LPCSTR
	//		setting name
	//		CAPTURE_AVSTREAM (Value : Boolean) : ºñµð¿À / ¿Àµð¿À ½ºÆ®¸² Ä¸ÃÄ À¯¹«
	//		DISPLAY_NORMAL_IMAGE (Value : FilePath) : ¿µ»ó Ãâ·Â Å¸ÀÏÀÇ ÀÏ¹Ý ¹è°æ ÀÌ¹ÌÁö
	//		DISPLAY_VIDEOLOSS_IMAGE (Value : FilePath) : ¿µ»ó Ãâ·Â Å¸ÀÏÀÇ ºñµð¿À ·Î½º ¹ß»ý ½Ã ¹è°æ ÀÌ¹ÌÁö
	// arg2 : LPCSTR
	//		setting value
	*/
	NZ_CMD_SET_SETTING_EX			= (NZ_CMD_BASE | 0x00000004),

	/*
	// ¶óÀÌºê ¿µ»ó ½ºÆ®¸² ½ÃÀÛ ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: BOOL 
	//    auto_play
	//       TRUE : target_window ¿¡ ´ëÇÏ¿© ¿µ»óÀ» µðÄÚµùÇÏ¿© Àç»ý ½ÃÀÛ
	//       FALSE : ¿µ»ó µðÄÚµù Àç»ýÇÏÁö ¾ÊÀ½
	// arg4: DWORD_PTR
	//	  pPlayParam (auto_play °ª¿¡ µû¸¥ Á¤º¸)
	//	  auto_play °¡ true ÀÏ¶§
	//		target_window : ¿µ»ó Ãâ·ÂÀ» À§ÇÑ ´ë»ó À©µµ¿ì ÇÚµé Á¤º¸
	//	  auto_play °¡ false ÀÏ¶§
	//		0 : µðÄÚµù
	//		1 : µðÄÚµùÇÏÁö ¾ÊÀ½
	// arg5: LPCSTR 
	//    lpstrPlayName
	//    NULL or Not
	//       ÇÏ³ªÀÇ SDK ÀÎ½ºÅÏ½º·Î µ¿ÀÏÇÑ ¿µ»ó ¼­¹öÀÇ Ã¤³Î¿¡ ´ëÇÏ¿© ½ºÆ®¸² ¿äÃ»À» ÇÏ´Â °æ¿ì ±¸ºÐÇÏ±â À§ÇÑ
	//       Å°°ª (³»ºÎÀûÀ¸·Î ÂüÁ¶ Ä«¿îÅÍ¸¦ ÀÌ¿ëÇÏ¿© ´õÀÌ»ó ¶óÀÌºê ¿µ»ó ½ºÆ®¸²À» ÀÌ¿ëÇÏÁö ¾Ê´Â °æ¿ì ½ºÆ®¸² Á¾·á)
	*/
	NZ_CMD_OPEN_VIDEO				= (NZ_CMD_BASE | 0x00010001),
	/*
	// ¶óÀÌºê ¿µ»ó ½ºÆ®¸² Á¾·á ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: LPCSTR
	//    lpstrPlayName : NULL or Not
	//    NULL or Not
	//       NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_CLOSE_VIDEO				= (NZ_CMD_BASE | 0x00010002),
	/*
	// [NRS] ¶óÀÌºê ¿µ»ó ½ºÆ®¸² ½ÃÀÛ ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	// arg2: LPCSTR
	//    lpstrStreamUrl
	// arg3: BOOL 
	//    auto_play
	//       TRUE : target_window ¿¡ ´ëÇÏ¿© ¿µ»óÀ» µðÄÚµùÇÏ¿© Àç»ý ½ÃÀÛ
	//       FALSE : ¿µ»ó µðÄÚµù Àç»ýÇÏÁö ¾ÊÀ½
	// arg4: DWORD_PTR
	//	  pPlayParam (auto_play °ª¿¡ µû¸¥ Á¤º¸)
	//	  auto_play °¡ true ÀÏ¶§
	//		target_window : ¿µ»ó Ãâ·ÂÀ» À§ÇÑ ´ë»ó À©µµ¿ì ÇÚµé Á¤º¸
	//	  auto_play °¡ false ÀÏ¶§
	//		0 : µðÄÚµù
	//		1 : µðÄÚµùÇÏÁö ¾ÊÀ½
	// arg5: LPCSTR 
	//    lpstrPlayName
	//    NULL or Not
	//       ÇÏ³ªÀÇ SDK ÀÎ½ºÅÏ½º·Î µ¿ÀÏÇÑ ¿µ»ó ¼­¹öÀÇ Ã¤³Î¿¡ ´ëÇÏ¿© ½ºÆ®¸² ¿äÃ»À» ÇÏ´Â °æ¿ì ±¸ºÐÇÏ±â À§ÇÑ
	//       Å°°ª (³»ºÎÀûÀ¸·Î ÂüÁ¶ Ä«¿îÅÍ¸¦ ÀÌ¿ëÇÏ¿© ´õÀÌ»ó ¶óÀÌºê ¿µ»ó ½ºÆ®¸²À» ÀÌ¿ëÇÏÁö ¾Ê´Â °æ¿ì ½ºÆ®¸² Á¾·á)
	*/
	NZ_CMD_OPEN_VIDEO_EX			= (NZ_CMD_BASE | 0x00010003),
	/*
	// ¿Àµð¿À ½ºÆ®¸² ½ÃÀÛ ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: BOOL
	//    auto_play
	//    TRUE : ÀÚµ¿ Àç»ý
	//    FALSE : Àç»ýÇÏÁö ¾ÊÀ½
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_OPEN_AUDIO				= (NZ_CMD_BASE | 0x00010011),
	/*
	// ¿Àµð¿À ½ºÆ®¸² Á¾·á ¿äÃ» 
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_CLOSE_AUDIO				= (NZ_CMD_BASE | 0x00010012),
	/*
	// ÀÌº¥Æ® ½ºÆ®¸² ¿äÃ»
	// arg1: LPCSTR 
	//    [NRS/Rhino] channel_list : 1,2,4,5,...
	//    [VMS/NVR] device_list : 1,2,3,...
	*/
	NZ_CMD_OPEN_EVENT				= (NZ_CMD_BASE | 0x00010021),
	NZ_CMD_CLOSE_EVENT				= (NZ_CMD_BASE | 0x00010022),
	/*
	// [NotImplemented]
	// ³ìÈ­ »óÅÂ Á¤º¸ ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: SYSTEMTIME*
	//    from
	// arg3: SYSTEMTIME*
	//    to
	*/
	NZ_CMD_GET_RECORDED_DATA		= (NZ_CMD_BASE | 0x00011001),
	/*
	// ½ºÆ®¸² µ¥ÀÌÅÍ °¡Á®¿À±â
	// NRS/Rhino ´Â ¶óÀÌºê ½ºÆ®¸²¸¸ ¿¬µ¿µÇ¾î ÀÖÀ½À¸·Î ¶óÀÌºê ½ºÆ®¸²¿¡ ´ëÇÑ µ¥ÀÌÅÍ¸¦ °¡Á®¿Ã ¼ö ÀÖÀ¸³ª,
	// VMS/NVR Àº °Ë»ö ½ºÆ®¸²µµ ¿¬µ¿µÇ¾î ÀÖÀ½À¸·Î ¼¼¼Ç Å¸ÀÔ(NZ_SESSION_TYPE)À¸·Î °¡Á®¿À°íÀÚ ÇÏ´Â ½ºÆ®¸² µ¥ÀÌÅÍ¸¦
	// ¼±ÅÃÇÑ´Ù.
	// °¡Á®¿Â ½ºÆ®¸² µ¥ÀÌÅÍ »ç¿ëÀÌ ³¡³ª¸é NZ_CMD_GET_STREAM À» ÀÌ¿ëÇÏ¿© ¸®¼Ò½º¸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.
	// arg1: 
	//    [NRS/Rhino] NZ_STREAM* 
	//    [VMS/NVR] int NrsID (ÀúÀå¼­¹öID) : > 0
	// arg2 : [VMS/NVR] NZ_SESSION_TYPE 
	//    session_type
	// arg3 : [VMS/NVR] NZ_STREAM* 
	//    stream
	*/
	NZ_CMD_GET_STREAM				= (NZ_CMD_BASE | 0x00012001),
	/*
	// ½ºÆ®¸² µ¥ÀÌÅÍ ¸®¼Ò½º ÇØÁ¦
	// arg1: NZ_STREAM* 
	//    stream
	*/
	NZ_CMD_RELEASE_STREAM			= (NZ_CMD_BASE | 0x00012002),

	/*
	// arg1: int
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int 
	//    speed  : 1 ~ 10
	// arg4: int 
	//    stop  : 0 or 1
	*/
	NZ_CMD_PTZ_MOVE_LEFT			= (NZ_CMD_BASE | 0x00020001),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_RIGHT			= (NZ_CMD_BASE | 0x00020002),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_UP				= (NZ_CMD_BASE | 0x00020003),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_DOWN			= (NZ_CMD_BASE | 0x00020004),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_LEFTUP			= (NZ_CMD_BASE | 0x00020005),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_LEFTDOWN		= (NZ_CMD_BASE | 0x00020006),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_RIGHTUP			= (NZ_CMD_BASE | 0x00020007),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_MOVE_RIGHTDOWN		= (NZ_CMD_BASE | 0x00020008),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_ZOOM_TELE			= (NZ_CMD_BASE | 0x00020011),
	/*
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_ZOOM_WIDE			= (NZ_CMD_BASE | 0x00020012),
	/*
	// [NotImplemented]
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_FOCUSIN				= (NZ_CMD_BASE | 0x00020013),
	/*
	// [NotImplemented]
	// NZ_CMD_PTZ_MOVE_LEFT Âü°í
	*/
	NZ_CMD_PTZ_FOCUSOUT				= (NZ_CMD_BASE | 0x00020014),
	/*
	// [NotImplemented]
	// ¼­¹ö¿¡ ÀúÀåµÈ Preset ¸ñ·Ï ¼ö ¿äÃ»
	// arg1: int
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int*
	//    list_count
	*/
	NZ_CMD_PTZ_PRESET_GetListCount	= (NZ_CMD_BASE | 0x00020021),
	/*
	// [NotImplemented]
	// ¼­¹ö¿¡ ÀúÀåµÈ Preset ¸ñ·Ï ¿äÃ»
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int 
	//    list_count
	// arg4: NZ_PRESET_LIST*
	//    list
	*/
	NZ_CMD_PTZ_PRESET_GetListData	= (NZ_CMD_BASE | 0x00020022),
	/*
	// ÇÁ¸®¼Â ¼³Á¤
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int 
	//    preset_no
	*/
	NZ_CMD_PTZ_PRESET_SET			= (NZ_CMD_BASE | 0x00020023),
	/*
	// ÇÁ¸®¼Â ÀÌµ¿
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int 
	//    preset_no
	*/
	NZ_CMD_PTZ_PRESET_MOVE			= (NZ_CMD_BASE | 0x00020024),
	/*
	// ¼­¹ö¿¡ ÀúÀåµÈ ÇÁ¸®¼Â ¼øÂ÷Åõ¾î ½ÃÀÛ
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//   stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	*/
	NZ_CMD_PTZ_TOUR_START			= (NZ_CMD_BASE | 0x00020031),
	/*
	// ¼­¹ö¿¡¼­ ÁøÇàÁßÀÎ ÇÁ¸®¼Â ¼øÂ÷Åõ¾î Á¾·á
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	*/
	NZ_CMD_PTZ_TOUR_STOP			= (NZ_CMD_BASE | 0x00020032),
	/*
	// [NRS/VMS/NVR] Ä«¸Þ¶ó Aux Á¦¾î
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: int 
	//    aux_number : 1 or 2
	// arg4: int
	//	onoff : 0 or 1
	//    0 : Off
	//    1 : On
	*/
	NZ_CMD_PTZ_AUX					= (NZ_CMD_BASE | 0x00020033),
	/*
	// [NRS/VMS/NVR] Ä«¸Þ¶ó PTZ Àý´ëÀ§Ä¡ Áö¿ø Á¤º¸ ¿äÃ»
	// arg1: int
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: NZ_PTZ_POSITION_SPECIFICATION*
	*/
	NZ_CMD_GET_PTZ_POSITION_SPECIFICATION	= (NZ_CMD_BASE | 0x00020034),

	/*
	// [NRS/VMS/NVR] Ä«¸Þ¶ó PTZ À§Ä¡ Á¤º¸ ¿äÃ»
	// arg1: int
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: NZ_PTZ_POSITION*
	*/
	NZ_CMD_GET_PTZ_POSITION			= (NZ_CMD_BASE | 0x00020035),
	/*
	// [NRS/VMS/NVR] Ä«¸Þ¶ó PTZ À§Ä¡·Î ÀÌµ¿
	// arg1: int
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare] int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	// arg3: NZ_PTZ_POSITION*
	*/
	NZ_CMD_SET_PTZ_POSITION			= (NZ_CMD_BASE | 0x00020036),
	/*
	// ¿Àµð¿À Ãâ·Â ½ÃÀÛ (Client -> Device)
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	//    stream_number : 1 or 2
	//    1 : High Resolution
	//    2 : Low Resolution
	*/
	NZ_CMD_START_TALK				= (NZ_CMD_BASE | 0x00030001),
	/*
	// ¿Àµð¿À Ãâ·Â Á¾·á (Client -> Device)
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	*/
	NZ_CMD_STOP_TALK				= (NZ_CMD_BASE | 0x00030002),
	/*
	// ¿Àµð¿À Ãâ·ÂÀ» À§ÇÑ ¿Àµð¿À Ä¸ÃÄ ½ÃÀÛ / Á¾·á (Client -> Device)
	// ¿Àµð¿À Ä¸ÃÄ µ¿ÀÛÀº ÁöÁ¤µÈ ¿Àµð¿À ÆÄÀÏ·ÎºÎÅÍ µ¥ÀÌÅÍ¸¦ ÀÐ¾îµéÀÌ´Â µ¿ÀÛÀÓ
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: LPCSTR 
	//    wav_path
	// arg4: BOOL 
	//    onoff : 0 or 1
	//    0 : Á¾·á
	//    1 : ½ÃÀÛ
	*/
	NZ_CMD_SEND_WAVE				= (NZ_CMD_BASE | 0x00030003),

	/*
	// ¿µ»ó Ãâ·ÂÀ» À§ÇÑ VIEW »çÀÌÁî°¡ º¯°æµÇ¾úÀ» ¶§ ¾÷µ¥ÀÌÆ®ÇÏ±â À§ÇÑ ¸í·É
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_RESIZE				= (NZ_CMD_BASE | 0x00040001),
	//NZ_CMD_VIEW_SET_SPLIT			= (NZ_CMD_BASE | 0x00040002),	// arg1: int channel (1~), arg2: int stream_number (1 or 2), arg3: LPCSTR split_name (#Fixed#_1x1, #Fixed#_2x2, #Fixed#_3x3, #Fixed#_4x4), arg4: LPCSTR lpstrPlayName
	/*
	// ¿µ»ó Ãâ·Â ¿µ¿ª¿¡ ¼±ÅÃ º¸´õ¸¦ º¸¿©ÁÙ Áö À¯¹« ¼³Á¤
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: BOOL 
	//    show : 0 or 1
	//    0 : Show
	//    1 : Hide
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_SELECTION		= (NZ_CMD_BASE | 0x00040003),
	/*
	// ¿µ»ó¿¡ ´ëÇÑ Á¸ ¿µ¿ªÀ» ¼³Á¤ÇÏ¿© ¿µ»ó Ãâ·Â ½Ã º¸¿©ÁØ´Ù
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: POINT* 
	//    pt : Polygon Æ÷ÀÎÆ® Array ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ
	// arg4: LPCSTR 
	// 	  detail : Å° °ª ±¸Á¶ÀÇ ¼¼ºÎÁ¤º¸ ¹®ÀÚ¿­ (±¸ºÐ¹®ÀÚ '&')
	//       ex) index=1&pt_count=4&image_width=1920&image_height=1080
	//       index : Á¸ ID, > 0
	//       pt_count : Æ÷ÀÎÆ® ¼ö
	//          °ªÀÌ 0 ÀÏ °æ¿ì Zone Á¤º¸¸¦ Reset
	//       image_width : Polygon ¿¡ ´ëÇÑ Canvas ÀÇ Width
	//       image_height : Polygon ¿¡ ´ëÇÑ Canvas ÀÇ Height
	// arg5: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_ZONE			= (NZ_CMD_BASE | 0x00040004),
	/*
	// ¿µ»ó¿¡ ´ëÇÑ »ç°¢Çü ¿µ¿ªÀ» ¼³Á¤ÇÏ¿© ¿µ»ó Ãâ·Â ½Ã º¸¿©ÁØ´Ù.
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: RECT*
	//    rc_detect : »ç°¢Çü ¿µ¿ª Á¤º¸
	// arg4: LPCSTR 
	//    detail : Å° °ª ±¸Á¶ÀÇ ¼¼ºÎÁ¤º¸ ¹®ÀÚ¿­ (±¸ºÐ¹®ÀÚ '&')
	//       ex) show=1&image_width=1920&image_height=1080
	//       show : º¸¿©ÁÙÁö ¿©ºÎ (0 or 1)
	//       image_width : »ç°¢Çü ¿µ¿ª¿¡ ´ëÇÑ Canvas ÀÇ Width
	//       image_height : »ç°¢Çü ¿µ¿ª¿¡ ´ëÇÑ Canvas ÀÇ Height
	// arg5: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_DETECT			= (NZ_CMD_BASE | 0x00040005),
	/*
	// ¿µ»ó Ãâ·Â ½Ã ÁöÁ¤µÈ ÀÌ¸§À» OSD ·Î Ãâ·ÂÇÑ´Ù.
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: LPCSTR
	//    name
	// arg4: int 
	//    size : ÆùÆ® »çÀÌÁî (5~100, default:15)
	// arg5: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_NAME			= (NZ_CMD_BASE | 0x00040006),
	/*
	// ¿µ»ó Ãâ·Â ½Ã ÁöÁ¤µÈ ¸¸Å­ È¸Àü½ÃÄÑ º¸¿©ÁØ´Ù.
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: int 
	//    degree
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_ROTATE				= (NZ_CMD_BASE | 0x00040007),
	/*
	// ¿µ»ó Ãâ·Â ½Ã ÁöÁ¤µÈ ÀÌ¸§À» OSD ·Î Ãâ·ÂÇÑ´Ù.
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: LPCSTR
	//    name
	// arg4: NZ_VIEW_FONT* 
	//    ÆùÆ® Á¤º¸
	// arg5: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_NAME_EX		= (NZ_CMD_BASE | 0x00040008),
	/*
	// ¿µ»ó Ãâ·Â ¿µ¿ª¿¡ ´ëÇÑ ¿Ü°û¼±À» º¸¿©ÁÙ Áö °áÁ¤ÇÑ´Ù.
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: BOOL 
	//    show : 0 or 1
	//    0 : Show
	//    1 : Hide
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_SHOW_BORDER			= (NZ_CMD_BASE | 0x00040009),
	/*
	// ¿µ»ó Ãâ·Â ¿µ¿ª¿¡ ´ëÇÑ DZoom ½ÇÇà ¿©ºÎ
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: int 
	// 	  stream_number : 1 or 2
	// 	  1 : High Resolution
	// 	  2 : Low Resolution
	// arg3: BOOL 
	//    enable : 0 or 1
	//    0 : Disable
	//    1 : Enable
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_VIEW_ENABLE_DZOOM		= (NZ_CMD_BASE | 0x0004000A),

	/*
	// [NRS/VMS/NVR] °Ë»ö ½ºÆ®¸² ½ÃÀÛ
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare]
	// arg3: BOOL 
	//    auto_play
	//       TRUE : target_window ¿¡ ´ëÇÏ¿© ¿µ»óÀ» µðÄÚµùÇÏ¿© Àç»ý ½ÃÀÛ
	//       FALSE : ¿µ»ó µðÄÚµù Àç»ýÇÏÁö ¾ÊÀ½
	// arg4: DWORD_PTR
	//	  pPlayParam (auto_play °ª¿¡ µû¸¥ Á¤º¸)
	//	  auto_play °¡ true ÀÏ¶§
	//		target_window : ¿µ»ó Ãâ·ÂÀ» À§ÇÑ ´ë»ó À©µµ¿ì ÇÚµé Á¤º¸
	//	  auto_play °¡ false ÀÏ¶§
	//		0 : µðÄÚµù
	//		1 : µðÄÚµùÇÏÁö ¾ÊÀ½
	// arg5: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_PB_OPEN_VIDEO			= (NZ_CMD_BASE | 0x00050001),
	/*
	// [NRS/VMS/NVR] °Ë»ö ½ºÆ®¸² Á¾·á
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare]
	// arg3: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_PB_CLOSE_VIDEO			= (NZ_CMD_BASE | 0x00050002),
	/*
	// [NRS/VMS/NVR] °Ë»ö ½ºÆ®¸² Àç»ý ½ÃÀÛ
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare]
	// arg3: LPCSTR 
	//    detail : Å° °ª ±¸Á¶ÀÇ ¼¼ºÎÁ¤º¸ ¹®ÀÚ¿­ (±¸ºÐ¹®ÀÚ '&')
	//       ex) refresh=0&speed=1&method=forward&date=2014-08-01&time=14-20-00
	//       refresh : Àü¼Û¹öÆÛ °»½Å À¯¹« (0 or 1)
	//       speed : Àç¼Û ¼Óµµ (0 ~ 9)
	//          0 : 1/2
	//          1 ~ 3 : ¸ðµç ÇÁ·¹ÀÓ Àç»ý
	//          4 ~ 9 : Å° ÇÁ·¹ÀÓ Àç»ý
	//       method : Àç»ý ¹æÇâ
	//          forward : Á¤¹æÇâ
	//          backward : ¿ª¹æÇâ
	//       date : °Ë»ö ½ÃÀÛ ³¯Â¥ (yyyy-MM-dd)
	//       time : °Ë»ö ½ÃÀÛ ½Ã°£ (hh-mm-ss)
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_PB_PLAY					= (NZ_CMD_BASE | 0x00050003),
	/*
	// [NRS/VMS/NVR] °Ë»ö ½ºÆ®¸² Àç»ý ÁßÁö
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare]
	// arg3: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_PB_PAUSE					= (NZ_CMD_BASE | 0x00050004),
	/*
	// [NotImplemented]
	// [NRS/VMS/NVR] °Ë»ö ½ºÆ®¸² Àç»ý ¼Óµµ ¼³Á¤
	// arg1: int 
	//    [NRS/Rhino] channel : > 0
	//       ÀúÀå¼­¹ö¿¡ ÇÒ´çµÈ Ã¤³Î Á¤º¸
	//    [VMS/NVR] DeviceID : > 0
	//       ÀåÄ¡¿¡ ´ëÇÑ ID Á¤º¸
	// arg2: [DontCare]
	// arg3: int 
	//    speed : Àç»ý ¼Óµµ
	//    NZ_CMD_PB_PLAY Âü°í
	// arg4: LPCSTR 
	//    lpstrPlayName : NULL or Not
	//    NZ_CMD_OPEN_VIDEO Âü°í
	*/
	NZ_CMD_PB_SPEED					= (NZ_CMD_BASE | 0x00050005),

	/*
	// ³ìÈ­µÈ ¿µ»óÀ» µ¿¿µ»ó ÆÄÀÏ·Î ÀúÀå
	// arg1: LPCTSTR 
	//    pstrOption : Xml Æ÷¸ËÀÇ ¹®ÀÚ¿­
	//    ³»¿ëÀº SDK ¹®¼­ Âü°í
	// arg2: LPEXPORTMSGHANDLER 
	//    hander : µ¿ÀÛ ¸Þ½ÃÁö Ã³¸®¸¦ À§ÇÑ ÇÚµé·¯
	// arg3: LONG_PTR 
	//    pHandlerParam : µ¿ÀÛ ¸Þ½ÃÁö ÇÚµé·¯¿¡ ´ëÇÑ »ç¿ëÀÚ ÆÄ¶ó¹ÌÅÍ
	*/
	NZ_CMD_EXPORT_VIDEO				= (NZ_CMD_BASE | 0x00060001),
	NZ_CMD_CANCEL_EXPORT_VIDEO		= (NZ_CMD_BASE | 0x00060002),
	/*
	// ³ìÈ­µÈ ¿µ»óÀ» ÀÌ¹ÌÁö ÆÄÀÏ·Î ÀúÀå
	// arg1: LPCTSTR 
	//    pstrOption : Xml Æ÷¸ËÀÇ ¹®ÀÚ¿­
	//    ³»¿ëÀº SDK ¹®¼­ Âü°í
	// arg2: LPEXPORTMSGHANDLER 
	//    hander : µ¿ÀÛ ¸Þ½ÃÁö Ã³¸®¸¦ À§ÇÑ ÇÚµé·¯
	// arg3: LONG_PTR 
	//    pHandlerParam : µ¿ÀÛ ¸Þ½ÃÁö ÇÚµé·¯¿¡ ´ëÇÑ »ç¿ëÀÚ ÆÄ¶ó¹ÌÅÍ
	*/
	NZ_CMD_EXPORT_IMAGE				= (NZ_CMD_BASE | 0x00060003),

	NZ_CMD_GET_DATAS				= (NZ_CMD_BASE | 0x00100001),	// arg1: NZ_VMS_DATA_TYPE, arg2: LPSTR* ppOutBuffer, arg3: int* pnOutSize
	NZ_CMD_GET_DATA					= (NZ_CMD_BASE | 0x00100002),	// arg1: NZ_VMS_DATA_TYPE, arg2: id, arg3: LPSTR* ppOutBuffer, arg4: int* pnOutSize
	NZ_CMD_ADD_DATA					= (NZ_CMD_BASE | 0x00100003),	// arg1: NZ_VMS_DATA_TYPE, arg2: LPCTSTR pData
	NZ_CMD_UPDATE_DATA				= (NZ_CMD_BASE | 0x00100004),	// arg1: NZ_VMS_DATA_TYPE, arg2: LPCTSTR pData
	NZ_CMD_DELETE_DATA				= (NZ_CMD_BASE | 0x00100005),	// arg1: NZ_VMS_DATA_TYPE, arg2: int nID
	NZ_CMD_SEARCH_USER_LOG			= (NZ_CMD_BASE | 0x00100006),	// arg1: LPCTSTR pstrOption, arg2: LPLOGSEARCHHANDLER hander, arg3: LONG_PTR pHandlerParam
	NZ_CMD_IS_EXTENDED_SYSTEM_LOG	= (NZ_CMD_BASE | 0x00100007),
	NZ_CMD_SEARCH_SYSTEM_LOG		= (NZ_CMD_BASE | 0x00100008),	// arg1: LPCTSTR pstrOption, arg2: LPLOGSEARCHHANDLER hander, arg3: LONG_PTR pHandlerParam

	NZ_CMD_GET_DATAS_EX				= (NZ_CMD_BASE | 0x00101001),	// arg1: LPCTSTR pstrName, arg2: LPSTR* ppOutBuffer, arg3: int* pnOutSize
	NZ_CMD_GET_DATA_EX				= (NZ_CMD_BASE | 0x00101002),	// arg1: LPCTSTR pstrName, arg2: id, arg3: LPSTR* ppOutBuffer, arg4: int* pnOutSize
	NZ_CMD_ADD_DATA_EX				= (NZ_CMD_BASE | 0x00101003),	// arg1: LPCTSTR pstrName, arg2: LPCTSTR pData
	NZ_CMD_UPDATE_DATA_EX			= (NZ_CMD_BASE | 0x00101004),	// arg1: LPCTSTR pstrName, arg2: LPCTSTR pData
	NZ_CMD_DELETE_DATA_EX			= (NZ_CMD_BASE | 0x00101005)	// arg1: LPCTSTR pstrName, arg2: int nID

} NZ_CMD;

NZ_API BOOL __stdcall NZ_Command	( HANDLE handle, NZ_CMD cmd, DWORD_PTR arg1, DWORD_PTR arg2, DWORD_PTR arg3, DWORD_PTR arg4, DWORD_PTR arg5 );

#pragma endregion "NZ_SDK"

#pragma region "NZ_VMS_SDK"


// Create Resource
NZ_API HANDLE __stdcall NZ_VMS_Create();

// Delete Resource
NZ_API void   __stdcall NZ_VMS_Delete(HANDLE handle);


// Error Codes
#define NZ_ERROR_OK					0

// ÀÎÀÚ Á¤º¸µîÀÌ À¯È¿ÇÏÁö ¾Ê´Â °æ¿ì
#define NZ_ERROR_INVALID			1
// ¿¬°á ½ÇÆÐÇÑ °æ¿ì / ¼­¹ö¿Í ¿¬°áµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì
#define NZ_ERROR_NOT_ONLINE			3
// ³»ºÎÀûÀ¸·Î ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì
#define NZ_ERROR_INTERNAL			4
// ÀÌ¹Ì µ¿ÀÛÁßÀÎ °æ¿ì
#define NZ_ERROR_ALREADY_RUNNING	5
// ¿©À¯ °ø°£ÀÌ ¾ø´Â °æ¿ì
#define NZ_ERROR_DISK_FULL			6
// ½Ã½ºÅÛ ¿¡·¯ È®ÀÎ (::GetLastError)
#define NZ_ERROR_SYSTEM_ERROR		7
// µ¥ÀÌÅÍ¸¦ Ã£Áö ¸øÇÑ °æ¿ì
#define NZ_ERROR_NOT_FOUND			8

// ÀÎÁõ ½ÇÆÐÇÑ °æ¿ì
#define NZ_ERROR_SERVER_AUTH		500
// ¼­¹ö·ÎºÎÅÍ ¹ÞÀº Á¤º¸°¡ À¯È¿ÇÏÁö ¾Ê´Â °æ¿ì
#define NZ_ERROR_SERVER_INVALID		501

#define NZ_ERROR_EXCEPTION			1000


// Get last error
NZ_API DWORD __stdcall NZ_VMS_GetLastError(HANDLE handle);

NZ_API void __stdcall NZ_VMS_ReleaseData(LPCSTR pBuffer);

typedef enum
{
	NZ_DATA_TYPE_UNKNOWN = 0,
	NZ_DATA_TYPE_CAMERA = 1,
	NZ_DATA_TYPE_NRS = 2,
	NZ_DATA_TYPE_RECORD_SCHEDULE = 3,
	NZ_DATA_TYPE_USER = 4,
	NZ_DATA_TYPE_CLIENT = 5,
	NZ_DATA_TYPE_FACILITY = 6
} NZ_VMS_DATA_TYPE;

typedef enum
{
	NZ_EXPORT_MESSAGE_STARTED = 0,		// param1 : camera id
	NZ_EXPORT_MESSAGE_FINISHED,			// param1 : camera id, param2 : 0 (Success) / 1 (Fail) / 2 (Cancel)
	NZ_EXPORT_MESSAGE_UPDATED,			// param1 : progress percent (total)
	NZ_EXPORT_MESSAGE_ENCRYPTING,		// param1 : filename
	NZ_EXPORT_MESSAGE_EACH_UPDATED		// param1 : camera id, param2 :progress percent
} NZ_EXPORT_MESSAGE;

typedef void (__stdcall *LPEXPORTMSGHANDLER)(NZ_EXPORT_MESSAGE eMessage, LONG_PTR pParam1, LONG_PTR pParam2, LONG_PTR pUserParam);

typedef enum
{
	NZ_LOG_SEARCH_MESSAGE_DATA = 0,		// param1 : LPCTSTR data, param2 : LPBOOL (IsCancel)
	NZ_LOG_SEARCH_MESSAGE_FINISHED		// param1 : 0 (No more data) / 1 (More Data)
} NZ_LOG_SEARCH_MESSAGE;

typedef void (__stdcall *LPLOGSEARCHHANDLER)(NZ_LOG_SEARCH_MESSAGE eMessage, LONG_PTR pParam1, LONG_PTR pParam2, LONG_PTR pUserParam);

NZ_API BOOL __stdcall NZ_VMS_Command( HANDLE handle, NZ_CMD cmd, DWORD_PTR arg1, DWORD_PTR arg2, DWORD_PTR arg3, DWORD_PTR arg4, DWORD_PTR arg5 );

#pragma endregion "NZ_VMS_SDK"

#ifdef __cplusplus
}
#endif
