;+#
;+# This Source Code Form is subject to the terms of the Mozilla Public
;+# License, v. 2.0. If a copy of the MPL was not distributed with this
;+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
;+#
;+# OK, this file is meant to support SUN, LINUX, AIX, OS/2 and WINDOWS
;+#   1. For all unix platforms, the string ";-"  means "remove this line"
;+#   2. For all unix platforms, the string " DATA " will be removed from any 
;+#     line on which it occurs.
;+#   3. Lines containing ";+" will have ";+" removed on SUN and LINUX.
;+#      On AIX, lines containing ";+" will be removed.
;+#   4. For all unix platforms, the string ";;" will thave the ";;" removed.
;+#   5. For all unix platforms, after the above processing has taken place,
;+#    all characters after the first ";" on the line will be removed.
;+#    And for AIX, the first ";" will also be removed.
;+#  This file is passed directly to windows. Since ';' is a comment, all UNIX
;+#   directives are hidden behind ";", ";+", and ";-"
;+NSPR_4.0 {
;+    global:
LIBRARY plds4 ;-
EXPORTS ;-
PL_ArenaAllocate;
PL_ArenaFinish;
PL_ArenaGrow;
PL_ArenaRelease;
PL_CompactArenaPool;
PL_CompareStrings;
PL_CompareValues;
PL_FinishArenaPool;
PL_FreeArenaPool;
PL_HashString;
PL_HashTableAdd;
PL_HashTableDestroy;
PL_HashTableDump;
PL_HashTableEnumerateEntries;
PL_HashTableLookup;
PL_HashTableRawAdd;
PL_HashTableRawLookup;
PL_HashTableRawRemove;
PL_HashTableRemove;
PL_InitArenaPool;
PL_NewHashTable;
libVersionPoint;
;+    local: *;
;+};
;+
;+NSPR_4.1 {
;+    global:
PL_HashTableLookupConst;
PL_HashTableRawLookupConst;
;+} NSPR_4.0;
;+
;+NSPR_4.8.5 {
;+    global:
PL_ClearArenaPool;
;+} NSPR_4.1;
;+NSPR_4.9.6 {
;+    global:
PL_SizeOfArenaPoolExcludingPool;
;+} NSPR_4.8.5;
