// Detect It Easy: DiE-JS framework file
// Don't change anything unless you're sure about what you're doing

var File = MACH;
var X = MACH;


var MACH_getNumberOfSections = MACH.getNumberOfSections,
    MACH_getSectionNumber = MACH.getSectionNumber,
    MACH_getSectionFileSize = MACH.getSectionFileSize,
    MACH_getSectionFileOffset = MACH.getSectionFileOffset,
    MACH_isSectionNamePresent = MACH.isSectionNamePresent,
    MACH_numberOfSections = MACH_getNumberOfSections(),
    MACH_sectionNumbers = {},
    MACH_sectionFileSizes = [],
    MACH_sectionFileOffsets = [],
    MACH_sectionNameSearchResults = {};

/**
 * Get the cached number of sections.
 * @returns {Number}
 */
MACH.getNumberOfSections = function () {
    return MACH_numberOfSections;
}


/**
 * Get a section number and cache the result.
 * @returns {Number}
 */
MACH.getSectionNumber = function (sSectionName) {
    var sCacheKey = "$" + sSectionName;

    if (MACH_sectionNumbers[sCacheKey] === undefined) {
        MACH_sectionNumbers[sCacheKey] = MACH_getSectionNumber(sSectionName);
    }

    return MACH_sectionNumbers[sCacheKey];
}


/**
 * Get a section file size from the cache.
 * @returns {Number}
 */
MACH.getSectionFileSize = function (nNumber) {
    if (nNumber < 0 || nNumber >= MACH_numberOfSections) {
        return MACH_getSectionFileSize(nNumber);
    }

    if (MACH_sectionFileSizes[nNumber] === undefined) {
        MACH_sectionFileSizes[nNumber] = MACH_getSectionFileSize(nNumber);
    }

    return MACH_sectionFileSizes[nNumber];
}


/**
 * Get a section file offset from the cache.
 * @returns {Number}
 */
MACH.getSectionFileOffset = function (nNumber) {
    if (nNumber < 0 || nNumber >= MACH_numberOfSections) {
        return MACH_getSectionFileOffset(nNumber);
    }

    if (MACH_sectionFileOffsets[nNumber] === undefined) {
        MACH_sectionFileOffsets[nNumber] = MACH_getSectionFileOffset(nNumber);
    }

    return MACH_sectionFileOffsets[nNumber];
}


/**
 * Check if a section name is present and cache the result.
 * @returns {Boolean}
 */
MACH.isSectionNamePresent = function (sSectionName) {
    var sCacheKey = "$" + sSectionName;

    if (MACH_sectionNameSearchResults[sCacheKey] === undefined) {
        MACH_sectionNameSearchResults[sCacheKey] = MACH_isSectionNamePresent(sSectionName);
    }

    return MACH_sectionNameSearchResults[sCacheKey];
}


var MACH_isLibraryPresent = MACH.isLibraryPresent,
    MACH_librarySearchResults = {};

/**
 * Check if an imported library is present and cache the result.
 * @returns {Boolean}
 */
MACH.isLibraryPresent = function (sLibraryName) {
    var sCacheKey = "$" + sLibraryName;

    if (MACH_librarySearchResults[sCacheKey] === undefined) {
        MACH_librarySearchResults[sCacheKey] = MACH_isLibraryPresent(sLibraryName);
    }

    return MACH_librarySearchResults[sCacheKey];
}