//
// Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
//
// This code is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License version 2 only, as
// published by the Free Software Foundation.  Sun designates this
// particular file as subject to the "Classpath" exception as provided
// by Sun in the LICENSE file that accompanied this code.
//
// This code is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// version 2 for more details (a copy is included in the LICENSE file that
// accompanied this code).
//
// You should have received a copy of the GNU General Public License version
// 2 along with this work; if not, write to the Free Software Foundation,
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
//
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// have any questions.
//

#include "afxres.h"

// Need 2 defines so macro argument to XSTR will get expanded before quoting.
#define XSTR(x) STR(x)
#define STR(x)  #x

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION    J2SE_FVER
 PRODUCTVERSION J2SE_FVER
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 // FILEOS 0x4 is Win32, 0x40004 is Win32 NT only
 FILEOS 0x4L
 // FILETYPE should be 0x1 for .exe and 0x2 for .dll
 FILETYPE J2SE_FTYPE
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "000004b0"
        BEGIN
            VALUE "CompanyName",      XSTR(J2SE_COMPANY)       "\0"
            VALUE "FileDescription",  XSTR(J2SE_COMPONENT)     "\0"
            VALUE "FileVersion",      XSTR(J2SE_VER)           "\0"
            VALUE "Full Version",     XSTR(J2SE_BUILD_ID)      "\0"
	    VALUE "InternalName",     XSTR(J2SE_INTERNAL_NAME) "\0"
            VALUE "LegalCopyright",   XSTR(J2SE_COPYRIGHT)     "\0"
            VALUE "OriginalFilename", XSTR(J2SE_FNAME)         "\0"
            VALUE "ProductName",      XSTR(J2SE_NAME)          "\0"
            VALUE "ProductVersion",   XSTR(J2SE_VER)           "\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x0, 1200
    END
END
