Merge branch 'master' into asuppercamelcase
diff --git a/docs/api.md b/docs/api.md
index a01b505..06d0d29 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -55,12 +55,12 @@
 <dt><a href="#module_DB API_ device type database access">DB API: device type database access</a></dt>
 <dd><p>This module provides queries for device types.</p>
 </dd>
-<dt><a href="#module_DB API_ endpoint type queries against the database.">DB API: endpoint type queries against the database.</a></dt>
-<dd><p>This module provides queries for endpoint type.</p>
-</dd>
 <dt><a href="#module_DB API_ endpoint configuration queries against the database.">DB API: endpoint configuration queries against the database.</a></dt>
 <dd><p>This module provides queries for endpoint configuration.</p>
 </dd>
+<dt><a href="#module_DB API_ endpoint type queries against the database.">DB API: endpoint type queries against the database.</a></dt>
+<dd><p>This module provides queries for endpoint type.</p>
+</dd>
 <dt><a href="#module_DB API_ zcl database enum access">DB API: zcl database enum access</a></dt>
 <dd><p>This module provides queries for enums.</p>
 </dd>
@@ -79,11 +79,14 @@
 <dt><a href="#module_DB API_ zcl database number access">DB API: zcl database number access</a></dt>
 <dd><p>This module provides queries for numbers.</p>
 </dd>
+<dt><a href="#module_DB API_ package-based queries.">DB API: package-based queries.</a></dt>
+<dd><p>This module provides queries related to packages.</p>
+</dd>
 <dt><a href="#module_DB API_ session related queries.">DB API: session related queries.</a></dt>
 <dd><p>This module provides package notification related queries.</p>
 </dd>
-<dt><a href="#module_DB API_ package-based queries.">DB API: package-based queries.</a></dt>
-<dd><p>This module provides queries related to packages.</p>
+<dt><a href="#module_DB API_ session related queries.">DB API: session related queries.</a></dt>
+<dd><p>This module provides session related queries.</p>
 </dd>
 <dt><a href="#module_DB API_ session related queries.">DB API: session related queries.</a></dt>
 <dd><p>This module provides session notification related queries.</p>
@@ -93,9 +96,6 @@
 inside a single session. Things like:
    all visible clusters, etc.</p>
 </dd>
-<dt><a href="#module_DB API_ session related queries.">DB API: session related queries.</a></dt>
-<dd><p>This module provides session related queries.</p>
-</dd>
 <dt><a href="#module_DB API_ zcl database strings access">DB API: zcl database strings access</a></dt>
 <dd><p>This module provides queries for strings.</p>
 </dd>
@@ -176,12 +176,12 @@
 <dd><p>This module provides the functionality that reads a .isc file</p>
 </dd>
 <dt><a href="#module_Import API_ Imports data from a file.">Import API: Imports data from a file.</a></dt>
-<dd><p>This module provides the functionality that reads a .json(.zap) file</p>
-</dd>
-<dt><a href="#module_Import API_ Imports data from a file.">Import API: Imports data from a file.</a></dt>
 <dd><p>This file provides the functionality that reads the ZAP data from a JSON file
 and imports it into a database.</p>
 </dd>
+<dt><a href="#module_Import API_ Imports data from a file.">Import API: Imports data from a file.</a></dt>
+<dd><p>This module provides the functionality that reads a .json(.zap) file</p>
+</dd>
 <dt><a href="#module_Timer API_ initializes times.">Timer API: initializes times.</a></dt>
 <dd><p>This module provides the APIs for initializing timers specifically
 for sessions.</p>
@@ -275,10 +275,10 @@
 <dd><p>External helper utilities for ZAP</p>
 </dd>
 <dt><a href="#module_External API_ External API utilities">External API: External API utilities</a></dt>
-<dd><p>External Registry utilities for ZAP</p>
+<dd><p>External helper utilities for ZAP</p>
 </dd>
 <dt><a href="#module_External API_ External API utilities">External API: External API utilities</a></dt>
-<dd><p>External helper utilities for ZAP</p>
+<dd><p>External Registry utilities for ZAP</p>
 </dd>
 <dt><a href="#module_JS API_ Iterator utilities">JS API: Iterator utilities</a></dt>
 <dd><p>This module provides API to access various iterator utilities that can then
@@ -327,14 +327,14 @@
 <dd><p>This module provides the APIs for dotdot Loading</p>
 </dd>
 <dt><a href="#module_Loader API_ Loader APIs">Loader API: Loader APIs</a></dt>
+<dd><p>This module provides the APIs for for common functionality related to loading.</p>
+</dd>
+<dt><a href="#module_Loader API_ Loader APIs">Loader API: Loader APIs</a></dt>
 <dd><p>This module provides the APIs for new data model loading</p>
 </dd>
 <dt><a href="#module_Loader API_ Loader APIs">Loader API: Loader APIs</a></dt>
 <dd><p>This module provides the APIs for ZCL/Data-Model loading.</p>
 </dd>
-<dt><a href="#module_Loader API_ Loader APIs">Loader API: Loader APIs</a></dt>
-<dd><p>This module provides the APIs for for common functionality related to loading.</p>
-</dd>
 </dl>
 
 <a name="module_DB API_ External URLs."></a>
@@ -3728,16 +3728,16 @@
 | endpointTypeId | <code>\*</code> | 
 | clusterId | <code>\*</code> | 
 
-<a name="module_DB API_ endpoint type queries against the database."></a>
-
-## DB API: endpoint type queries against the database.
-This module provides queries for endpoint type.
-
 <a name="module_DB API_ endpoint configuration queries against the database."></a>
 
 ## DB API: endpoint configuration queries against the database.
 This module provides queries for endpoint configuration.
 
+<a name="module_DB API_ endpoint type queries against the database."></a>
+
+## DB API: endpoint type queries against the database.
+This module provides queries for endpoint type.
+
 <a name="module_DB API_ zcl database enum access"></a>
 
 ## DB API: zcl database enum access
@@ -4776,15 +4776,20 @@
 | db | 
 | packageId | 
 
+<a name="module_DB API_ package-based queries."></a>
+
+## DB API: package-based queries.
+This module provides queries related to packages.
+
 <a name="module_DB API_ session related queries."></a>
 
 ## DB API: session related queries.
 This module provides package notification related queries.
 
-<a name="module_DB API_ package-based queries."></a>
+<a name="module_DB API_ session related queries."></a>
 
-## DB API: package-based queries.
-This module provides queries related to packages.
+## DB API: session related queries.
+This module provides session related queries.
 
 <a name="module_DB API_ session related queries."></a>
 
@@ -5638,11 +5643,6 @@
 | db | <code>\*</code> | 
 | endpointTypeId | <code>\*</code> | 
 
-<a name="module_DB API_ session related queries."></a>
-
-## DB API: session related queries.
-This module provides session related queries.
-
 <a name="module_DB API_ zcl database strings access"></a>
 
 ## DB API: zcl database strings access
@@ -15664,13 +15664,13 @@
 <a name="module_Import API_ Imports data from a file."></a>
 
 ## Import API: Imports data from a file.
-This module provides the functionality that reads a .json(.zap) file
+This file provides the functionality that reads the ZAP data from a JSON file
+and imports it into a database.
 
 <a name="module_Import API_ Imports data from a file."></a>
 
 ## Import API: Imports data from a file.
-This file provides the functionality that reads the ZAP data from a JSON file
-and imports it into a database.
+This module provides the functionality that reads a .json(.zap) file
 
 <a name="module_Timer API_ initializes times."></a>
 
@@ -18310,9 +18310,9 @@
     * [~availableEvents(context)](#module_External API_ External API utilities..availableEvents) ⇒
     * [~availableCommands(context)](#module_External API_ External API utilities..availableCommands) ⇒
     * [~availableAttributes(context)](#module_External API_ External API utilities..availableAttributes) ⇒
+    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
     * [~helperWrapper(wrappedHelper)](#module_External API_ External API utilities..helperWrapper) ⇒ <code>function</code>
     * [~registerHelpers(singleHelper, registerHelper, context)](#module_External API_ External API utilities..registerHelpers)
-    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
 
 <a name="module_External API_ External API utilities..availableClusters"></a>
 
@@ -18362,31 +18362,6 @@
 | --- | --- |
 | context | <code>\*</code> | 
 
-<a name="module_External API_ External API utilities..helperWrapper"></a>
-
-### External API: External API utilities~helperWrapper(wrappedHelper) ⇒ <code>function</code>
-Wraps a helper function to add usage tracking and error handling.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: <code>function</code> - - The wrapped helper function.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| wrappedHelper | <code>function</code> | The helper function to wrap. |
-
-<a name="module_External API_ External API utilities..registerHelpers"></a>
-
-### External API: External API utilities~registerHelpers(singleHelper, registerHelper, context)
-Registers a helper function.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| singleHelper | <code>string</code> | The name of the helper function. |
-| registerHelper | <code>function</code> | The helper function to register. |
-| context | <code>Object</code> | The context object. |
-
 <a name="module_External API_ External API utilities..executeHelperFunction"></a>
 
 ### External API: External API utilities~executeHelperFunction(functionName, context, helper) ⇒ <code>Promise</code>
@@ -18401,69 +18376,6 @@
 | context | <code>Object</code> | The context object to pass to the helper function. |
 | helper | <code>string</code> | The path to the helper file containing the helper functions. |
 
-<a name="module_External API_ External API utilities"></a>
-
-## External API: External API utilities
-External Registry utilities for ZAP
-
-
-* [External API: External API utilities](#module_External API_ External API utilities)
-    * [~availableClusters(context)](#module_External API_ External API utilities..availableClusters) ⇒
-    * [~availableEvents(context)](#module_External API_ External API utilities..availableEvents) ⇒
-    * [~availableCommands(context)](#module_External API_ External API utilities..availableCommands) ⇒
-    * [~availableAttributes(context)](#module_External API_ External API utilities..availableAttributes) ⇒
-    * [~helperWrapper(wrappedHelper)](#module_External API_ External API utilities..helperWrapper) ⇒ <code>function</code>
-    * [~registerHelpers(singleHelper, registerHelper, context)](#module_External API_ External API utilities..registerHelpers)
-    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
-
-<a name="module_External API_ External API utilities..availableClusters"></a>
-
-### External API: External API utilities~availableClusters(context) ⇒
-Returns all available clusters.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: all available clusters  
-
-| Param | Type |
-| --- | --- |
-| context | <code>\*</code> | 
-
-<a name="module_External API_ External API utilities..availableEvents"></a>
-
-### External API: External API utilities~availableEvents(context) ⇒
-Returns all available events.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: all available events  
-
-| Param | Type |
-| --- | --- |
-| context | <code>\*</code> | 
-
-<a name="module_External API_ External API utilities..availableCommands"></a>
-
-### External API: External API utilities~availableCommands(context) ⇒
-Returns all available commands.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: all available ccommands  
-
-| Param | Type |
-| --- | --- |
-| context | <code>\*</code> | 
-
-<a name="module_External API_ External API utilities..availableAttributes"></a>
-
-### External API: External API utilities~availableAttributes(context) ⇒
-Returns all available attributes.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: all available attributes  
-
-| Param | Type |
-| --- | --- |
-| context | <code>\*</code> | 
-
 <a name="module_External API_ External API utilities..helperWrapper"></a>
 
 ### External API: External API utilities~helperWrapper(wrappedHelper) ⇒ <code>function</code>
@@ -18489,20 +18401,6 @@
 | registerHelper | <code>function</code> | The helper function to register. |
 | context | <code>Object</code> | The context object. |
 
-<a name="module_External API_ External API utilities..executeHelperFunction"></a>
-
-### External API: External API utilities~executeHelperFunction(functionName, context, helper) ⇒ <code>Promise</code>
-Executes a helper function from a script file.
-
-**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
-**Returns**: <code>Promise</code> - - A Promise that resolves with the result of the helper function.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| functionName | <code>string</code> | The name of the helper function to execute. |
-| context | <code>Object</code> | The context object to pass to the helper function. |
-| helper | <code>string</code> | The path to the helper file containing the helper functions. |
-
 <a name="module_External API_ External API utilities"></a>
 
 ## External API: External API utilities
@@ -18514,9 +18412,9 @@
     * [~availableEvents(context)](#module_External API_ External API utilities..availableEvents) ⇒
     * [~availableCommands(context)](#module_External API_ External API utilities..availableCommands) ⇒
     * [~availableAttributes(context)](#module_External API_ External API utilities..availableAttributes) ⇒
+    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
     * [~helperWrapper(wrappedHelper)](#module_External API_ External API utilities..helperWrapper) ⇒ <code>function</code>
     * [~registerHelpers(singleHelper, registerHelper, context)](#module_External API_ External API utilities..registerHelpers)
-    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
 
 <a name="module_External API_ External API utilities..availableClusters"></a>
 
@@ -18566,6 +18464,20 @@
 | --- | --- |
 | context | <code>\*</code> | 
 
+<a name="module_External API_ External API utilities..executeHelperFunction"></a>
+
+### External API: External API utilities~executeHelperFunction(functionName, context, helper) ⇒ <code>Promise</code>
+Executes a helper function from a script file.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: <code>Promise</code> - - A Promise that resolves with the result of the helper function.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| functionName | <code>string</code> | The name of the helper function to execute. |
+| context | <code>Object</code> | The context object to pass to the helper function. |
+| helper | <code>string</code> | The path to the helper file containing the helper functions. |
+
 <a name="module_External API_ External API utilities..helperWrapper"></a>
 
 ### External API: External API utilities~helperWrapper(wrappedHelper) ⇒ <code>function</code>
@@ -18591,6 +18503,69 @@
 | registerHelper | <code>function</code> | The helper function to register. |
 | context | <code>Object</code> | The context object. |
 
+<a name="module_External API_ External API utilities"></a>
+
+## External API: External API utilities
+External Registry utilities for ZAP
+
+
+* [External API: External API utilities](#module_External API_ External API utilities)
+    * [~availableClusters(context)](#module_External API_ External API utilities..availableClusters) ⇒
+    * [~availableEvents(context)](#module_External API_ External API utilities..availableEvents) ⇒
+    * [~availableCommands(context)](#module_External API_ External API utilities..availableCommands) ⇒
+    * [~availableAttributes(context)](#module_External API_ External API utilities..availableAttributes) ⇒
+    * [~executeHelperFunction(functionName, context, helper)](#module_External API_ External API utilities..executeHelperFunction) ⇒ <code>Promise</code>
+    * [~helperWrapper(wrappedHelper)](#module_External API_ External API utilities..helperWrapper) ⇒ <code>function</code>
+    * [~registerHelpers(singleHelper, registerHelper, context)](#module_External API_ External API utilities..registerHelpers)
+
+<a name="module_External API_ External API utilities..availableClusters"></a>
+
+### External API: External API utilities~availableClusters(context) ⇒
+Returns all available clusters.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: all available clusters  
+
+| Param | Type |
+| --- | --- |
+| context | <code>\*</code> | 
+
+<a name="module_External API_ External API utilities..availableEvents"></a>
+
+### External API: External API utilities~availableEvents(context) ⇒
+Returns all available events.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: all available events  
+
+| Param | Type |
+| --- | --- |
+| context | <code>\*</code> | 
+
+<a name="module_External API_ External API utilities..availableCommands"></a>
+
+### External API: External API utilities~availableCommands(context) ⇒
+Returns all available commands.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: all available ccommands  
+
+| Param | Type |
+| --- | --- |
+| context | <code>\*</code> | 
+
+<a name="module_External API_ External API utilities..availableAttributes"></a>
+
+### External API: External API utilities~availableAttributes(context) ⇒
+Returns all available attributes.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: all available attributes  
+
+| Param | Type |
+| --- | --- |
+| context | <code>\*</code> | 
+
 <a name="module_External API_ External API utilities..executeHelperFunction"></a>
 
 ### External API: External API utilities~executeHelperFunction(functionName, context, helper) ⇒ <code>Promise</code>
@@ -18605,6 +18580,31 @@
 | context | <code>Object</code> | The context object to pass to the helper function. |
 | helper | <code>string</code> | The path to the helper file containing the helper functions. |
 
+<a name="module_External API_ External API utilities..helperWrapper"></a>
+
+### External API: External API utilities~helperWrapper(wrappedHelper) ⇒ <code>function</code>
+Wraps a helper function to add usage tracking and error handling.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+**Returns**: <code>function</code> - - The wrapped helper function.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| wrappedHelper | <code>function</code> | The helper function to wrap. |
+
+<a name="module_External API_ External API utilities..registerHelpers"></a>
+
+### External API: External API utilities~registerHelpers(singleHelper, registerHelper, context)
+Registers a helper function.
+
+**Kind**: inner method of [<code>External API: External API utilities</code>](#module_External API_ External API utilities)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| singleHelper | <code>string</code> | The name of the helper function. |
+| registerHelper | <code>function</code> | The helper function to register. |
+| context | <code>Object</code> | The context object. |
+
 <a name="module_JS API_ Iterator utilities"></a>
 
 ## JS API: Iterator utilities
@@ -18655,6 +18655,7 @@
 * [JS API: string utilities](#module_JS API_ string utilities)
     * [~toCamelCase(str)](#module_JS API_ string utilities..toCamelCase) ⇒
     * [~toSpacedLowercase(str)](#module_JS API_ string utilities..toSpacedLowercase) ⇒
+    * [~tokensIntoCamelCase()](#module_JS API_ string utilities..tokensIntoCamelCase)
     * [~toSnakeCaseAllCaps(label)](#module_JS API_ string utilities..toSnakeCaseAllCaps)
     * [~toSnakeCase(str)](#module_JS API_ string utilities..toSnakeCase) ⇒
     * [~toCleanSymbol(label)](#module_JS API_ string utilities..toCleanSymbol)
@@ -18687,6 +18688,17 @@
 | --- | --- |
 | str | <code>\*</code> | 
 
+<a name="module_JS API_ string utilities..tokensIntoCamelCase"></a>
+
+### JS API: string utilities~tokensIntoCamelCase()
+Converts a string into `camelCase` or `CamelCase` by splitting
+the string into tokens.
+
+Differs from `toCamelCase` by different handling of "." inside names,
+so that results are always usable as a code-compatible name (e.g.
+"Foo 2.5" becomes "Foo25" rather than "Foo2.5").
+
+**Kind**: inner method of [<code>JS API: string utilities</code>](#module_JS API_ string utilities)  
 <a name="module_JS API_ string utilities..toSnakeCaseAllCaps"></a>
 
 ### JS API: string utilities~toSnakeCaseAllCaps(label)
@@ -20789,6 +20801,16 @@
     * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
     * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
     * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
+    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
+    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
+    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
+    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
+    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
+    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
+    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
+    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
+    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
+    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
     * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
     * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
     * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
@@ -20860,16 +20882,6 @@
     * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
     * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
     * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
-    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
-    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
-    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
-    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
-    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
-    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
-    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
-    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
-    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
-    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
 
 <a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
 
@@ -21441,6 +21453,140 @@
 | db | <code>\*</code> |  |
 | ctx | <code>\*</code> | Context of loading. |
 
+<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
+
+### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
+Records the toplevel package information and resolves into packageId
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| crc | <code>\*</code> | 
+| isTopLevelPackageInSync | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..recordVersion"></a>
+
+### Loader API: Loader APIs~recordVersion(db, ctx)
+Records the version into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
+
+### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
+Retrieve zcl package information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: package zcl package information  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| options | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
+
+### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
+Load attribute mapping table if there is multi-protocol information from a json file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| multiProtcolInfo | <code>\*</code> | 
+| categoryToPackageIdMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
+
+### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
+Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array of loaded packageIds.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| metadataFile | <code>\*</code> | array of paths |
+
+<a name="module_Loader API_ Loader APIs..loadZcl"></a>
+
+### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
+Loads individual zcl.json metafile.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Context object that contains .db and .packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
+
+### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
+Load individual custom XML files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| filePath | <code>\*</code> |  |
+| sessionId | <code>\*</code> | Current session within which we're loading this file. |
+
+<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
+
+### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
+Promises to qualify whether zcl file needs to be reloaded.
+If yes, the it will resolve with {filePath, data, packageId}
+If not, then it will resolve with {error}
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves int he object of data.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| info | <code>\*</code> | 
+| parentPackageId | <code>\*</code> | 
+| isCustom | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
+
+### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
+Promises to perform a post loading step.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise to deal with the post-loading cleanup.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
+
+### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: data type discriminator map  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageIds | <code>\*</code> | 
+
 <a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
 
 ### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
@@ -22467,3862 +22613,6 @@
 | db | <code>\*</code> |  |
 | ctx | <code>\*</code> | The context of loading. |
 
-<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
-
-### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
-Records the toplevel package information and resolves into packageId
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| crc | <code>\*</code> | 
-| isTopLevelPackageInSync | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..recordVersion"></a>
-
-### Loader API: Loader APIs~recordVersion(db, ctx)
-Records the version into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
-
-### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
-Retrieve zcl package information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: package zcl package information  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| options | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
-
-### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
-Load attribute mapping table if there is multi-protocol information from a json file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| multiProtcolInfo | <code>\*</code> | 
-| categoryToPackageIdMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
-
-### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
-Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array of loaded packageIds.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| metadataFile | <code>\*</code> | array of paths |
-
-<a name="module_Loader API_ Loader APIs..loadZcl"></a>
-
-### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
-Loads individual zcl.json metafile.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Context object that contains .db and .packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
-
-### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
-Load individual custom XML files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| filePath | <code>\*</code> |  |
-| sessionId | <code>\*</code> | Current session within which we're loading this file. |
-
-<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
-
-### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
-Promises to qualify whether zcl file needs to be reloaded.
-If yes, the it will resolve with {filePath, data, packageId}
-If not, then it will resolve with {error}
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves int he object of data.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| info | <code>\*</code> | 
-| parentPackageId | <code>\*</code> | 
-| isCustom | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
-
-### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
-Promises to perform a post loading step.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise to deal with the post-loading cleanup.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
-
-### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: data type discriminator map  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageIds | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs"></a>
-
-## Loader API: Loader APIs
-This module provides the APIs for new data model loading
-
-
-* [Loader API: Loader APIs](#module_Loader API_ Loader APIs)
-    * [~collectDataFromLibraryXml(ctx)](#module_Loader API_ Loader APIs..collectDataFromLibraryXml) ⇒
-    * [~tagContainsEnum(tag)](#module_Loader API_ Loader APIs..tagContainsEnum) ⇒
-    * [~tagContainsStruct(tag)](#module_Loader API_ Loader APIs..tagContainsStruct) ⇒
-    * [~tagContainsBitmap(tag)](#module_Loader API_ Loader APIs..tagContainsBitmap) ⇒
-    * [~parseSingleZclFile(db, ctx, file)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
-    * [~parseZclFiles(db, ctx)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
-    * [~normalizeHexValue(value)](#module_Loader API_ Loader APIs..normalizeHexValue) ⇒
-    * [~getNumBytesFromShortName(value)](#module_Loader API_ Loader APIs..getNumBytesFromShortName) ⇒
-    * [~prepareAttributes(attributes, side)](#module_Loader API_ Loader APIs..prepareAttributes) ⇒
-    * [~prepareCommands(commands, side, types)](#module_Loader API_ Loader APIs..prepareCommands) ⇒
-    * [~prepareCluster(cluster, isExtension, types)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
-    * [~prepareAtomic(type)](#module_Loader API_ Loader APIs..prepareAtomic) ⇒
-    * [~prepareSubAtomic(type, atomics)](#module_Loader API_ Loader APIs..prepareSubAtomic) ⇒
-    * [~prepareBitmap(type, isContained)](#module_Loader API_ Loader APIs..prepareBitmap) ⇒
-    * [~prepareEnum(type)](#module_Loader API_ Loader APIs..prepareEnum) ⇒
-    * [~prepareStruct(type)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
-    * [~prepareSubAtomicTypes(types)](#module_Loader API_ Loader APIs..prepareSubAtomicTypes)
-    * [~prepareTypes(zclTypes, types)](#module_Loader API_ Loader APIs..prepareTypes)
-    * [~prepareAttributeType(attribute, types, cluster)](#module_Loader API_ Loader APIs..prepareAttributeType)
-    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒
-    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
-    * [~processDataTypeDiscriminator(db, packageId, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
-    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
-    * [~processDataType(db, filePath, packageId, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
-    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
-    * [~processNumber(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
-    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
-    * [~processString(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processString) ⇒
-    * [~prepareEnumsOrBitmaps(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmaps) ⇒
-    * [~processEnums(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnums) ⇒
-    * [~processEnumItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
-    * [~processBitmaps(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmaps) ⇒
-    * [~processBitmapFields(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
-    * [~prepareStruct2(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct2) ⇒
-    * [~processStruct(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
-    * [~processStructItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
-    * [~prepareEnumsOrBitmapsAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic) ⇒
-    * [~processEnumsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumsFromAtomics) ⇒
-    * [~processBitmapsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapsFromAtomics) ⇒
-    * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
-    * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
-    * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
-    * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
-    * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
-    * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
-    * [~prepXmlCommand(c)](#module_Loader API_ Loader APIs..prepXmlCommand) ⇒
-    * [~prepXmlEvent(e)](#module_Loader API_ Loader APIs..prepXmlEvent) ⇒
-    * [~parseSingleNewXmlFile(f)](#module_Loader API_ Loader APIs..parseSingleNewXmlFile) ⇒
-    * [~collectDataFromJsonFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromJsonFile) ⇒
-    * [~collectDataFromPropertiesFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromPropertiesFile) ⇒
-    * [~maskToType(mask)](#module_Loader API_ Loader APIs..maskToType) ⇒
-    * [~prepareAtomic(a)](#module_Loader API_ Loader APIs..prepareAtomic)
-    * [~processAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processAtomics) ⇒
-    * [~prepareClusterGlobalAttribute(cluster)](#module_Loader API_ Loader APIs..prepareClusterGlobalAttribute) ⇒
-    * [~extractAccessTag(ac)](#module_Loader API_ Loader APIs..extractAccessTag) ⇒
-    * [~extractAccessIntoArray(xmlElement)](#module_Loader API_ Loader APIs..extractAccessIntoArray) ⇒
-    * [~prepareCluster(cluster)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
-    * [~processClusters(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusters) ⇒
-    * [~processClusterGlobalAttributes(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterGlobalAttributes) ⇒
-    * [~processClusterExtensions(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterExtensions) ⇒
-    * [~processGlobals(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processGlobals) ⇒
-    * [~prepareTag(tag)](#module_Loader API_ Loader APIs..prepareTag) ⇒
-    * [~processDefaultAccess(db, filePath, packageId, defaultAccessList)](#module_Loader API_ Loader APIs..processDefaultAccess)
-    * [~processAccessControl(db, filePath, packageId, accessControlList)](#module_Loader API_ Loader APIs..processAccessControl)
-    * [~processTags(db, filePath, packageId, tags)](#module_Loader API_ Loader APIs..processTags)
-    * [~prepareDomain(domain)](#module_Loader API_ Loader APIs..prepareDomain) ⇒
-    * [~processDomains(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processDomains) ⇒
-    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
-    * [~processDataTypeDiscriminator(db, filePath, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
-    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
-    * [~processDataType(db, filePath, packageId, knownPackages, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
-    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
-    * [~processNumber(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
-    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
-    * [~processString(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processString) ⇒
-    * [~prepareEnumOrBitmapAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic) ⇒
-    * [~processEnumAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumAtomic) ⇒
-    * [~prepareEnumOrBitmap(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmap) ⇒
-    * [~processEnum(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnum) ⇒
-    * [~processEnumItems(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
-    * [~processBitmapAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapAtomic) ⇒
-    * [~processBitmap(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmap) ⇒
-    * [~processBitmapFields(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
-    * [~prepareStruct(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
-    * [~processStruct(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
-    * [~processStructItems(db, filePath, packageIds, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
-    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒ <code>Object</code>
-    * [~processDeviceTypes(db, filePath, packageId, data, context)](#module_Loader API_ Loader APIs..processDeviceTypes) ⇒ <code>Promise</code>
-    * [~processReloadDeviceTypes()](#module_Loader API_ Loader APIs..processReloadDeviceTypes) ⇒ <code>Promise</code>
-    * [~processDataTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processDataTypes) ⇒
-    * [~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processAtomicTypes) ⇒
-    * [~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters)](#module_Loader API_ Loader APIs..processNonAtomicTypes) ⇒
-    * [~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems)](#module_Loader API_ Loader APIs..processSubItems) ⇒
-    * [~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems)](#module_Loader API_ Loader APIs..processParsedZclData) ⇒
-    * [~parseSingleZclFile(db, packageId, file, context, collectedStructItems)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
-    * [~isCrcMismatchOrPackageDoesNotExist(db, packageId, files)](#module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist) ⇒
-    * [~parseZclFiles(db, packageId, zclFiles, context)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
-    * [~parseManufacturerData(db, ctx)](#module_Loader API_ Loader APIs..parseManufacturerData) ⇒
-    * [~parseProfilesData(db, ctx)](#module_Loader API_ Loader APIs..parseProfilesData) ⇒
-    * [~parseFeatureFlags(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseFeatureFlags) ⇒
-    * [~parseUiOptions(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseUiOptions) ⇒
-    * [~parseOptions(db)](#module_Loader API_ Loader APIs..parseOptions) ⇒
-    * [~parseTextOptions(db, pkgRef, textOptions)](#module_Loader API_ Loader APIs..parseTextOptions) ⇒
-    * [~parseBoolOptions(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolOptions) ⇒
-    * [~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes)](#module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
-    * [~parseDefaults(db, ctx)](#module_Loader API_ Loader APIs..parseDefaults) ⇒
-    * [~parseTextDefaults(db, pkgRef, textDefaults)](#module_Loader API_ Loader APIs..parseTextDefaults) ⇒
-    * [~parseBoolDefaults(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolDefaults) ⇒
-    * [~loadIndividualSilabsFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualSilabsFile) ⇒
-    * [~processCustomZclDeviceType(db, ctx)](#module_Loader API_ Loader APIs..processCustomZclDeviceType) ⇒
-    * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
-    * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
-    * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
-    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
-    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
-    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
-    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
-    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
-    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
-    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
-    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
-    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
-    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
-
-<a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
-
-### Loader API: Loader APIs~collectDataFromLibraryXml(ctx) ⇒
-Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved files.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context which contains information about the metadataFiles and data |
-
-<a name="module_Loader API_ Loader APIs..tagContainsEnum"></a>
-
-### Loader API: Loader APIs~tagContainsEnum(tag) ⇒
-Check if tag contains enum.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..tagContainsStruct"></a>
-
-### Loader API: Loader APIs~tagContainsStruct(tag) ⇒
-Check if tag contains struct.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..tagContainsBitmap"></a>
-
-### Loader API: Loader APIs~tagContainsBitmap(tag) ⇒
-Check if tag contains Bitmap.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
-
-### Loader API: Loader APIs~parseSingleZclFile(db, ctx, file) ⇒
-Parses ZCL xml file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: empty array  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-| file | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
-
-### Loader API: Loader APIs~parseZclFiles(db, ctx) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..normalizeHexValue"></a>
-
-### Loader API: Loader APIs~normalizeHexValue(value) ⇒
-The Dotdot ZCL XML doesn't use the 0x prefix, but it's a nice thing to have and Silabs xml
-does use this so this helper function normalizes the use of hex
-
-TODO: Is this the right thing to do?
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Either the normalized hex string (with the 0x prefix) or the original  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| value | <code>\*</code> | the string value to be normalized |
-
-<a name="module_Loader API_ Loader APIs..getNumBytesFromShortName"></a>
-
-### Loader API: Loader APIs~getNumBytesFromShortName(value) ⇒
-The Dotdot ZCL XML doesn't have a length but it is embedded in the short name,
-we can scrape the value to get the size
-
-TODO: Is this the right thing to do?
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: size in bytes or 0 if the # of bytes could not be determined  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| value | <code>\*</code> | the string value to be scraped |
-
-<a name="module_Loader API_ Loader APIs..prepareAttributes"></a>
-
-### Loader API: Loader APIs~prepareAttributes(attributes, side) ⇒
-Prepare XML attributes for entry into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array containing all data from XML ready to be inserted into the DB.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| attributes | <code>\*</code> | an array of attributes |
-| side | <code>\*</code> | the side the attribute is on either "client" or "server" |
-
-<a name="module_Loader API_ Loader APIs..prepareCommands"></a>
-
-### Loader API: Loader APIs~prepareCommands(commands, side, types) ⇒
-Prepare XML commands for entry into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array containing all data from XML ready to be inserted in to the DB.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| commands | <code>\*</code> | an array of commands |
-| side | <code>\*</code> | the side the command is on either "client" or "server" |
-| types | <code>\*</code> | contained for types, where bitmaps are going to be inserted. |
-
-<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
-
-### Loader API: Loader APIs~prepareCluster(cluster, isExtension, types) ⇒
-Prepare XML cluster for insertion into the database.
-This method can also prepare clusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing all data from XML.  
-
-| Param | Type | Default | Description |
-| --- | --- | --- | --- |
-| cluster | <code>\*</code> |  |  |
-| isExtension | <code>\*</code> | <code>false</code> | if this is an extension or not (there are none in dotdot xml) |
-| types | <code>\*</code> |  | types object into which cluster can put types it might have |
-
-<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
-
-### Loader API: Loader APIs~prepareAtomic(type) ⇒
-Parses xml type into the atomic object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the atomic format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareSubAtomic"></a>
-
-### Loader API: Loader APIs~prepareSubAtomic(type, atomics) ⇒
-Parses xml type into the sub-atomic object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the sub-atomic format in the dotdot xml |
-| atomics | <code>\*</code> | an array of atomic types |
-
-<a name="module_Loader API_ Loader APIs..prepareBitmap"></a>
-
-### Loader API: Loader APIs~prepareBitmap(type, isContained) ⇒
-Parses xml type into the bitmap object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Default | Description |
-| --- | --- | --- | --- |
-| type | <code>\*</code> |  | an xml object which conforms to the bitmap format in the dotdot xml |
-| isContained | <code>\*</code> | <code>false</code> | a boolean indicating if this is coming from a contained tag or not |
-
-<a name="module_Loader API_ Loader APIs..prepareEnum"></a>
-
-### Loader API: Loader APIs~prepareEnum(type) ⇒
-Parses xml type into the enum object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the enum format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
-
-### Loader API: Loader APIs~prepareStruct(type) ⇒
-Parses xml type into the struct object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the struct format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareSubAtomicTypes"></a>
-
-### Loader API: Loader APIs~prepareSubAtomicTypes(types)
-Parses array of xml objects that conform to the sub-atomic format in the dotdot xml
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| types | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareTypes"></a>
-
-### Loader API: Loader APIs~prepareTypes(zclTypes, types)
-Parses xml types into the types object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| zclTypes | <code>\*</code> | an array of xml types |
-| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
-
-<a name="module_Loader API_ Loader APIs..prepareAttributeType"></a>
-
-### Loader API: Loader APIs~prepareAttributeType(attribute, types, cluster)
-Parses xml types into the types object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| attribute | <code>\*</code> | an attribute with the type in it |
-| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
-| cluster | <code>\*</code> | the cluster that the attribute belongs to (used presently for uniqueness of the type name) |
-
-<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
-
-### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒
-Preparation step for the device types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: an object containing the prepared device types.  
-
-| Param | Type |
-| --- | --- |
-| deviceType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
-Prepare Data Type Discriminator for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~processDataTypeDiscriminator(db, packageId, zclDataTypes) ⇒
-Processes Data Type Discriminator.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Type Discriminators.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| zclDataTypes | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
-
-### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
-Prepare Data Types for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-| typeMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataType"></a>
-
-### Loader API: Loader APIs~processDataType(db, filePath, packageId, data, dataType) ⇒
-Processes Data Type.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Types into the Data Type table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
-
-### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
-Prepare numbers for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNumber"></a>
-
-### Loader API: Loader APIs~processNumber(db, filePath, packageId, data) ⇒
-Processes Numbers.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted numbers into the number table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareString"></a>
-
-### Loader API: Loader APIs~prepareString(a, dataType) ⇒
-Prepare strings for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processString"></a>
-
-### Loader API: Loader APIs~processString(db, filePath, packageId, data) ⇒
-Processes Strings.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted strings into the String table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmaps"></a>
-
-### Loader API: Loader APIs~prepareEnumsOrBitmaps(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnums"></a>
-
-### Loader API: Loader APIs~processEnums(db, filePath, packageId, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
-
-### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, data) ⇒
-Processes the enum Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enum items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmaps"></a>
-
-### Loader API: Loader APIs~processBitmaps(db, filePath, packageId, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
-
-### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, data) ⇒
-Processes the bitmap fields.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmap fields.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareStruct2"></a>
-
-### Loader API: Loader APIs~prepareStruct2(a, dataType) ⇒
-Prepare structs for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStruct"></a>
-
-### Loader API: Loader APIs~processStruct(db, filePath, packageId, data) ⇒
-Processes the structs.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStructItems"></a>
-
-### Loader API: Loader APIs~processStructItems(db, filePath, packageId, data) ⇒
-Processes the struct Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted struct items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic"></a>
-
-### Loader API: Loader APIs~prepareEnumsOrBitmapsAtomic(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumsFromAtomics"></a>
-
-### Loader API: Loader APIs~processEnumsFromAtomics(db, filePath, packageId, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapsFromAtomics"></a>
-
-### Loader API: Loader APIs~processBitmapsFromAtomics(db, filePath, packageId, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclData"></a>
-
-### Loader API: Loader APIs~loadZclData(db, ctx) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualDotDotFile"></a>
-
-### Loader API: Loader APIs~loadIndividualDotDotFile(db, filePath) ⇒ <code>\*</code>
-TODO This is not supported at this time.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>\*</code> - object w/ following: { packageId: pkgId } or { err: err }  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadToplevelXmlFile"></a>
-
-### Loader API: Loader APIs~loadToplevelXmlFile(db, ctx) ⇒
-Toplevel function that loads the xml library file
-and orchestrates the promise chain.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: a Promise that resolves with the db.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| ctx | <code>\*</code> | Context of loading. |
-
-<a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
-
-### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
-Parses the new XML files. Returns an object containing
-loaded data:
-   clusterIdsLoaded: array of cluster ids that were loaded
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the new XML data is loaded.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| files | <code>\*</code> | 
-| context | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlFeature"></a>
-
-### Loader API: Loader APIs~prepXmlFeature(f) ⇒
-Prepare features from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: feature information  
-
-| Param | Type |
-| --- | --- |
-| f | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlAttribute"></a>
-
-### Loader API: Loader APIs~prepXmlAttribute(a) ⇒
-Prepare attributes from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: attribute information  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlCommand"></a>
-
-### Loader API: Loader APIs~prepXmlCommand(c) ⇒
-Prepare commands from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: command information  
-
-| Param | Type |
-| --- | --- |
-| c | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlEvent"></a>
-
-### Loader API: Loader APIs~prepXmlEvent(e) ⇒
-Prepare events from xml
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: event information  
-
-| Param | Type |
-| --- | --- |
-| e | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleNewXmlFile"></a>
-
-### Loader API: Loader APIs~parseSingleNewXmlFile(f) ⇒
-Parse xml file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: xml information from file  
-
-| Param | Type |
-| --- | --- |
-| f | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..collectDataFromJsonFile"></a>
-
-### Loader API: Loader APIs~collectDataFromJsonFile(ctx) ⇒
-Promises to read the JSON file and resolve all the data.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved file.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context containing information about the file |
-
-<a name="module_Loader API_ Loader APIs..collectDataFromPropertiesFile"></a>
-
-### Loader API: Loader APIs~collectDataFromPropertiesFile(ctx) ⇒
-Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved files.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context which contains information about the propertiesFiles and data |
-
-<a name="module_Loader API_ Loader APIs..maskToType"></a>
-
-### Loader API: Loader APIs~maskToType(mask) ⇒
-Silabs XML does not carry types with bitmap fields, but dotdot does, so they are in the schema.
-Just to put some data in, we differentiate between "bool" and "enum" types here.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: bool or corresponding enum  
-
-| Param | Type |
-| --- | --- |
-| mask | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
-
-### Loader API: Loader APIs~prepareAtomic(a)
-Prepare atomic to db insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAtomics"></a>
-
-### Loader API: Loader APIs~processAtomics(db, filePath, packageId, data) ⇒
-Processes atomic types for DB insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted bitmaps  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareClusterGlobalAttribute"></a>
-
-### Loader API: Loader APIs~prepareClusterGlobalAttribute(cluster) ⇒
-Prepares global attribute data.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing the data from XML.  
-
-| Param | Type |
-| --- | --- |
-| cluster | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..extractAccessTag"></a>
-
-### Loader API: Loader APIs~extractAccessTag(ac) ⇒
-Extract access information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: access tag information  
-
-| Param | Type |
-| --- | --- |
-| ac | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..extractAccessIntoArray"></a>
-
-### Loader API: Loader APIs~extractAccessIntoArray(xmlElement) ⇒
-Extract list of access information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: array of access information  
-
-| Param | Type |
-| --- | --- |
-| xmlElement | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
-
-### Loader API: Loader APIs~prepareCluster(cluster) ⇒
-Prepare XML cluster for insertion into the database.
-This method can also prepare clusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing all data from XML.  
-
-| Param | Type |
-| --- | --- |
-| cluster | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusters"></a>
-
-### Loader API: Loader APIs~processClusters(db, filePath, packageId, data) ⇒
-Process clusters for insertion into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of cluster insertion.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusterGlobalAttributes"></a>
-
-### Loader API: Loader APIs~processClusterGlobalAttributes(db, filePath, packageId, data) ⇒
-Processes global attributes for insertion into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted data.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusterExtensions"></a>
-
-### Loader API: Loader APIs~processClusterExtensions(db, filePath, packageId, data) ⇒
-Cluster Extension contains attributes and commands in a same way as regular cluster,
-and it has an attribute code="0xXYZ" where code is a cluster code.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise to resolve the clusterExtension tags  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processGlobals"></a>
-
-### Loader API: Loader APIs~processGlobals(db, filePath, packageId, data) ⇒
-Processes the globals in the XML files. The `global` tag contains
-attributes and commands in a same way as cluster or clusterExtension
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise to resolve the globals  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareTag"></a>
-
-### Loader API: Loader APIs~prepareTag(tag) ⇒
-Prepare tag object from tag
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: tag information  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDefaultAccess"></a>
-
-### Loader API: Loader APIs~processDefaultAccess(db, filePath, packageId, defaultAccessList)
-Process defaultAccess tag in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| defaultAccessList | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAccessControl"></a>
-
-### Loader API: Loader APIs~processAccessControl(db, filePath, packageId, accessControlList)
-Process accessControl tag in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| accessControlList | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processTags"></a>
-
-### Loader API: Loader APIs~processTags(db, filePath, packageId, tags)
-Processes the tags in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| tags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDomain"></a>
-
-### Loader API: Loader APIs~prepareDomain(domain) ⇒
-Convert domain from XMl to domain for DB.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Domain object for DB.  
-
-| Param | Type |
-| --- | --- |
-| domain | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDomains"></a>
-
-### Loader API: Loader APIs~processDomains(db, filePath, packageId, data) ⇒
-Process domains for insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of database insertion of domains.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
-Prepare Data Type Discriminator for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~processDataTypeDiscriminator(db, filePath, zclDataTypes) ⇒
-Processes Data Type Discriminator.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Type Discriminators.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| zclDataTypes | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
-
-### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
-Prepare Data Types for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-| typeMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataType"></a>
-
-### Loader API: Loader APIs~processDataType(db, filePath, packageId, knownPackages, data, dataType) ⇒
-Processes Data Type.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Types into the Data Type table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
-
-### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
-Prepare numbers for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNumber"></a>
-
-### Loader API: Loader APIs~processNumber(db, filePath, packageId, knownPackages, data) ⇒
-Processes Numbers.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted numbers into the number table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareString"></a>
-
-### Loader API: Loader APIs~prepareString(a, dataType) ⇒
-Prepare strings for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processString"></a>
-
-### Loader API: Loader APIs~processString(db, filePath, packageId, knownPackages, data) ⇒
-Processes Strings.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted strings into the String table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic"></a>
-
-### Loader API: Loader APIs~prepareEnumOrBitmapAtomic(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumAtomic"></a>
-
-### Loader API: Loader APIs~processEnumAtomic(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmap"></a>
-
-### Loader API: Loader APIs~prepareEnumOrBitmap(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnum"></a>
-
-### Loader API: Loader APIs~processEnum(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
-
-### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enum Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enum items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapAtomic"></a>
-
-### Loader API: Loader APIs~processBitmapAtomic(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmap"></a>
-
-### Loader API: Loader APIs~processBitmap(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
-
-### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmap fields.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmap fields.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
-
-### Loader API: Loader APIs~prepareStruct(a, dataType) ⇒
-Prepare structs for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStruct"></a>
-
-### Loader API: Loader APIs~processStruct(db, filePath, packageId, knownPackages, data) ⇒
-Processes the structs.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStructItems"></a>
-
-### Loader API: Loader APIs~processStructItems(db, filePath, packageIds, data) ⇒
-Processes the struct Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted struct items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageIds | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
-
-### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒ <code>Object</code>
-Prepares a device type object by extracting and transforming its properties.
-
-This function takes a device type object and processes its properties to create
-a new object with a specific structure. It handles various properties such as
-device ID, profile ID, domain, name, description, class, scope, and superset.
-Additionally, it processes endpoint compositions and clusters if they exist.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Object</code> - The prepared device type object with transformed properties.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| deviceType | <code>Object</code> | The device type object to be prepared. |
-
-<a name="module_Loader API_ Loader APIs..processDeviceTypes"></a>
-
-### Loader API: Loader APIs~processDeviceTypes(db, filePath, packageId, data, context) ⇒ <code>Promise</code>
-Processes and inserts device types into the database.
-This function logs the number of device types being processed for debugging purposes.
-It maps over the provided data to prepare each device type and then iterates over each prepared device type.
-If a device type has a compositionType, it inserts the endpoint composition into the database,
-retrieves the endpoint composition ID, and then inserts the device composition.
-Finally, it inserts all prepared device types into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise</code> - A promise that resolves after all device types have been inserted into the database.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> | The database connection object. |
-| filePath | <code>string</code> | The file path from which the device types are being processed. |
-| packageId | <code>\*</code> | The package ID associated with the device types. |
-| data | <code>Array</code> | The array of device types to be processed. |
-| context | <code>\*</code> | Additional context that might be required for processing. |
-
-<a name="module_Loader API_ Loader APIs..processReloadDeviceTypes"></a>
-
-### Loader API: Loader APIs~processReloadDeviceTypes() ⇒ <code>Promise</code>
-Processes and reloads device type entities in the database.
-This function is called when a custom xml with device types is reloaded.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise</code> - A promise that resolves after all device types have been reloaded.  
-<a name="module_Loader API_ Loader APIs..processDataTypes"></a>
-
-### Loader API: Loader APIs~processDataTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
-Process promises for loading the data types
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of data types  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAtomicTypes"></a>
-
-### Loader API: Loader APIs~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
-Processes promises for loading individual tables per data type for
-atomics/baseline types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of atomic/baseline processing.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNonAtomicTypes"></a>
-
-### Loader API: Loader APIs~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters) ⇒
-Processes promises for loading individual tables per data type for no-atomic
-and inherited types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of non-atomic/inherited data type processing.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-| featureClusters | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processSubItems"></a>
-
-### Loader API: Loader APIs~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems) ⇒
-Processes promises for loading items within a bitmap, struct, and enum data types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of processing sub items within a bitmap, enum and structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-| featureClusters | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processParsedZclData"></a>
-
-### Loader API: Loader APIs~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems) ⇒
-After XML parser is done with the barebones parsing, this function
-branches the individual toplevel tags.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise that resolves when all the subtags are parsed.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| argument | <code>\*</code> | 
-| previouslyKnownPackages | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
-
-### Loader API: Loader APIs~parseSingleZclFile(db, packageId, file, context, collectedStructItems) ⇒
-This function is used for parsing each individual ZCL file at a grouped zcl file package level.
-This should _not_ be used for custom XML addition due to custom xmls potentially relying on existing packges.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise for when the last stage of the loading pipeline finishes.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| file | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist"></a>
-
-### Loader API: Loader APIs~isCrcMismatchOrPackageDoesNotExist(db, packageId, files) ⇒
-Checks if there is a crc mismatch on any xml file. This can be used to
-decide if there is a need to reload all the xml files. Also check if the
-package is not loaded before.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: the status of crc mismatch and whether a package is present in an
-object  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| files | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
-
-### Loader API: Loader APIs~parseZclFiles(db, packageId, zclFiles, context) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| zclFiles | <code>\*</code> | 
-| context | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseManufacturerData"></a>
-
-### Loader API: Loader APIs~parseManufacturerData(db, ctx) ⇒
-Parses the manufacturers xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed manufacturers file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseProfilesData"></a>
-
-### Loader API: Loader APIs~parseProfilesData(db, ctx) ⇒
-Parses the profiles xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed profiles file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseFeatureFlags"></a>
-
-### Loader API: Loader APIs~parseFeatureFlags(db, packageId, featureFlags) ⇒
-Inside the `zcl.json` can be a `featureFlags` key, which is
-a general purpose object. It contains keys, that map to objects.
-Each key is a "package option category".
-Key/velues of the object itself, end up in CODE/LABEL combinations.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: array of feature flags  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| featureFlags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseUiOptions"></a>
-
-### Loader API: Loader APIs~parseUiOptions(db, packageId, featureFlags) ⇒
-Inside the `zcl.json` can be a `featureFlags` key, which is
-a general purpose object. It contains keys, that map to objects.
-Each key is a "package option category".
-Key/velues of the object itself, end up in CODE/LABEL combinations.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that loads the uiOptions object into the database.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| featureFlags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseOptions"></a>
-
-### Loader API: Loader APIs~parseOptions(db) ⇒
-Parses and loads the text and boolean options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise of parsed options  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseTextOptions"></a>
-
-### Loader API: Loader APIs~parseTextOptions(db, pkgRef, textOptions) ⇒
-Parses the text options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed text options.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| textOptions | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseBoolOptions"></a>
-
-### Loader API: Loader APIs~parseBoolOptions(db, pkgRef, booleanCategories) ⇒
-Parses the boolean options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed boolean options.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| booleanCategories | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes"></a>
-
-### Loader API: Loader APIs~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
-Asynchronously parses and inserts attribute access interface attributes into the database.
-This function iterates over the attributeAccessInterfaceAttributes object, processing each cluster
-by mapping its values to a specific structure and then inserting them into the database using
-the insertOptionsKeyValues function.
-
-The main purpose of this function is to store cluster/attribute pairs including global attributes and their cluster pair
-The ATTRIBUTE table has cluster_ref as null for global attributes so this second method was necessary
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise.&lt;void&gt;</code> - A promise that resolves when all attributes have been processed and inserted.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> | The database connection object. |
-| pkgRef | <code>\*</code> | The package reference id for which the attributes are being parsed. |
-| attributeAccessInterfaceAttributes | <code>\*</code> | An object containing the attribute access interface attributes,                                                  structured by cluster. |
-
-<a name="module_Loader API_ Loader APIs..parseDefaults"></a>
-
-### Loader API: Loader APIs~parseDefaults(db, ctx) ⇒
-Parses the default values inside the options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promised of parsed text and bool defaults.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseTextDefaults"></a>
-
-### Loader API: Loader APIs~parseTextDefaults(db, pkgRef, textDefaults) ⇒
-Parse text defaults from default options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array of promises  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| textDefaults | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseBoolDefaults"></a>
-
-### Loader API: Loader APIs~parseBoolDefaults(db, pkgRef, booleanCategories) ⇒
-Parse the boolean defaults inside options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: List of promises  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| booleanCategories | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualSilabsFile"></a>
-
-### Loader API: Loader APIs~loadIndividualSilabsFile(db, filePath) ⇒
-Parses a single file. This function is used specifically
-for adding a package through an existing ZAP session because of its reliance
-on relating the new XML content to the packages associated with that session.
-e.g. for ClusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a loaded file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processCustomZclDeviceType"></a>
-
-### Loader API: Loader APIs~processCustomZclDeviceType(db, ctx) ⇒
-If custom device is supported, then this method creates it.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: context  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclJson"></a>
-
-### Loader API: Loader APIs~loadZclJson(db, metafile) ⇒
-Load ZCL metadata
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of loaded zcl json file  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metafile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclProperties"></a>
-
-### Loader API: Loader APIs~loadZclProperties(db, metafile) ⇒
-Load ZCL metadata
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of loaded zcl properties file  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metafile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclJsonOrProperties"></a>
-
-### Loader API: Loader APIs~loadZclJsonOrProperties(db, ctx) ⇒
-Toplevel function that loads the toplevel metafile
-and orchestrates the promise chain.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: a Promise that resolves with the db.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| ctx | <code>\*</code> | The context of loading. |
-
-<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
-
-### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
-Records the toplevel package information and resolves into packageId
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| crc | <code>\*</code> | 
-| isTopLevelPackageInSync | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..recordVersion"></a>
-
-### Loader API: Loader APIs~recordVersion(db, ctx)
-Records the version into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
-
-### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
-Retrieve zcl package information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: package zcl package information  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| options | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
-
-### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
-Load attribute mapping table if there is multi-protocol information from a json file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| multiProtcolInfo | <code>\*</code> | 
-| categoryToPackageIdMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
-
-### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
-Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array of loaded packageIds.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| metadataFile | <code>\*</code> | array of paths |
-
-<a name="module_Loader API_ Loader APIs..loadZcl"></a>
-
-### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
-Loads individual zcl.json metafile.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Context object that contains .db and .packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
-
-### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
-Load individual custom XML files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| filePath | <code>\*</code> |  |
-| sessionId | <code>\*</code> | Current session within which we're loading this file. |
-
-<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
-
-### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
-Promises to qualify whether zcl file needs to be reloaded.
-If yes, the it will resolve with {filePath, data, packageId}
-If not, then it will resolve with {error}
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves int he object of data.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| info | <code>\*</code> | 
-| parentPackageId | <code>\*</code> | 
-| isCustom | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
-
-### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
-Promises to perform a post loading step.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise to deal with the post-loading cleanup.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
-
-### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: data type discriminator map  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageIds | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs"></a>
-
-## Loader API: Loader APIs
-This module provides the APIs for ZCL/Data-Model loading.
-
-
-* [Loader API: Loader APIs](#module_Loader API_ Loader APIs)
-    * [~collectDataFromLibraryXml(ctx)](#module_Loader API_ Loader APIs..collectDataFromLibraryXml) ⇒
-    * [~tagContainsEnum(tag)](#module_Loader API_ Loader APIs..tagContainsEnum) ⇒
-    * [~tagContainsStruct(tag)](#module_Loader API_ Loader APIs..tagContainsStruct) ⇒
-    * [~tagContainsBitmap(tag)](#module_Loader API_ Loader APIs..tagContainsBitmap) ⇒
-    * [~parseSingleZclFile(db, ctx, file)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
-    * [~parseZclFiles(db, ctx)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
-    * [~normalizeHexValue(value)](#module_Loader API_ Loader APIs..normalizeHexValue) ⇒
-    * [~getNumBytesFromShortName(value)](#module_Loader API_ Loader APIs..getNumBytesFromShortName) ⇒
-    * [~prepareAttributes(attributes, side)](#module_Loader API_ Loader APIs..prepareAttributes) ⇒
-    * [~prepareCommands(commands, side, types)](#module_Loader API_ Loader APIs..prepareCommands) ⇒
-    * [~prepareCluster(cluster, isExtension, types)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
-    * [~prepareAtomic(type)](#module_Loader API_ Loader APIs..prepareAtomic) ⇒
-    * [~prepareSubAtomic(type, atomics)](#module_Loader API_ Loader APIs..prepareSubAtomic) ⇒
-    * [~prepareBitmap(type, isContained)](#module_Loader API_ Loader APIs..prepareBitmap) ⇒
-    * [~prepareEnum(type)](#module_Loader API_ Loader APIs..prepareEnum) ⇒
-    * [~prepareStruct(type)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
-    * [~prepareSubAtomicTypes(types)](#module_Loader API_ Loader APIs..prepareSubAtomicTypes)
-    * [~prepareTypes(zclTypes, types)](#module_Loader API_ Loader APIs..prepareTypes)
-    * [~prepareAttributeType(attribute, types, cluster)](#module_Loader API_ Loader APIs..prepareAttributeType)
-    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒
-    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
-    * [~processDataTypeDiscriminator(db, packageId, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
-    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
-    * [~processDataType(db, filePath, packageId, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
-    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
-    * [~processNumber(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
-    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
-    * [~processString(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processString) ⇒
-    * [~prepareEnumsOrBitmaps(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmaps) ⇒
-    * [~processEnums(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnums) ⇒
-    * [~processEnumItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
-    * [~processBitmaps(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmaps) ⇒
-    * [~processBitmapFields(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
-    * [~prepareStruct2(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct2) ⇒
-    * [~processStruct(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
-    * [~processStructItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
-    * [~prepareEnumsOrBitmapsAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic) ⇒
-    * [~processEnumsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumsFromAtomics) ⇒
-    * [~processBitmapsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapsFromAtomics) ⇒
-    * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
-    * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
-    * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
-    * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
-    * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
-    * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
-    * [~prepXmlCommand(c)](#module_Loader API_ Loader APIs..prepXmlCommand) ⇒
-    * [~prepXmlEvent(e)](#module_Loader API_ Loader APIs..prepXmlEvent) ⇒
-    * [~parseSingleNewXmlFile(f)](#module_Loader API_ Loader APIs..parseSingleNewXmlFile) ⇒
-    * [~collectDataFromJsonFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromJsonFile) ⇒
-    * [~collectDataFromPropertiesFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromPropertiesFile) ⇒
-    * [~maskToType(mask)](#module_Loader API_ Loader APIs..maskToType) ⇒
-    * [~prepareAtomic(a)](#module_Loader API_ Loader APIs..prepareAtomic)
-    * [~processAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processAtomics) ⇒
-    * [~prepareClusterGlobalAttribute(cluster)](#module_Loader API_ Loader APIs..prepareClusterGlobalAttribute) ⇒
-    * [~extractAccessTag(ac)](#module_Loader API_ Loader APIs..extractAccessTag) ⇒
-    * [~extractAccessIntoArray(xmlElement)](#module_Loader API_ Loader APIs..extractAccessIntoArray) ⇒
-    * [~prepareCluster(cluster)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
-    * [~processClusters(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusters) ⇒
-    * [~processClusterGlobalAttributes(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterGlobalAttributes) ⇒
-    * [~processClusterExtensions(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterExtensions) ⇒
-    * [~processGlobals(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processGlobals) ⇒
-    * [~prepareTag(tag)](#module_Loader API_ Loader APIs..prepareTag) ⇒
-    * [~processDefaultAccess(db, filePath, packageId, defaultAccessList)](#module_Loader API_ Loader APIs..processDefaultAccess)
-    * [~processAccessControl(db, filePath, packageId, accessControlList)](#module_Loader API_ Loader APIs..processAccessControl)
-    * [~processTags(db, filePath, packageId, tags)](#module_Loader API_ Loader APIs..processTags)
-    * [~prepareDomain(domain)](#module_Loader API_ Loader APIs..prepareDomain) ⇒
-    * [~processDomains(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processDomains) ⇒
-    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
-    * [~processDataTypeDiscriminator(db, filePath, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
-    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
-    * [~processDataType(db, filePath, packageId, knownPackages, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
-    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
-    * [~processNumber(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
-    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
-    * [~processString(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processString) ⇒
-    * [~prepareEnumOrBitmapAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic) ⇒
-    * [~processEnumAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumAtomic) ⇒
-    * [~prepareEnumOrBitmap(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmap) ⇒
-    * [~processEnum(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnum) ⇒
-    * [~processEnumItems(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
-    * [~processBitmapAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapAtomic) ⇒
-    * [~processBitmap(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmap) ⇒
-    * [~processBitmapFields(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
-    * [~prepareStruct(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
-    * [~processStruct(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
-    * [~processStructItems(db, filePath, packageIds, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
-    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒ <code>Object</code>
-    * [~processDeviceTypes(db, filePath, packageId, data, context)](#module_Loader API_ Loader APIs..processDeviceTypes) ⇒ <code>Promise</code>
-    * [~processReloadDeviceTypes()](#module_Loader API_ Loader APIs..processReloadDeviceTypes) ⇒ <code>Promise</code>
-    * [~processDataTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processDataTypes) ⇒
-    * [~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processAtomicTypes) ⇒
-    * [~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters)](#module_Loader API_ Loader APIs..processNonAtomicTypes) ⇒
-    * [~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems)](#module_Loader API_ Loader APIs..processSubItems) ⇒
-    * [~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems)](#module_Loader API_ Loader APIs..processParsedZclData) ⇒
-    * [~parseSingleZclFile(db, packageId, file, context, collectedStructItems)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
-    * [~isCrcMismatchOrPackageDoesNotExist(db, packageId, files)](#module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist) ⇒
-    * [~parseZclFiles(db, packageId, zclFiles, context)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
-    * [~parseManufacturerData(db, ctx)](#module_Loader API_ Loader APIs..parseManufacturerData) ⇒
-    * [~parseProfilesData(db, ctx)](#module_Loader API_ Loader APIs..parseProfilesData) ⇒
-    * [~parseFeatureFlags(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseFeatureFlags) ⇒
-    * [~parseUiOptions(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseUiOptions) ⇒
-    * [~parseOptions(db)](#module_Loader API_ Loader APIs..parseOptions) ⇒
-    * [~parseTextOptions(db, pkgRef, textOptions)](#module_Loader API_ Loader APIs..parseTextOptions) ⇒
-    * [~parseBoolOptions(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolOptions) ⇒
-    * [~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes)](#module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
-    * [~parseDefaults(db, ctx)](#module_Loader API_ Loader APIs..parseDefaults) ⇒
-    * [~parseTextDefaults(db, pkgRef, textDefaults)](#module_Loader API_ Loader APIs..parseTextDefaults) ⇒
-    * [~parseBoolDefaults(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolDefaults) ⇒
-    * [~loadIndividualSilabsFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualSilabsFile) ⇒
-    * [~processCustomZclDeviceType(db, ctx)](#module_Loader API_ Loader APIs..processCustomZclDeviceType) ⇒
-    * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
-    * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
-    * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
-    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
-    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
-    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
-    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
-    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
-    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
-    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
-    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
-    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
-    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
-
-<a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
-
-### Loader API: Loader APIs~collectDataFromLibraryXml(ctx) ⇒
-Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved files.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context which contains information about the metadataFiles and data |
-
-<a name="module_Loader API_ Loader APIs..tagContainsEnum"></a>
-
-### Loader API: Loader APIs~tagContainsEnum(tag) ⇒
-Check if tag contains enum.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..tagContainsStruct"></a>
-
-### Loader API: Loader APIs~tagContainsStruct(tag) ⇒
-Check if tag contains struct.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..tagContainsBitmap"></a>
-
-### Loader API: Loader APIs~tagContainsBitmap(tag) ⇒
-Check if tag contains Bitmap.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: boolean  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
-
-### Loader API: Loader APIs~parseSingleZclFile(db, ctx, file) ⇒
-Parses ZCL xml file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: empty array  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-| file | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
-
-### Loader API: Loader APIs~parseZclFiles(db, ctx) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..normalizeHexValue"></a>
-
-### Loader API: Loader APIs~normalizeHexValue(value) ⇒
-The Dotdot ZCL XML doesn't use the 0x prefix, but it's a nice thing to have and Silabs xml
-does use this so this helper function normalizes the use of hex
-
-TODO: Is this the right thing to do?
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Either the normalized hex string (with the 0x prefix) or the original  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| value | <code>\*</code> | the string value to be normalized |
-
-<a name="module_Loader API_ Loader APIs..getNumBytesFromShortName"></a>
-
-### Loader API: Loader APIs~getNumBytesFromShortName(value) ⇒
-The Dotdot ZCL XML doesn't have a length but it is embedded in the short name,
-we can scrape the value to get the size
-
-TODO: Is this the right thing to do?
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: size in bytes or 0 if the # of bytes could not be determined  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| value | <code>\*</code> | the string value to be scraped |
-
-<a name="module_Loader API_ Loader APIs..prepareAttributes"></a>
-
-### Loader API: Loader APIs~prepareAttributes(attributes, side) ⇒
-Prepare XML attributes for entry into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array containing all data from XML ready to be inserted into the DB.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| attributes | <code>\*</code> | an array of attributes |
-| side | <code>\*</code> | the side the attribute is on either "client" or "server" |
-
-<a name="module_Loader API_ Loader APIs..prepareCommands"></a>
-
-### Loader API: Loader APIs~prepareCommands(commands, side, types) ⇒
-Prepare XML commands for entry into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array containing all data from XML ready to be inserted in to the DB.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| commands | <code>\*</code> | an array of commands |
-| side | <code>\*</code> | the side the command is on either "client" or "server" |
-| types | <code>\*</code> | contained for types, where bitmaps are going to be inserted. |
-
-<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
-
-### Loader API: Loader APIs~prepareCluster(cluster, isExtension, types) ⇒
-Prepare XML cluster for insertion into the database.
-This method can also prepare clusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing all data from XML.  
-
-| Param | Type | Default | Description |
-| --- | --- | --- | --- |
-| cluster | <code>\*</code> |  |  |
-| isExtension | <code>\*</code> | <code>false</code> | if this is an extension or not (there are none in dotdot xml) |
-| types | <code>\*</code> |  | types object into which cluster can put types it might have |
-
-<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
-
-### Loader API: Loader APIs~prepareAtomic(type) ⇒
-Parses xml type into the atomic object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the atomic format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareSubAtomic"></a>
-
-### Loader API: Loader APIs~prepareSubAtomic(type, atomics) ⇒
-Parses xml type into the sub-atomic object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the sub-atomic format in the dotdot xml |
-| atomics | <code>\*</code> | an array of atomic types |
-
-<a name="module_Loader API_ Loader APIs..prepareBitmap"></a>
-
-### Loader API: Loader APIs~prepareBitmap(type, isContained) ⇒
-Parses xml type into the bitmap object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Default | Description |
-| --- | --- | --- | --- |
-| type | <code>\*</code> |  | an xml object which conforms to the bitmap format in the dotdot xml |
-| isContained | <code>\*</code> | <code>false</code> | a boolean indicating if this is coming from a contained tag or not |
-
-<a name="module_Loader API_ Loader APIs..prepareEnum"></a>
-
-### Loader API: Loader APIs~prepareEnum(type) ⇒
-Parses xml type into the enum object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the enum format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
-
-### Loader API: Loader APIs~prepareStruct(type) ⇒
-Parses xml type into the struct object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: object ready for insertion into the DB  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| type | <code>\*</code> | an xml object which conforms to the struct format in the dotdot xml |
-
-<a name="module_Loader API_ Loader APIs..prepareSubAtomicTypes"></a>
-
-### Loader API: Loader APIs~prepareSubAtomicTypes(types)
-Parses array of xml objects that conform to the sub-atomic format in the dotdot xml
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| types | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareTypes"></a>
-
-### Loader API: Loader APIs~prepareTypes(zclTypes, types)
-Parses xml types into the types object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| zclTypes | <code>\*</code> | an array of xml types |
-| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
-
-<a name="module_Loader API_ Loader APIs..prepareAttributeType"></a>
-
-### Loader API: Loader APIs~prepareAttributeType(attribute, types, cluster)
-Parses xml types into the types object for insertion into the DB
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| attribute | <code>\*</code> | an attribute with the type in it |
-| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
-| cluster | <code>\*</code> | the cluster that the attribute belongs to (used presently for uniqueness of the type name) |
-
-<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
-
-### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒
-Preparation step for the device types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: an object containing the prepared device types.  
-
-| Param | Type |
-| --- | --- |
-| deviceType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
-Prepare Data Type Discriminator for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~processDataTypeDiscriminator(db, packageId, zclDataTypes) ⇒
-Processes Data Type Discriminator.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Type Discriminators.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| zclDataTypes | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
-
-### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
-Prepare Data Types for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-| typeMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataType"></a>
-
-### Loader API: Loader APIs~processDataType(db, filePath, packageId, data, dataType) ⇒
-Processes Data Type.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Types into the Data Type table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
-
-### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
-Prepare numbers for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNumber"></a>
-
-### Loader API: Loader APIs~processNumber(db, filePath, packageId, data) ⇒
-Processes Numbers.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted numbers into the number table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareString"></a>
-
-### Loader API: Loader APIs~prepareString(a, dataType) ⇒
-Prepare strings for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processString"></a>
-
-### Loader API: Loader APIs~processString(db, filePath, packageId, data) ⇒
-Processes Strings.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted strings into the String table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmaps"></a>
-
-### Loader API: Loader APIs~prepareEnumsOrBitmaps(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnums"></a>
-
-### Loader API: Loader APIs~processEnums(db, filePath, packageId, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
-
-### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, data) ⇒
-Processes the enum Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enum items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmaps"></a>
-
-### Loader API: Loader APIs~processBitmaps(db, filePath, packageId, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
-
-### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, data) ⇒
-Processes the bitmap fields.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmap fields.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareStruct2"></a>
-
-### Loader API: Loader APIs~prepareStruct2(a, dataType) ⇒
-Prepare structs for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStruct"></a>
-
-### Loader API: Loader APIs~processStruct(db, filePath, packageId, data) ⇒
-Processes the structs.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStructItems"></a>
-
-### Loader API: Loader APIs~processStructItems(db, filePath, packageId, data) ⇒
-Processes the struct Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted struct items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic"></a>
-
-### Loader API: Loader APIs~prepareEnumsOrBitmapsAtomic(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumsFromAtomics"></a>
-
-### Loader API: Loader APIs~processEnumsFromAtomics(db, filePath, packageId, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapsFromAtomics"></a>
-
-### Loader API: Loader APIs~processBitmapsFromAtomics(db, filePath, packageId, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclData"></a>
-
-### Loader API: Loader APIs~loadZclData(db, ctx) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualDotDotFile"></a>
-
-### Loader API: Loader APIs~loadIndividualDotDotFile(db, filePath) ⇒ <code>\*</code>
-TODO This is not supported at this time.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>\*</code> - object w/ following: { packageId: pkgId } or { err: err }  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadToplevelXmlFile"></a>
-
-### Loader API: Loader APIs~loadToplevelXmlFile(db, ctx) ⇒
-Toplevel function that loads the xml library file
-and orchestrates the promise chain.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: a Promise that resolves with the db.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| ctx | <code>\*</code> | Context of loading. |
-
-<a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
-
-### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
-Parses the new XML files. Returns an object containing
-loaded data:
-   clusterIdsLoaded: array of cluster ids that were loaded
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the new XML data is loaded.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| files | <code>\*</code> | 
-| context | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlFeature"></a>
-
-### Loader API: Loader APIs~prepXmlFeature(f) ⇒
-Prepare features from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: feature information  
-
-| Param | Type |
-| --- | --- |
-| f | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlAttribute"></a>
-
-### Loader API: Loader APIs~prepXmlAttribute(a) ⇒
-Prepare attributes from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: attribute information  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlCommand"></a>
-
-### Loader API: Loader APIs~prepXmlCommand(c) ⇒
-Prepare commands from xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: command information  
-
-| Param | Type |
-| --- | --- |
-| c | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepXmlEvent"></a>
-
-### Loader API: Loader APIs~prepXmlEvent(e) ⇒
-Prepare events from xml
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: event information  
-
-| Param | Type |
-| --- | --- |
-| e | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleNewXmlFile"></a>
-
-### Loader API: Loader APIs~parseSingleNewXmlFile(f) ⇒
-Parse xml file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: xml information from file  
-
-| Param | Type |
-| --- | --- |
-| f | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..collectDataFromJsonFile"></a>
-
-### Loader API: Loader APIs~collectDataFromJsonFile(ctx) ⇒
-Promises to read the JSON file and resolve all the data.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved file.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context containing information about the file |
-
-<a name="module_Loader API_ Loader APIs..collectDataFromPropertiesFile"></a>
-
-### Loader API: Loader APIs~collectDataFromPropertiesFile(ctx) ⇒
-Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of resolved files.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| ctx | <code>\*</code> | Context which contains information about the propertiesFiles and data |
-
-<a name="module_Loader API_ Loader APIs..maskToType"></a>
-
-### Loader API: Loader APIs~maskToType(mask) ⇒
-Silabs XML does not carry types with bitmap fields, but dotdot does, so they are in the schema.
-Just to put some data in, we differentiate between "bool" and "enum" types here.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: bool or corresponding enum  
-
-| Param | Type |
-| --- | --- |
-| mask | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
-
-### Loader API: Loader APIs~prepareAtomic(a)
-Prepare atomic to db insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAtomics"></a>
-
-### Loader API: Loader APIs~processAtomics(db, filePath, packageId, data) ⇒
-Processes atomic types for DB insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted bitmaps  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareClusterGlobalAttribute"></a>
-
-### Loader API: Loader APIs~prepareClusterGlobalAttribute(cluster) ⇒
-Prepares global attribute data.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing the data from XML.  
-
-| Param | Type |
-| --- | --- |
-| cluster | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..extractAccessTag"></a>
-
-### Loader API: Loader APIs~extractAccessTag(ac) ⇒
-Extract access information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: access tag information  
-
-| Param | Type |
-| --- | --- |
-| ac | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..extractAccessIntoArray"></a>
-
-### Loader API: Loader APIs~extractAccessIntoArray(xmlElement) ⇒
-Extract list of access information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: array of access information  
-
-| Param | Type |
-| --- | --- |
-| xmlElement | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
-
-### Loader API: Loader APIs~prepareCluster(cluster) ⇒
-Prepare XML cluster for insertion into the database.
-This method can also prepare clusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Object containing all data from XML.  
-
-| Param | Type |
-| --- | --- |
-| cluster | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusters"></a>
-
-### Loader API: Loader APIs~processClusters(db, filePath, packageId, data) ⇒
-Process clusters for insertion into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of cluster insertion.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusterGlobalAttributes"></a>
-
-### Loader API: Loader APIs~processClusterGlobalAttributes(db, filePath, packageId, data) ⇒
-Processes global attributes for insertion into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted data.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processClusterExtensions"></a>
-
-### Loader API: Loader APIs~processClusterExtensions(db, filePath, packageId, data) ⇒
-Cluster Extension contains attributes and commands in a same way as regular cluster,
-and it has an attribute code="0xXYZ" where code is a cluster code.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise to resolve the clusterExtension tags  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processGlobals"></a>
-
-### Loader API: Loader APIs~processGlobals(db, filePath, packageId, data) ⇒
-Processes the globals in the XML files. The `global` tag contains
-attributes and commands in a same way as cluster or clusterExtension
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise to resolve the globals  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareTag"></a>
-
-### Loader API: Loader APIs~prepareTag(tag) ⇒
-Prepare tag object from tag
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: tag information  
-
-| Param | Type |
-| --- | --- |
-| tag | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDefaultAccess"></a>
-
-### Loader API: Loader APIs~processDefaultAccess(db, filePath, packageId, defaultAccessList)
-Process defaultAccess tag in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| defaultAccessList | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAccessControl"></a>
-
-### Loader API: Loader APIs~processAccessControl(db, filePath, packageId, accessControlList)
-Process accessControl tag in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| accessControlList | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processTags"></a>
-
-### Loader API: Loader APIs~processTags(db, filePath, packageId, tags)
-Processes the tags in the XML.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| tags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDomain"></a>
-
-### Loader API: Loader APIs~prepareDomain(domain) ⇒
-Convert domain from XMl to domain for DB.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Domain object for DB.  
-
-| Param | Type |
-| --- | --- |
-| domain | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDomains"></a>
-
-### Loader API: Loader APIs~processDomains(db, filePath, packageId, data) ⇒
-Process domains for insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of database insertion of domains.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
-Prepare Data Type Discriminator for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
-
-### Loader API: Loader APIs~processDataTypeDiscriminator(db, filePath, zclDataTypes) ⇒
-Processes Data Type Discriminator.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Type Discriminators.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| zclDataTypes | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
-
-### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
-Prepare Data Types for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-| typeMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processDataType"></a>
-
-### Loader API: Loader APIs~processDataType(db, filePath, packageId, knownPackages, data, dataType) ⇒
-Processes Data Type.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted Data Types into the Data Type table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
-
-### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
-Prepare numbers for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNumber"></a>
-
-### Loader API: Loader APIs~processNumber(db, filePath, packageId, knownPackages, data) ⇒
-Processes Numbers.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted numbers into the number table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareString"></a>
-
-### Loader API: Loader APIs~prepareString(a, dataType) ⇒
-Prepare strings for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processString"></a>
-
-### Loader API: Loader APIs~processString(db, filePath, packageId, knownPackages, data) ⇒
-Processes Strings.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of inserted strings into the String table.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic"></a>
-
-### Loader API: Loader APIs~prepareEnumOrBitmapAtomic(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumAtomic"></a>
-
-### Loader API: Loader APIs~processEnumAtomic(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmap"></a>
-
-### Loader API: Loader APIs~prepareEnumOrBitmap(a, dataType) ⇒
-Prepare enums or bitmaps for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnum"></a>
-
-### Loader API: Loader APIs~processEnum(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enums.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enums.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
-
-### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, knownPackages, data) ⇒
-Processes the enum Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted enum items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapAtomic"></a>
-
-### Loader API: Loader APIs~processBitmapAtomic(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmap"></a>
-
-### Loader API: Loader APIs~processBitmap(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmaps.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmaps.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
-
-### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, knownPackages, data) ⇒
-Processes the bitmap fields.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted bitmap fields.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
-
-### Loader API: Loader APIs~prepareStruct(a, dataType) ⇒
-Prepare structs for database table insertion.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: An Object  
-
-| Param | Type |
-| --- | --- |
-| a | <code>\*</code> | 
-| dataType | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStruct"></a>
-
-### Loader API: Loader APIs~processStruct(db, filePath, packageId, knownPackages, data) ⇒
-Processes the structs.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processStructItems"></a>
-
-### Loader API: Loader APIs~processStructItems(db, filePath, packageIds, data) ⇒
-Processes the struct Items.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise of inserted struct items.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageIds | <code>\*</code> | 
-| data | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
-
-### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒ <code>Object</code>
-Prepares a device type object by extracting and transforming its properties.
-
-This function takes a device type object and processes its properties to create
-a new object with a specific structure. It handles various properties such as
-device ID, profile ID, domain, name, description, class, scope, and superset.
-Additionally, it processes endpoint compositions and clusters if they exist.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Object</code> - The prepared device type object with transformed properties.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| deviceType | <code>Object</code> | The device type object to be prepared. |
-
-<a name="module_Loader API_ Loader APIs..processDeviceTypes"></a>
-
-### Loader API: Loader APIs~processDeviceTypes(db, filePath, packageId, data, context) ⇒ <code>Promise</code>
-Processes and inserts device types into the database.
-This function logs the number of device types being processed for debugging purposes.
-It maps over the provided data to prepare each device type and then iterates over each prepared device type.
-If a device type has a compositionType, it inserts the endpoint composition into the database,
-retrieves the endpoint composition ID, and then inserts the device composition.
-Finally, it inserts all prepared device types into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise</code> - A promise that resolves after all device types have been inserted into the database.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> | The database connection object. |
-| filePath | <code>string</code> | The file path from which the device types are being processed. |
-| packageId | <code>\*</code> | The package ID associated with the device types. |
-| data | <code>Array</code> | The array of device types to be processed. |
-| context | <code>\*</code> | Additional context that might be required for processing. |
-
-<a name="module_Loader API_ Loader APIs..processReloadDeviceTypes"></a>
-
-### Loader API: Loader APIs~processReloadDeviceTypes() ⇒ <code>Promise</code>
-Processes and reloads device type entities in the database.
-This function is called when a custom xml with device types is reloaded.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise</code> - A promise that resolves after all device types have been reloaded.  
-<a name="module_Loader API_ Loader APIs..processDataTypes"></a>
-
-### Loader API: Loader APIs~processDataTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
-Process promises for loading the data types
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of data types  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processAtomicTypes"></a>
-
-### Loader API: Loader APIs~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
-Processes promises for loading individual tables per data type for
-atomics/baseline types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of atomic/baseline processing.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processNonAtomicTypes"></a>
-
-### Loader API: Loader APIs~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters) ⇒
-Processes promises for loading individual tables per data type for no-atomic
-and inherited types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of non-atomic/inherited data type processing.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-| featureClusters | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processSubItems"></a>
-
-### Loader API: Loader APIs~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems) ⇒
-Processes promises for loading items within a bitmap, struct, and enum data types.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of processing sub items within a bitmap, enum and structs.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| knownPackages | <code>\*</code> | 
-| toplevel | <code>\*</code> | 
-| featureClusters | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processParsedZclData"></a>
-
-### Loader API: Loader APIs~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems) ⇒
-After XML parser is done with the barebones parsing, this function
-branches the individual toplevel tags.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise that resolves when all the subtags are parsed.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| argument | <code>\*</code> | 
-| previouslyKnownPackages | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
-
-### Loader API: Loader APIs~parseSingleZclFile(db, packageId, file, context, collectedStructItems) ⇒
-This function is used for parsing each individual ZCL file at a grouped zcl file package level.
-This should _not_ be used for custom XML addition due to custom xmls potentially relying on existing packges.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: A promise for when the last stage of the loading pipeline finishes.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| file | <code>\*</code> | 
-| context | <code>\*</code> | 
-| collectedStructItems | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist"></a>
-
-### Loader API: Loader APIs~isCrcMismatchOrPackageDoesNotExist(db, packageId, files) ⇒
-Checks if there is a crc mismatch on any xml file. This can be used to
-decide if there is a need to reload all the xml files. Also check if the
-package is not loaded before.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: the status of crc mismatch and whether a package is present in an
-object  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| files | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
-
-### Loader API: Loader APIs~parseZclFiles(db, packageId, zclFiles, context) ⇒
-Promises to iterate over all the XML files and returns an aggregate promise
-that will be resolved when all the XML files are done, or rejected if at least one fails.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves when all the individual promises of each file pass.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| zclFiles | <code>\*</code> | 
-| context | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseManufacturerData"></a>
-
-### Loader API: Loader APIs~parseManufacturerData(db, ctx) ⇒
-Parses the manufacturers xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed manufacturers file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseProfilesData"></a>
-
-### Loader API: Loader APIs~parseProfilesData(db, ctx) ⇒
-Parses the profiles xml.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed profiles file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseFeatureFlags"></a>
-
-### Loader API: Loader APIs~parseFeatureFlags(db, packageId, featureFlags) ⇒
-Inside the `zcl.json` can be a `featureFlags` key, which is
-a general purpose object. It contains keys, that map to objects.
-Each key is a "package option category".
-Key/velues of the object itself, end up in CODE/LABEL combinations.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: array of feature flags  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| featureFlags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseUiOptions"></a>
-
-### Loader API: Loader APIs~parseUiOptions(db, packageId, featureFlags) ⇒
-Inside the `zcl.json` can be a `featureFlags` key, which is
-a general purpose object. It contains keys, that map to objects.
-Each key is a "package option category".
-Key/velues of the object itself, end up in CODE/LABEL combinations.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that loads the uiOptions object into the database.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-| featureFlags | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseOptions"></a>
-
-### Loader API: Loader APIs~parseOptions(db) ⇒
-Parses and loads the text and boolean options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: promise of parsed options  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseTextOptions"></a>
-
-### Loader API: Loader APIs~parseTextOptions(db, pkgRef, textOptions) ⇒
-Parses the text options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed text options.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| textOptions | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseBoolOptions"></a>
-
-### Loader API: Loader APIs~parseBoolOptions(db, pkgRef, booleanCategories) ⇒
-Parses the boolean options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a parsed boolean options.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| booleanCategories | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes"></a>
-
-### Loader API: Loader APIs~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
-Asynchronously parses and inserts attribute access interface attributes into the database.
-This function iterates over the attributeAccessInterfaceAttributes object, processing each cluster
-by mapping its values to a specific structure and then inserting them into the database using
-the insertOptionsKeyValues function.
-
-The main purpose of this function is to store cluster/attribute pairs including global attributes and their cluster pair
-The ATTRIBUTE table has cluster_ref as null for global attributes so this second method was necessary
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: <code>Promise.&lt;void&gt;</code> - A promise that resolves when all attributes have been processed and inserted.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> | The database connection object. |
-| pkgRef | <code>\*</code> | The package reference id for which the attributes are being parsed. |
-| attributeAccessInterfaceAttributes | <code>\*</code> | An object containing the attribute access interface attributes,                                                  structured by cluster. |
-
-<a name="module_Loader API_ Loader APIs..parseDefaults"></a>
-
-### Loader API: Loader APIs~parseDefaults(db, ctx) ⇒
-Parses the default values inside the options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promised of parsed text and bool defaults.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseTextDefaults"></a>
-
-### Loader API: Loader APIs~parseTextDefaults(db, pkgRef, textDefaults) ⇒
-Parse text defaults from default options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array of promises  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| textDefaults | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..parseBoolDefaults"></a>
-
-### Loader API: Loader APIs~parseBoolDefaults(db, pkgRef, booleanCategories) ⇒
-Parse the boolean defaults inside options.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: List of promises  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| pkgRef | <code>\*</code> | 
-| booleanCategories | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualSilabsFile"></a>
-
-### Loader API: Loader APIs~loadIndividualSilabsFile(db, filePath) ⇒
-Parses a single file. This function is used specifically
-for adding a package through an existing ZAP session because of its reliance
-on relating the new XML content to the packages associated with that session.
-e.g. for ClusterExtensions.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of a loaded file.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| filePath | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processCustomZclDeviceType"></a>
-
-### Loader API: Loader APIs~processCustomZclDeviceType(db, ctx) ⇒
-If custom device is supported, then this method creates it.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: context  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclJson"></a>
-
-### Loader API: Loader APIs~loadZclJson(db, metafile) ⇒
-Load ZCL metadata
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of loaded zcl json file  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metafile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclProperties"></a>
-
-### Loader API: Loader APIs~loadZclProperties(db, metafile) ⇒
-Load ZCL metadata
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise of loaded zcl properties file  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metafile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclJsonOrProperties"></a>
-
-### Loader API: Loader APIs~loadZclJsonOrProperties(db, ctx) ⇒
-Toplevel function that loads the toplevel metafile
-and orchestrates the promise chain.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: a Promise that resolves with the db.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| ctx | <code>\*</code> | The context of loading. |
-
-<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
-
-### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
-Records the toplevel package information and resolves into packageId
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| crc | <code>\*</code> | 
-| isTopLevelPackageInSync | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..recordVersion"></a>
-
-### Loader API: Loader APIs~recordVersion(db, ctx)
-Records the version into the database.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| ctx | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
-
-### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
-Retrieve zcl package information
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: package zcl package information  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-| options | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
-
-### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
-Load attribute mapping table if there is multi-protocol information from a json file.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| multiProtcolInfo | <code>\*</code> | 
-| categoryToPackageIdMap | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
-
-### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
-Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Array of loaded packageIds.  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| metadataFile | <code>\*</code> | array of paths |
-
-<a name="module_Loader API_ Loader APIs..loadZcl"></a>
-
-### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
-Loads individual zcl.json metafile.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Context object that contains .db and .packageId  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| metadataFile | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
-
-### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
-Load individual custom XML files.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-
-| Param | Type | Description |
-| --- | --- | --- |
-| db | <code>\*</code> |  |
-| filePath | <code>\*</code> |  |
-| sessionId | <code>\*</code> | Current session within which we're loading this file. |
-
-<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
-
-### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
-Promises to qualify whether zcl file needs to be reloaded.
-If yes, the it will resolve with {filePath, data, packageId}
-If not, then it will resolve with {error}
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise that resolves int he object of data.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| info | <code>\*</code> | 
-| parentPackageId | <code>\*</code> | 
-| isCustom | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
-
-### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
-Promises to perform a post loading step.
-
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: Promise to deal with the post-loading cleanup.  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageId | <code>\*</code> | 
-
-<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
-
-### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
-**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
-**Returns**: data type discriminator map  
-
-| Param | Type |
-| --- | --- |
-| db | <code>\*</code> | 
-| packageIds | <code>\*</code> | 
-
 <a name="module_Loader API_ Loader APIs"></a>
 
 ## Loader API: Loader APIs
@@ -26372,6 +22662,16 @@
     * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
     * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
     * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
+    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
+    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
+    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
+    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
+    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
+    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
+    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
+    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
+    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
+    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
     * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
     * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
     * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
@@ -26443,16 +22743,6 @@
     * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
     * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
     * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
-    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
-    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
-    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
-    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
-    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
-    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
-    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
-    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
-    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
-    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
 
 <a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
 
@@ -27024,6 +23314,140 @@
 | db | <code>\*</code> |  |
 | ctx | <code>\*</code> | Context of loading. |
 
+<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
+
+### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
+Records the toplevel package information and resolves into packageId
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| crc | <code>\*</code> | 
+| isTopLevelPackageInSync | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..recordVersion"></a>
+
+### Loader API: Loader APIs~recordVersion(db, ctx)
+Records the version into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
+
+### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
+Retrieve zcl package information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: package zcl package information  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| options | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
+
+### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
+Load attribute mapping table if there is multi-protocol information from a json file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| multiProtcolInfo | <code>\*</code> | 
+| categoryToPackageIdMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
+
+### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
+Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array of loaded packageIds.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| metadataFile | <code>\*</code> | array of paths |
+
+<a name="module_Loader API_ Loader APIs..loadZcl"></a>
+
+### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
+Loads individual zcl.json metafile.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Context object that contains .db and .packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
+
+### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
+Load individual custom XML files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| filePath | <code>\*</code> |  |
+| sessionId | <code>\*</code> | Current session within which we're loading this file. |
+
+<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
+
+### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
+Promises to qualify whether zcl file needs to be reloaded.
+If yes, the it will resolve with {filePath, data, packageId}
+If not, then it will resolve with {error}
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves int he object of data.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| info | <code>\*</code> | 
+| parentPackageId | <code>\*</code> | 
+| isCustom | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
+
+### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
+Promises to perform a post loading step.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise to deal with the post-loading cleanup.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
+
+### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: data type discriminator map  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageIds | <code>\*</code> | 
+
 <a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
 
 ### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
@@ -28050,6 +24474,707 @@
 | db | <code>\*</code> |  |
 | ctx | <code>\*</code> | The context of loading. |
 
+<a name="module_Loader API_ Loader APIs"></a>
+
+## Loader API: Loader APIs
+This module provides the APIs for new data model loading
+
+
+* [Loader API: Loader APIs](#module_Loader API_ Loader APIs)
+    * [~collectDataFromLibraryXml(ctx)](#module_Loader API_ Loader APIs..collectDataFromLibraryXml) ⇒
+    * [~tagContainsEnum(tag)](#module_Loader API_ Loader APIs..tagContainsEnum) ⇒
+    * [~tagContainsStruct(tag)](#module_Loader API_ Loader APIs..tagContainsStruct) ⇒
+    * [~tagContainsBitmap(tag)](#module_Loader API_ Loader APIs..tagContainsBitmap) ⇒
+    * [~parseSingleZclFile(db, ctx, file)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
+    * [~parseZclFiles(db, ctx)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
+    * [~normalizeHexValue(value)](#module_Loader API_ Loader APIs..normalizeHexValue) ⇒
+    * [~getNumBytesFromShortName(value)](#module_Loader API_ Loader APIs..getNumBytesFromShortName) ⇒
+    * [~prepareAttributes(attributes, side)](#module_Loader API_ Loader APIs..prepareAttributes) ⇒
+    * [~prepareCommands(commands, side, types)](#module_Loader API_ Loader APIs..prepareCommands) ⇒
+    * [~prepareCluster(cluster, isExtension, types)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
+    * [~prepareAtomic(type)](#module_Loader API_ Loader APIs..prepareAtomic) ⇒
+    * [~prepareSubAtomic(type, atomics)](#module_Loader API_ Loader APIs..prepareSubAtomic) ⇒
+    * [~prepareBitmap(type, isContained)](#module_Loader API_ Loader APIs..prepareBitmap) ⇒
+    * [~prepareEnum(type)](#module_Loader API_ Loader APIs..prepareEnum) ⇒
+    * [~prepareStruct(type)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
+    * [~prepareSubAtomicTypes(types)](#module_Loader API_ Loader APIs..prepareSubAtomicTypes)
+    * [~prepareTypes(zclTypes, types)](#module_Loader API_ Loader APIs..prepareTypes)
+    * [~prepareAttributeType(attribute, types, cluster)](#module_Loader API_ Loader APIs..prepareAttributeType)
+    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒
+    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
+    * [~processDataTypeDiscriminator(db, packageId, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
+    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
+    * [~processDataType(db, filePath, packageId, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
+    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
+    * [~processNumber(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
+    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
+    * [~processString(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processString) ⇒
+    * [~prepareEnumsOrBitmaps(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmaps) ⇒
+    * [~processEnums(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnums) ⇒
+    * [~processEnumItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
+    * [~processBitmaps(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmaps) ⇒
+    * [~processBitmapFields(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
+    * [~prepareStruct2(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct2) ⇒
+    * [~processStruct(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
+    * [~processStructItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
+    * [~prepareEnumsOrBitmapsAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic) ⇒
+    * [~processEnumsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumsFromAtomics) ⇒
+    * [~processBitmapsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapsFromAtomics) ⇒
+    * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
+    * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
+    * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
+    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
+    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
+    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
+    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
+    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
+    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
+    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
+    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
+    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
+    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
+    * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
+    * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
+    * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
+    * [~prepXmlCommand(c)](#module_Loader API_ Loader APIs..prepXmlCommand) ⇒
+    * [~prepXmlEvent(e)](#module_Loader API_ Loader APIs..prepXmlEvent) ⇒
+    * [~parseSingleNewXmlFile(f)](#module_Loader API_ Loader APIs..parseSingleNewXmlFile) ⇒
+    * [~collectDataFromJsonFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromJsonFile) ⇒
+    * [~collectDataFromPropertiesFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromPropertiesFile) ⇒
+    * [~maskToType(mask)](#module_Loader API_ Loader APIs..maskToType) ⇒
+    * [~prepareAtomic(a)](#module_Loader API_ Loader APIs..prepareAtomic)
+    * [~processAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processAtomics) ⇒
+    * [~prepareClusterGlobalAttribute(cluster)](#module_Loader API_ Loader APIs..prepareClusterGlobalAttribute) ⇒
+    * [~extractAccessTag(ac)](#module_Loader API_ Loader APIs..extractAccessTag) ⇒
+    * [~extractAccessIntoArray(xmlElement)](#module_Loader API_ Loader APIs..extractAccessIntoArray) ⇒
+    * [~prepareCluster(cluster)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
+    * [~processClusters(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusters) ⇒
+    * [~processClusterGlobalAttributes(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterGlobalAttributes) ⇒
+    * [~processClusterExtensions(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterExtensions) ⇒
+    * [~processGlobals(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processGlobals) ⇒
+    * [~prepareTag(tag)](#module_Loader API_ Loader APIs..prepareTag) ⇒
+    * [~processDefaultAccess(db, filePath, packageId, defaultAccessList)](#module_Loader API_ Loader APIs..processDefaultAccess)
+    * [~processAccessControl(db, filePath, packageId, accessControlList)](#module_Loader API_ Loader APIs..processAccessControl)
+    * [~processTags(db, filePath, packageId, tags)](#module_Loader API_ Loader APIs..processTags)
+    * [~prepareDomain(domain)](#module_Loader API_ Loader APIs..prepareDomain) ⇒
+    * [~processDomains(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processDomains) ⇒
+    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
+    * [~processDataTypeDiscriminator(db, filePath, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
+    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
+    * [~processDataType(db, filePath, packageId, knownPackages, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
+    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
+    * [~processNumber(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
+    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
+    * [~processString(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processString) ⇒
+    * [~prepareEnumOrBitmapAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic) ⇒
+    * [~processEnumAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumAtomic) ⇒
+    * [~prepareEnumOrBitmap(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmap) ⇒
+    * [~processEnum(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnum) ⇒
+    * [~processEnumItems(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
+    * [~processBitmapAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapAtomic) ⇒
+    * [~processBitmap(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmap) ⇒
+    * [~processBitmapFields(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
+    * [~prepareStruct(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
+    * [~processStruct(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
+    * [~processStructItems(db, filePath, packageIds, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
+    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒ <code>Object</code>
+    * [~processDeviceTypes(db, filePath, packageId, data, context)](#module_Loader API_ Loader APIs..processDeviceTypes) ⇒ <code>Promise</code>
+    * [~processReloadDeviceTypes()](#module_Loader API_ Loader APIs..processReloadDeviceTypes) ⇒ <code>Promise</code>
+    * [~processDataTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processDataTypes) ⇒
+    * [~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processAtomicTypes) ⇒
+    * [~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters)](#module_Loader API_ Loader APIs..processNonAtomicTypes) ⇒
+    * [~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems)](#module_Loader API_ Loader APIs..processSubItems) ⇒
+    * [~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems)](#module_Loader API_ Loader APIs..processParsedZclData) ⇒
+    * [~parseSingleZclFile(db, packageId, file, context, collectedStructItems)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
+    * [~isCrcMismatchOrPackageDoesNotExist(db, packageId, files)](#module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist) ⇒
+    * [~parseZclFiles(db, packageId, zclFiles, context)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
+    * [~parseManufacturerData(db, ctx)](#module_Loader API_ Loader APIs..parseManufacturerData) ⇒
+    * [~parseProfilesData(db, ctx)](#module_Loader API_ Loader APIs..parseProfilesData) ⇒
+    * [~parseFeatureFlags(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseFeatureFlags) ⇒
+    * [~parseUiOptions(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseUiOptions) ⇒
+    * [~parseOptions(db)](#module_Loader API_ Loader APIs..parseOptions) ⇒
+    * [~parseTextOptions(db, pkgRef, textOptions)](#module_Loader API_ Loader APIs..parseTextOptions) ⇒
+    * [~parseBoolOptions(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolOptions) ⇒
+    * [~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes)](#module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
+    * [~parseDefaults(db, ctx)](#module_Loader API_ Loader APIs..parseDefaults) ⇒
+    * [~parseTextDefaults(db, pkgRef, textDefaults)](#module_Loader API_ Loader APIs..parseTextDefaults) ⇒
+    * [~parseBoolDefaults(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolDefaults) ⇒
+    * [~loadIndividualSilabsFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualSilabsFile) ⇒
+    * [~processCustomZclDeviceType(db, ctx)](#module_Loader API_ Loader APIs..processCustomZclDeviceType) ⇒
+    * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
+    * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
+    * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
+
+<a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
+
+### Loader API: Loader APIs~collectDataFromLibraryXml(ctx) ⇒
+Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved files.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context which contains information about the metadataFiles and data |
+
+<a name="module_Loader API_ Loader APIs..tagContainsEnum"></a>
+
+### Loader API: Loader APIs~tagContainsEnum(tag) ⇒
+Check if tag contains enum.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..tagContainsStruct"></a>
+
+### Loader API: Loader APIs~tagContainsStruct(tag) ⇒
+Check if tag contains struct.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..tagContainsBitmap"></a>
+
+### Loader API: Loader APIs~tagContainsBitmap(tag) ⇒
+Check if tag contains Bitmap.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
+
+### Loader API: Loader APIs~parseSingleZclFile(db, ctx, file) ⇒
+Parses ZCL xml file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: empty array  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+| file | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
+
+### Loader API: Loader APIs~parseZclFiles(db, ctx) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..normalizeHexValue"></a>
+
+### Loader API: Loader APIs~normalizeHexValue(value) ⇒
+The Dotdot ZCL XML doesn't use the 0x prefix, but it's a nice thing to have and Silabs xml
+does use this so this helper function normalizes the use of hex
+
+TODO: Is this the right thing to do?
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Either the normalized hex string (with the 0x prefix) or the original  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| value | <code>\*</code> | the string value to be normalized |
+
+<a name="module_Loader API_ Loader APIs..getNumBytesFromShortName"></a>
+
+### Loader API: Loader APIs~getNumBytesFromShortName(value) ⇒
+The Dotdot ZCL XML doesn't have a length but it is embedded in the short name,
+we can scrape the value to get the size
+
+TODO: Is this the right thing to do?
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: size in bytes or 0 if the # of bytes could not be determined  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| value | <code>\*</code> | the string value to be scraped |
+
+<a name="module_Loader API_ Loader APIs..prepareAttributes"></a>
+
+### Loader API: Loader APIs~prepareAttributes(attributes, side) ⇒
+Prepare XML attributes for entry into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array containing all data from XML ready to be inserted into the DB.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| attributes | <code>\*</code> | an array of attributes |
+| side | <code>\*</code> | the side the attribute is on either "client" or "server" |
+
+<a name="module_Loader API_ Loader APIs..prepareCommands"></a>
+
+### Loader API: Loader APIs~prepareCommands(commands, side, types) ⇒
+Prepare XML commands for entry into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array containing all data from XML ready to be inserted in to the DB.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| commands | <code>\*</code> | an array of commands |
+| side | <code>\*</code> | the side the command is on either "client" or "server" |
+| types | <code>\*</code> | contained for types, where bitmaps are going to be inserted. |
+
+<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
+
+### Loader API: Loader APIs~prepareCluster(cluster, isExtension, types) ⇒
+Prepare XML cluster for insertion into the database.
+This method can also prepare clusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing all data from XML.  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| cluster | <code>\*</code> |  |  |
+| isExtension | <code>\*</code> | <code>false</code> | if this is an extension or not (there are none in dotdot xml) |
+| types | <code>\*</code> |  | types object into which cluster can put types it might have |
+
+<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
+
+### Loader API: Loader APIs~prepareAtomic(type) ⇒
+Parses xml type into the atomic object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the atomic format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareSubAtomic"></a>
+
+### Loader API: Loader APIs~prepareSubAtomic(type, atomics) ⇒
+Parses xml type into the sub-atomic object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the sub-atomic format in the dotdot xml |
+| atomics | <code>\*</code> | an array of atomic types |
+
+<a name="module_Loader API_ Loader APIs..prepareBitmap"></a>
+
+### Loader API: Loader APIs~prepareBitmap(type, isContained) ⇒
+Parses xml type into the bitmap object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| type | <code>\*</code> |  | an xml object which conforms to the bitmap format in the dotdot xml |
+| isContained | <code>\*</code> | <code>false</code> | a boolean indicating if this is coming from a contained tag or not |
+
+<a name="module_Loader API_ Loader APIs..prepareEnum"></a>
+
+### Loader API: Loader APIs~prepareEnum(type) ⇒
+Parses xml type into the enum object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the enum format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
+
+### Loader API: Loader APIs~prepareStruct(type) ⇒
+Parses xml type into the struct object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the struct format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareSubAtomicTypes"></a>
+
+### Loader API: Loader APIs~prepareSubAtomicTypes(types)
+Parses array of xml objects that conform to the sub-atomic format in the dotdot xml
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| types | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareTypes"></a>
+
+### Loader API: Loader APIs~prepareTypes(zclTypes, types)
+Parses xml types into the types object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| zclTypes | <code>\*</code> | an array of xml types |
+| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
+
+<a name="module_Loader API_ Loader APIs..prepareAttributeType"></a>
+
+### Loader API: Loader APIs~prepareAttributeType(attribute, types, cluster)
+Parses xml types into the types object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| attribute | <code>\*</code> | an attribute with the type in it |
+| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
+| cluster | <code>\*</code> | the cluster that the attribute belongs to (used presently for uniqueness of the type name) |
+
+<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
+
+### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒
+Preparation step for the device types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: an object containing the prepared device types.  
+
+| Param | Type |
+| --- | --- |
+| deviceType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
+Prepare Data Type Discriminator for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~processDataTypeDiscriminator(db, packageId, zclDataTypes) ⇒
+Processes Data Type Discriminator.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Type Discriminators.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| zclDataTypes | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
+
+### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
+Prepare Data Types for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+| typeMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataType"></a>
+
+### Loader API: Loader APIs~processDataType(db, filePath, packageId, data, dataType) ⇒
+Processes Data Type.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Types into the Data Type table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
+
+### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
+Prepare numbers for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNumber"></a>
+
+### Loader API: Loader APIs~processNumber(db, filePath, packageId, data) ⇒
+Processes Numbers.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted numbers into the number table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareString"></a>
+
+### Loader API: Loader APIs~prepareString(a, dataType) ⇒
+Prepare strings for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processString"></a>
+
+### Loader API: Loader APIs~processString(db, filePath, packageId, data) ⇒
+Processes Strings.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted strings into the String table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmaps"></a>
+
+### Loader API: Loader APIs~prepareEnumsOrBitmaps(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnums"></a>
+
+### Loader API: Loader APIs~processEnums(db, filePath, packageId, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
+
+### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, data) ⇒
+Processes the enum Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enum items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmaps"></a>
+
+### Loader API: Loader APIs~processBitmaps(db, filePath, packageId, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
+
+### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, data) ⇒
+Processes the bitmap fields.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmap fields.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareStruct2"></a>
+
+### Loader API: Loader APIs~prepareStruct2(a, dataType) ⇒
+Prepare structs for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStruct"></a>
+
+### Loader API: Loader APIs~processStruct(db, filePath, packageId, data) ⇒
+Processes the structs.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStructItems"></a>
+
+### Loader API: Loader APIs~processStructItems(db, filePath, packageId, data) ⇒
+Processes the struct Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted struct items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic"></a>
+
+### Loader API: Loader APIs~prepareEnumsOrBitmapsAtomic(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumsFromAtomics"></a>
+
+### Loader API: Loader APIs~processEnumsFromAtomics(db, filePath, packageId, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapsFromAtomics"></a>
+
+### Loader API: Loader APIs~processBitmapsFromAtomics(db, filePath, packageId, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclData"></a>
+
+### Loader API: Loader APIs~loadZclData(db, ctx) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualDotDotFile"></a>
+
+### Loader API: Loader APIs~loadIndividualDotDotFile(db, filePath) ⇒ <code>\*</code>
+TODO This is not supported at this time.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>\*</code> - object w/ following: { packageId: pkgId } or { err: err }  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadToplevelXmlFile"></a>
+
+### Loader API: Loader APIs~loadToplevelXmlFile(db, ctx) ⇒
+Toplevel function that loads the xml library file
+and orchestrates the promise chain.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: a Promise that resolves with the db.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| ctx | <code>\*</code> | Context of loading. |
+
 <a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
 
 ### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
@@ -28184,3 +25309,2890 @@
 | db | <code>\*</code> | 
 | packageIds | <code>\*</code> | 
 
+<a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
+
+### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
+Parses the new XML files. Returns an object containing
+loaded data:
+   clusterIdsLoaded: array of cluster ids that were loaded
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the new XML data is loaded.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| files | <code>\*</code> | 
+| context | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlFeature"></a>
+
+### Loader API: Loader APIs~prepXmlFeature(f) ⇒
+Prepare features from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: feature information  
+
+| Param | Type |
+| --- | --- |
+| f | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlAttribute"></a>
+
+### Loader API: Loader APIs~prepXmlAttribute(a) ⇒
+Prepare attributes from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: attribute information  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlCommand"></a>
+
+### Loader API: Loader APIs~prepXmlCommand(c) ⇒
+Prepare commands from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: command information  
+
+| Param | Type |
+| --- | --- |
+| c | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlEvent"></a>
+
+### Loader API: Loader APIs~prepXmlEvent(e) ⇒
+Prepare events from xml
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: event information  
+
+| Param | Type |
+| --- | --- |
+| e | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleNewXmlFile"></a>
+
+### Loader API: Loader APIs~parseSingleNewXmlFile(f) ⇒
+Parse xml file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: xml information from file  
+
+| Param | Type |
+| --- | --- |
+| f | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..collectDataFromJsonFile"></a>
+
+### Loader API: Loader APIs~collectDataFromJsonFile(ctx) ⇒
+Promises to read the JSON file and resolve all the data.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved file.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context containing information about the file |
+
+<a name="module_Loader API_ Loader APIs..collectDataFromPropertiesFile"></a>
+
+### Loader API: Loader APIs~collectDataFromPropertiesFile(ctx) ⇒
+Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved files.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context which contains information about the propertiesFiles and data |
+
+<a name="module_Loader API_ Loader APIs..maskToType"></a>
+
+### Loader API: Loader APIs~maskToType(mask) ⇒
+Silabs XML does not carry types with bitmap fields, but dotdot does, so they are in the schema.
+Just to put some data in, we differentiate between "bool" and "enum" types here.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: bool or corresponding enum  
+
+| Param | Type |
+| --- | --- |
+| mask | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
+
+### Loader API: Loader APIs~prepareAtomic(a)
+Prepare atomic to db insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAtomics"></a>
+
+### Loader API: Loader APIs~processAtomics(db, filePath, packageId, data) ⇒
+Processes atomic types for DB insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted bitmaps  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareClusterGlobalAttribute"></a>
+
+### Loader API: Loader APIs~prepareClusterGlobalAttribute(cluster) ⇒
+Prepares global attribute data.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing the data from XML.  
+
+| Param | Type |
+| --- | --- |
+| cluster | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..extractAccessTag"></a>
+
+### Loader API: Loader APIs~extractAccessTag(ac) ⇒
+Extract access information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: access tag information  
+
+| Param | Type |
+| --- | --- |
+| ac | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..extractAccessIntoArray"></a>
+
+### Loader API: Loader APIs~extractAccessIntoArray(xmlElement) ⇒
+Extract list of access information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: array of access information  
+
+| Param | Type |
+| --- | --- |
+| xmlElement | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
+
+### Loader API: Loader APIs~prepareCluster(cluster) ⇒
+Prepare XML cluster for insertion into the database.
+This method can also prepare clusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing all data from XML.  
+
+| Param | Type |
+| --- | --- |
+| cluster | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusters"></a>
+
+### Loader API: Loader APIs~processClusters(db, filePath, packageId, data) ⇒
+Process clusters for insertion into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of cluster insertion.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusterGlobalAttributes"></a>
+
+### Loader API: Loader APIs~processClusterGlobalAttributes(db, filePath, packageId, data) ⇒
+Processes global attributes for insertion into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted data.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusterExtensions"></a>
+
+### Loader API: Loader APIs~processClusterExtensions(db, filePath, packageId, data) ⇒
+Cluster Extension contains attributes and commands in a same way as regular cluster,
+and it has an attribute code="0xXYZ" where code is a cluster code.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise to resolve the clusterExtension tags  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processGlobals"></a>
+
+### Loader API: Loader APIs~processGlobals(db, filePath, packageId, data) ⇒
+Processes the globals in the XML files. The `global` tag contains
+attributes and commands in a same way as cluster or clusterExtension
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise to resolve the globals  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareTag"></a>
+
+### Loader API: Loader APIs~prepareTag(tag) ⇒
+Prepare tag object from tag
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: tag information  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDefaultAccess"></a>
+
+### Loader API: Loader APIs~processDefaultAccess(db, filePath, packageId, defaultAccessList)
+Process defaultAccess tag in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| defaultAccessList | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAccessControl"></a>
+
+### Loader API: Loader APIs~processAccessControl(db, filePath, packageId, accessControlList)
+Process accessControl tag in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| accessControlList | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processTags"></a>
+
+### Loader API: Loader APIs~processTags(db, filePath, packageId, tags)
+Processes the tags in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| tags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDomain"></a>
+
+### Loader API: Loader APIs~prepareDomain(domain) ⇒
+Convert domain from XMl to domain for DB.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Domain object for DB.  
+
+| Param | Type |
+| --- | --- |
+| domain | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDomains"></a>
+
+### Loader API: Loader APIs~processDomains(db, filePath, packageId, data) ⇒
+Process domains for insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of database insertion of domains.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
+Prepare Data Type Discriminator for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~processDataTypeDiscriminator(db, filePath, zclDataTypes) ⇒
+Processes Data Type Discriminator.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Type Discriminators.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| zclDataTypes | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
+
+### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
+Prepare Data Types for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+| typeMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataType"></a>
+
+### Loader API: Loader APIs~processDataType(db, filePath, packageId, knownPackages, data, dataType) ⇒
+Processes Data Type.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Types into the Data Type table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
+
+### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
+Prepare numbers for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNumber"></a>
+
+### Loader API: Loader APIs~processNumber(db, filePath, packageId, knownPackages, data) ⇒
+Processes Numbers.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted numbers into the number table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareString"></a>
+
+### Loader API: Loader APIs~prepareString(a, dataType) ⇒
+Prepare strings for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processString"></a>
+
+### Loader API: Loader APIs~processString(db, filePath, packageId, knownPackages, data) ⇒
+Processes Strings.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted strings into the String table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic"></a>
+
+### Loader API: Loader APIs~prepareEnumOrBitmapAtomic(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumAtomic"></a>
+
+### Loader API: Loader APIs~processEnumAtomic(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmap"></a>
+
+### Loader API: Loader APIs~prepareEnumOrBitmap(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnum"></a>
+
+### Loader API: Loader APIs~processEnum(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
+
+### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enum Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enum items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapAtomic"></a>
+
+### Loader API: Loader APIs~processBitmapAtomic(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmap"></a>
+
+### Loader API: Loader APIs~processBitmap(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
+
+### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmap fields.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmap fields.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
+
+### Loader API: Loader APIs~prepareStruct(a, dataType) ⇒
+Prepare structs for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStruct"></a>
+
+### Loader API: Loader APIs~processStruct(db, filePath, packageId, knownPackages, data) ⇒
+Processes the structs.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStructItems"></a>
+
+### Loader API: Loader APIs~processStructItems(db, filePath, packageIds, data) ⇒
+Processes the struct Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted struct items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageIds | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
+
+### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒ <code>Object</code>
+Prepares a device type object by extracting and transforming its properties.
+
+This function takes a device type object and processes its properties to create
+a new object with a specific structure. It handles various properties such as
+device ID, profile ID, domain, name, description, class, scope, and superset.
+Additionally, it processes endpoint compositions and clusters if they exist.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Object</code> - The prepared device type object with transformed properties.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| deviceType | <code>Object</code> | The device type object to be prepared. |
+
+<a name="module_Loader API_ Loader APIs..processDeviceTypes"></a>
+
+### Loader API: Loader APIs~processDeviceTypes(db, filePath, packageId, data, context) ⇒ <code>Promise</code>
+Processes and inserts device types into the database.
+This function logs the number of device types being processed for debugging purposes.
+It maps over the provided data to prepare each device type and then iterates over each prepared device type.
+If a device type has a compositionType, it inserts the endpoint composition into the database,
+retrieves the endpoint composition ID, and then inserts the device composition.
+Finally, it inserts all prepared device types into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise</code> - A promise that resolves after all device types have been inserted into the database.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> | The database connection object. |
+| filePath | <code>string</code> | The file path from which the device types are being processed. |
+| packageId | <code>\*</code> | The package ID associated with the device types. |
+| data | <code>Array</code> | The array of device types to be processed. |
+| context | <code>\*</code> | Additional context that might be required for processing. |
+
+<a name="module_Loader API_ Loader APIs..processReloadDeviceTypes"></a>
+
+### Loader API: Loader APIs~processReloadDeviceTypes() ⇒ <code>Promise</code>
+Processes and reloads device type entities in the database.
+This function is called when a custom xml with device types is reloaded.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise</code> - A promise that resolves after all device types have been reloaded.  
+<a name="module_Loader API_ Loader APIs..processDataTypes"></a>
+
+### Loader API: Loader APIs~processDataTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
+Process promises for loading the data types
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of data types  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAtomicTypes"></a>
+
+### Loader API: Loader APIs~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
+Processes promises for loading individual tables per data type for
+atomics/baseline types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of atomic/baseline processing.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNonAtomicTypes"></a>
+
+### Loader API: Loader APIs~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters) ⇒
+Processes promises for loading individual tables per data type for no-atomic
+and inherited types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of non-atomic/inherited data type processing.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+| featureClusters | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processSubItems"></a>
+
+### Loader API: Loader APIs~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems) ⇒
+Processes promises for loading items within a bitmap, struct, and enum data types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of processing sub items within a bitmap, enum and structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+| featureClusters | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processParsedZclData"></a>
+
+### Loader API: Loader APIs~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems) ⇒
+After XML parser is done with the barebones parsing, this function
+branches the individual toplevel tags.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise that resolves when all the subtags are parsed.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| argument | <code>\*</code> | 
+| previouslyKnownPackages | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
+
+### Loader API: Loader APIs~parseSingleZclFile(db, packageId, file, context, collectedStructItems) ⇒
+This function is used for parsing each individual ZCL file at a grouped zcl file package level.
+This should _not_ be used for custom XML addition due to custom xmls potentially relying on existing packges.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise for when the last stage of the loading pipeline finishes.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| file | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist"></a>
+
+### Loader API: Loader APIs~isCrcMismatchOrPackageDoesNotExist(db, packageId, files) ⇒
+Checks if there is a crc mismatch on any xml file. This can be used to
+decide if there is a need to reload all the xml files. Also check if the
+package is not loaded before.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: the status of crc mismatch and whether a package is present in an
+object  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| files | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
+
+### Loader API: Loader APIs~parseZclFiles(db, packageId, zclFiles, context) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| zclFiles | <code>\*</code> | 
+| context | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseManufacturerData"></a>
+
+### Loader API: Loader APIs~parseManufacturerData(db, ctx) ⇒
+Parses the manufacturers xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed manufacturers file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseProfilesData"></a>
+
+### Loader API: Loader APIs~parseProfilesData(db, ctx) ⇒
+Parses the profiles xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed profiles file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseFeatureFlags"></a>
+
+### Loader API: Loader APIs~parseFeatureFlags(db, packageId, featureFlags) ⇒
+Inside the `zcl.json` can be a `featureFlags` key, which is
+a general purpose object. It contains keys, that map to objects.
+Each key is a "package option category".
+Key/velues of the object itself, end up in CODE/LABEL combinations.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: array of feature flags  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| featureFlags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseUiOptions"></a>
+
+### Loader API: Loader APIs~parseUiOptions(db, packageId, featureFlags) ⇒
+Inside the `zcl.json` can be a `featureFlags` key, which is
+a general purpose object. It contains keys, that map to objects.
+Each key is a "package option category".
+Key/velues of the object itself, end up in CODE/LABEL combinations.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that loads the uiOptions object into the database.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| featureFlags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseOptions"></a>
+
+### Loader API: Loader APIs~parseOptions(db) ⇒
+Parses and loads the text and boolean options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise of parsed options  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseTextOptions"></a>
+
+### Loader API: Loader APIs~parseTextOptions(db, pkgRef, textOptions) ⇒
+Parses the text options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed text options.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| textOptions | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseBoolOptions"></a>
+
+### Loader API: Loader APIs~parseBoolOptions(db, pkgRef, booleanCategories) ⇒
+Parses the boolean options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed boolean options.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| booleanCategories | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes"></a>
+
+### Loader API: Loader APIs~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
+Asynchronously parses and inserts attribute access interface attributes into the database.
+This function iterates over the attributeAccessInterfaceAttributes object, processing each cluster
+by mapping its values to a specific structure and then inserting them into the database using
+the insertOptionsKeyValues function.
+
+The main purpose of this function is to store cluster/attribute pairs including global attributes and their cluster pair
+The ATTRIBUTE table has cluster_ref as null for global attributes so this second method was necessary
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise.&lt;void&gt;</code> - A promise that resolves when all attributes have been processed and inserted.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> | The database connection object. |
+| pkgRef | <code>\*</code> | The package reference id for which the attributes are being parsed. |
+| attributeAccessInterfaceAttributes | <code>\*</code> | An object containing the attribute access interface attributes,                                                  structured by cluster. |
+
+<a name="module_Loader API_ Loader APIs..parseDefaults"></a>
+
+### Loader API: Loader APIs~parseDefaults(db, ctx) ⇒
+Parses the default values inside the options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promised of parsed text and bool defaults.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseTextDefaults"></a>
+
+### Loader API: Loader APIs~parseTextDefaults(db, pkgRef, textDefaults) ⇒
+Parse text defaults from default options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array of promises  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| textDefaults | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseBoolDefaults"></a>
+
+### Loader API: Loader APIs~parseBoolDefaults(db, pkgRef, booleanCategories) ⇒
+Parse the boolean defaults inside options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: List of promises  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| booleanCategories | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualSilabsFile"></a>
+
+### Loader API: Loader APIs~loadIndividualSilabsFile(db, filePath) ⇒
+Parses a single file. This function is used specifically
+for adding a package through an existing ZAP session because of its reliance
+on relating the new XML content to the packages associated with that session.
+e.g. for ClusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a loaded file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processCustomZclDeviceType"></a>
+
+### Loader API: Loader APIs~processCustomZclDeviceType(db, ctx) ⇒
+If custom device is supported, then this method creates it.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: context  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclJson"></a>
+
+### Loader API: Loader APIs~loadZclJson(db, metafile) ⇒
+Load ZCL metadata
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of loaded zcl json file  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metafile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclProperties"></a>
+
+### Loader API: Loader APIs~loadZclProperties(db, metafile) ⇒
+Load ZCL metadata
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of loaded zcl properties file  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metafile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclJsonOrProperties"></a>
+
+### Loader API: Loader APIs~loadZclJsonOrProperties(db, ctx) ⇒
+Toplevel function that loads the toplevel metafile
+and orchestrates the promise chain.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: a Promise that resolves with the db.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| ctx | <code>\*</code> | The context of loading. |
+
+<a name="module_Loader API_ Loader APIs"></a>
+
+## Loader API: Loader APIs
+This module provides the APIs for ZCL/Data-Model loading.
+
+
+* [Loader API: Loader APIs](#module_Loader API_ Loader APIs)
+    * [~collectDataFromLibraryXml(ctx)](#module_Loader API_ Loader APIs..collectDataFromLibraryXml) ⇒
+    * [~tagContainsEnum(tag)](#module_Loader API_ Loader APIs..tagContainsEnum) ⇒
+    * [~tagContainsStruct(tag)](#module_Loader API_ Loader APIs..tagContainsStruct) ⇒
+    * [~tagContainsBitmap(tag)](#module_Loader API_ Loader APIs..tagContainsBitmap) ⇒
+    * [~parseSingleZclFile(db, ctx, file)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
+    * [~parseZclFiles(db, ctx)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
+    * [~normalizeHexValue(value)](#module_Loader API_ Loader APIs..normalizeHexValue) ⇒
+    * [~getNumBytesFromShortName(value)](#module_Loader API_ Loader APIs..getNumBytesFromShortName) ⇒
+    * [~prepareAttributes(attributes, side)](#module_Loader API_ Loader APIs..prepareAttributes) ⇒
+    * [~prepareCommands(commands, side, types)](#module_Loader API_ Loader APIs..prepareCommands) ⇒
+    * [~prepareCluster(cluster, isExtension, types)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
+    * [~prepareAtomic(type)](#module_Loader API_ Loader APIs..prepareAtomic) ⇒
+    * [~prepareSubAtomic(type, atomics)](#module_Loader API_ Loader APIs..prepareSubAtomic) ⇒
+    * [~prepareBitmap(type, isContained)](#module_Loader API_ Loader APIs..prepareBitmap) ⇒
+    * [~prepareEnum(type)](#module_Loader API_ Loader APIs..prepareEnum) ⇒
+    * [~prepareStruct(type)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
+    * [~prepareSubAtomicTypes(types)](#module_Loader API_ Loader APIs..prepareSubAtomicTypes)
+    * [~prepareTypes(zclTypes, types)](#module_Loader API_ Loader APIs..prepareTypes)
+    * [~prepareAttributeType(attribute, types, cluster)](#module_Loader API_ Loader APIs..prepareAttributeType)
+    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒
+    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
+    * [~processDataTypeDiscriminator(db, packageId, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
+    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
+    * [~processDataType(db, filePath, packageId, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
+    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
+    * [~processNumber(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
+    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
+    * [~processString(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processString) ⇒
+    * [~prepareEnumsOrBitmaps(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmaps) ⇒
+    * [~processEnums(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnums) ⇒
+    * [~processEnumItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
+    * [~processBitmaps(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmaps) ⇒
+    * [~processBitmapFields(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
+    * [~prepareStruct2(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct2) ⇒
+    * [~processStruct(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
+    * [~processStructItems(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
+    * [~prepareEnumsOrBitmapsAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic) ⇒
+    * [~processEnumsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processEnumsFromAtomics) ⇒
+    * [~processBitmapsFromAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processBitmapsFromAtomics) ⇒
+    * [~loadZclData(db, ctx)](#module_Loader API_ Loader APIs..loadZclData) ⇒
+    * [~loadIndividualDotDotFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualDotDotFile) ⇒ <code>\*</code>
+    * [~loadToplevelXmlFile(db, ctx)](#module_Loader API_ Loader APIs..loadToplevelXmlFile) ⇒
+    * [~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync)](#module_Loader API_ Loader APIs..recordToplevelPackage) ⇒
+    * [~recordVersion(db, ctx)](#module_Loader API_ Loader APIs..recordVersion)
+    * [~loadZclMetaFilesCommon(db, metadataFile, options)](#module_Loader API_ Loader APIs..loadZclMetaFilesCommon) ⇒
+    * [~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)](#module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol)
+    * [~loadZclMetafiles(db, metadataFile)](#module_Loader API_ Loader APIs..loadZclMetafiles) ⇒
+    * [~loadZcl(db, metadataFile)](#module_Loader API_ Loader APIs..loadZcl) ⇒
+    * [~loadIndividualFile(db, filePath, sessionId)](#module_Loader API_ Loader APIs..loadIndividualFile)
+    * [~qualifyZclFile(db, info, parentPackageId, isCustom)](#module_Loader API_ Loader APIs..qualifyZclFile) ⇒
+    * [~processZclPostLoading(db, packageId)](#module_Loader API_ Loader APIs..processZclPostLoading) ⇒
+    * [~getDiscriminatorMap(db, packageIds)](#module_Loader API_ Loader APIs..getDiscriminatorMap) ⇒
+    * [~parseNewXmlFiles(db, packageId, files, context)](#module_Loader API_ Loader APIs..parseNewXmlFiles) ⇒
+    * [~prepXmlFeature(f)](#module_Loader API_ Loader APIs..prepXmlFeature) ⇒
+    * [~prepXmlAttribute(a)](#module_Loader API_ Loader APIs..prepXmlAttribute) ⇒
+    * [~prepXmlCommand(c)](#module_Loader API_ Loader APIs..prepXmlCommand) ⇒
+    * [~prepXmlEvent(e)](#module_Loader API_ Loader APIs..prepXmlEvent) ⇒
+    * [~parseSingleNewXmlFile(f)](#module_Loader API_ Loader APIs..parseSingleNewXmlFile) ⇒
+    * [~collectDataFromJsonFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromJsonFile) ⇒
+    * [~collectDataFromPropertiesFile(ctx)](#module_Loader API_ Loader APIs..collectDataFromPropertiesFile) ⇒
+    * [~maskToType(mask)](#module_Loader API_ Loader APIs..maskToType) ⇒
+    * [~prepareAtomic(a)](#module_Loader API_ Loader APIs..prepareAtomic)
+    * [~processAtomics(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processAtomics) ⇒
+    * [~prepareClusterGlobalAttribute(cluster)](#module_Loader API_ Loader APIs..prepareClusterGlobalAttribute) ⇒
+    * [~extractAccessTag(ac)](#module_Loader API_ Loader APIs..extractAccessTag) ⇒
+    * [~extractAccessIntoArray(xmlElement)](#module_Loader API_ Loader APIs..extractAccessIntoArray) ⇒
+    * [~prepareCluster(cluster)](#module_Loader API_ Loader APIs..prepareCluster) ⇒
+    * [~processClusters(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusters) ⇒
+    * [~processClusterGlobalAttributes(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterGlobalAttributes) ⇒
+    * [~processClusterExtensions(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processClusterExtensions) ⇒
+    * [~processGlobals(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processGlobals) ⇒
+    * [~prepareTag(tag)](#module_Loader API_ Loader APIs..prepareTag) ⇒
+    * [~processDefaultAccess(db, filePath, packageId, defaultAccessList)](#module_Loader API_ Loader APIs..processDefaultAccess)
+    * [~processAccessControl(db, filePath, packageId, accessControlList)](#module_Loader API_ Loader APIs..processAccessControl)
+    * [~processTags(db, filePath, packageId, tags)](#module_Loader API_ Loader APIs..processTags)
+    * [~prepareDomain(domain)](#module_Loader API_ Loader APIs..prepareDomain) ⇒
+    * [~processDomains(db, filePath, packageId, data)](#module_Loader API_ Loader APIs..processDomains) ⇒
+    * [~prepareDataTypeDiscriminator(a)](#module_Loader API_ Loader APIs..prepareDataTypeDiscriminator) ⇒
+    * [~processDataTypeDiscriminator(db, filePath, zclDataTypes)](#module_Loader API_ Loader APIs..processDataTypeDiscriminator) ⇒
+    * [~prepareDataType(a, dataType, typeMap)](#module_Loader API_ Loader APIs..prepareDataType) ⇒
+    * [~processDataType(db, filePath, packageId, knownPackages, data, dataType)](#module_Loader API_ Loader APIs..processDataType) ⇒
+    * [~prepareNumber(a, dataType)](#module_Loader API_ Loader APIs..prepareNumber) ⇒
+    * [~processNumber(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processNumber) ⇒
+    * [~prepareString(a, dataType)](#module_Loader API_ Loader APIs..prepareString) ⇒
+    * [~processString(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processString) ⇒
+    * [~prepareEnumOrBitmapAtomic(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic) ⇒
+    * [~processEnumAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumAtomic) ⇒
+    * [~prepareEnumOrBitmap(a, dataType)](#module_Loader API_ Loader APIs..prepareEnumOrBitmap) ⇒
+    * [~processEnum(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnum) ⇒
+    * [~processEnumItems(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processEnumItems) ⇒
+    * [~processBitmapAtomic(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapAtomic) ⇒
+    * [~processBitmap(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmap) ⇒
+    * [~processBitmapFields(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processBitmapFields) ⇒
+    * [~prepareStruct(a, dataType)](#module_Loader API_ Loader APIs..prepareStruct) ⇒
+    * [~processStruct(db, filePath, packageId, knownPackages, data)](#module_Loader API_ Loader APIs..processStruct) ⇒
+    * [~processStructItems(db, filePath, packageIds, data)](#module_Loader API_ Loader APIs..processStructItems) ⇒
+    * [~prepareDeviceType(deviceType)](#module_Loader API_ Loader APIs..prepareDeviceType) ⇒ <code>Object</code>
+    * [~processDeviceTypes(db, filePath, packageId, data, context)](#module_Loader API_ Loader APIs..processDeviceTypes) ⇒ <code>Promise</code>
+    * [~processReloadDeviceTypes()](#module_Loader API_ Loader APIs..processReloadDeviceTypes) ⇒ <code>Promise</code>
+    * [~processDataTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processDataTypes) ⇒
+    * [~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel)](#module_Loader API_ Loader APIs..processAtomicTypes) ⇒
+    * [~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters)](#module_Loader API_ Loader APIs..processNonAtomicTypes) ⇒
+    * [~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems)](#module_Loader API_ Loader APIs..processSubItems) ⇒
+    * [~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems)](#module_Loader API_ Loader APIs..processParsedZclData) ⇒
+    * [~parseSingleZclFile(db, packageId, file, context, collectedStructItems)](#module_Loader API_ Loader APIs..parseSingleZclFile) ⇒
+    * [~isCrcMismatchOrPackageDoesNotExist(db, packageId, files)](#module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist) ⇒
+    * [~parseZclFiles(db, packageId, zclFiles, context)](#module_Loader API_ Loader APIs..parseZclFiles) ⇒
+    * [~parseManufacturerData(db, ctx)](#module_Loader API_ Loader APIs..parseManufacturerData) ⇒
+    * [~parseProfilesData(db, ctx)](#module_Loader API_ Loader APIs..parseProfilesData) ⇒
+    * [~parseFeatureFlags(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseFeatureFlags) ⇒
+    * [~parseUiOptions(db, packageId, featureFlags)](#module_Loader API_ Loader APIs..parseUiOptions) ⇒
+    * [~parseOptions(db)](#module_Loader API_ Loader APIs..parseOptions) ⇒
+    * [~parseTextOptions(db, pkgRef, textOptions)](#module_Loader API_ Loader APIs..parseTextOptions) ⇒
+    * [~parseBoolOptions(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolOptions) ⇒
+    * [~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes)](#module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
+    * [~parseDefaults(db, ctx)](#module_Loader API_ Loader APIs..parseDefaults) ⇒
+    * [~parseTextDefaults(db, pkgRef, textDefaults)](#module_Loader API_ Loader APIs..parseTextDefaults) ⇒
+    * [~parseBoolDefaults(db, pkgRef, booleanCategories)](#module_Loader API_ Loader APIs..parseBoolDefaults) ⇒
+    * [~loadIndividualSilabsFile(db, filePath)](#module_Loader API_ Loader APIs..loadIndividualSilabsFile) ⇒
+    * [~processCustomZclDeviceType(db, ctx)](#module_Loader API_ Loader APIs..processCustomZclDeviceType) ⇒
+    * [~loadZclJson(db, metafile)](#module_Loader API_ Loader APIs..loadZclJson) ⇒
+    * [~loadZclProperties(db, metafile)](#module_Loader API_ Loader APIs..loadZclProperties) ⇒
+    * [~loadZclJsonOrProperties(db, ctx)](#module_Loader API_ Loader APIs..loadZclJsonOrProperties) ⇒
+
+<a name="module_Loader API_ Loader APIs..collectDataFromLibraryXml"></a>
+
+### Loader API: Loader APIs~collectDataFromLibraryXml(ctx) ⇒
+Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved files.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context which contains information about the metadataFiles and data |
+
+<a name="module_Loader API_ Loader APIs..tagContainsEnum"></a>
+
+### Loader API: Loader APIs~tagContainsEnum(tag) ⇒
+Check if tag contains enum.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..tagContainsStruct"></a>
+
+### Loader API: Loader APIs~tagContainsStruct(tag) ⇒
+Check if tag contains struct.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..tagContainsBitmap"></a>
+
+### Loader API: Loader APIs~tagContainsBitmap(tag) ⇒
+Check if tag contains Bitmap.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: boolean  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
+
+### Loader API: Loader APIs~parseSingleZclFile(db, ctx, file) ⇒
+Parses ZCL xml file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: empty array  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+| file | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
+
+### Loader API: Loader APIs~parseZclFiles(db, ctx) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..normalizeHexValue"></a>
+
+### Loader API: Loader APIs~normalizeHexValue(value) ⇒
+The Dotdot ZCL XML doesn't use the 0x prefix, but it's a nice thing to have and Silabs xml
+does use this so this helper function normalizes the use of hex
+
+TODO: Is this the right thing to do?
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Either the normalized hex string (with the 0x prefix) or the original  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| value | <code>\*</code> | the string value to be normalized |
+
+<a name="module_Loader API_ Loader APIs..getNumBytesFromShortName"></a>
+
+### Loader API: Loader APIs~getNumBytesFromShortName(value) ⇒
+The Dotdot ZCL XML doesn't have a length but it is embedded in the short name,
+we can scrape the value to get the size
+
+TODO: Is this the right thing to do?
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: size in bytes or 0 if the # of bytes could not be determined  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| value | <code>\*</code> | the string value to be scraped |
+
+<a name="module_Loader API_ Loader APIs..prepareAttributes"></a>
+
+### Loader API: Loader APIs~prepareAttributes(attributes, side) ⇒
+Prepare XML attributes for entry into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array containing all data from XML ready to be inserted into the DB.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| attributes | <code>\*</code> | an array of attributes |
+| side | <code>\*</code> | the side the attribute is on either "client" or "server" |
+
+<a name="module_Loader API_ Loader APIs..prepareCommands"></a>
+
+### Loader API: Loader APIs~prepareCommands(commands, side, types) ⇒
+Prepare XML commands for entry into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array containing all data from XML ready to be inserted in to the DB.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| commands | <code>\*</code> | an array of commands |
+| side | <code>\*</code> | the side the command is on either "client" or "server" |
+| types | <code>\*</code> | contained for types, where bitmaps are going to be inserted. |
+
+<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
+
+### Loader API: Loader APIs~prepareCluster(cluster, isExtension, types) ⇒
+Prepare XML cluster for insertion into the database.
+This method can also prepare clusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing all data from XML.  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| cluster | <code>\*</code> |  |  |
+| isExtension | <code>\*</code> | <code>false</code> | if this is an extension or not (there are none in dotdot xml) |
+| types | <code>\*</code> |  | types object into which cluster can put types it might have |
+
+<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
+
+### Loader API: Loader APIs~prepareAtomic(type) ⇒
+Parses xml type into the atomic object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the atomic format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareSubAtomic"></a>
+
+### Loader API: Loader APIs~prepareSubAtomic(type, atomics) ⇒
+Parses xml type into the sub-atomic object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the sub-atomic format in the dotdot xml |
+| atomics | <code>\*</code> | an array of atomic types |
+
+<a name="module_Loader API_ Loader APIs..prepareBitmap"></a>
+
+### Loader API: Loader APIs~prepareBitmap(type, isContained) ⇒
+Parses xml type into the bitmap object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| type | <code>\*</code> |  | an xml object which conforms to the bitmap format in the dotdot xml |
+| isContained | <code>\*</code> | <code>false</code> | a boolean indicating if this is coming from a contained tag or not |
+
+<a name="module_Loader API_ Loader APIs..prepareEnum"></a>
+
+### Loader API: Loader APIs~prepareEnum(type) ⇒
+Parses xml type into the enum object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the enum format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
+
+### Loader API: Loader APIs~prepareStruct(type) ⇒
+Parses xml type into the struct object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: object ready for insertion into the DB  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| type | <code>\*</code> | an xml object which conforms to the struct format in the dotdot xml |
+
+<a name="module_Loader API_ Loader APIs..prepareSubAtomicTypes"></a>
+
+### Loader API: Loader APIs~prepareSubAtomicTypes(types)
+Parses array of xml objects that conform to the sub-atomic format in the dotdot xml
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| types | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareTypes"></a>
+
+### Loader API: Loader APIs~prepareTypes(zclTypes, types)
+Parses xml types into the types object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| zclTypes | <code>\*</code> | an array of xml types |
+| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
+
+<a name="module_Loader API_ Loader APIs..prepareAttributeType"></a>
+
+### Loader API: Loader APIs~prepareAttributeType(attribute, types, cluster)
+Parses xml types into the types object for insertion into the DB
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| attribute | <code>\*</code> | an attribute with the type in it |
+| types | <code>\*</code> | an object which includes arrays for enums, bitmaps etc... |
+| cluster | <code>\*</code> | the cluster that the attribute belongs to (used presently for uniqueness of the type name) |
+
+<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
+
+### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒
+Preparation step for the device types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: an object containing the prepared device types.  
+
+| Param | Type |
+| --- | --- |
+| deviceType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
+Prepare Data Type Discriminator for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~processDataTypeDiscriminator(db, packageId, zclDataTypes) ⇒
+Processes Data Type Discriminator.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Type Discriminators.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| zclDataTypes | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
+
+### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
+Prepare Data Types for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+| typeMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataType"></a>
+
+### Loader API: Loader APIs~processDataType(db, filePath, packageId, data, dataType) ⇒
+Processes Data Type.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Types into the Data Type table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
+
+### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
+Prepare numbers for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNumber"></a>
+
+### Loader API: Loader APIs~processNumber(db, filePath, packageId, data) ⇒
+Processes Numbers.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted numbers into the number table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareString"></a>
+
+### Loader API: Loader APIs~prepareString(a, dataType) ⇒
+Prepare strings for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processString"></a>
+
+### Loader API: Loader APIs~processString(db, filePath, packageId, data) ⇒
+Processes Strings.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted strings into the String table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmaps"></a>
+
+### Loader API: Loader APIs~prepareEnumsOrBitmaps(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnums"></a>
+
+### Loader API: Loader APIs~processEnums(db, filePath, packageId, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
+
+### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, data) ⇒
+Processes the enum Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enum items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmaps"></a>
+
+### Loader API: Loader APIs~processBitmaps(db, filePath, packageId, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
+
+### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, data) ⇒
+Processes the bitmap fields.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmap fields.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareStruct2"></a>
+
+### Loader API: Loader APIs~prepareStruct2(a, dataType) ⇒
+Prepare structs for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStruct"></a>
+
+### Loader API: Loader APIs~processStruct(db, filePath, packageId, data) ⇒
+Processes the structs.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStructItems"></a>
+
+### Loader API: Loader APIs~processStructItems(db, filePath, packageId, data) ⇒
+Processes the struct Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted struct items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumsOrBitmapsAtomic"></a>
+
+### Loader API: Loader APIs~prepareEnumsOrBitmapsAtomic(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumsFromAtomics"></a>
+
+### Loader API: Loader APIs~processEnumsFromAtomics(db, filePath, packageId, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapsFromAtomics"></a>
+
+### Loader API: Loader APIs~processBitmapsFromAtomics(db, filePath, packageId, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclData"></a>
+
+### Loader API: Loader APIs~loadZclData(db, ctx) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualDotDotFile"></a>
+
+### Loader API: Loader APIs~loadIndividualDotDotFile(db, filePath) ⇒ <code>\*</code>
+TODO This is not supported at this time.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>\*</code> - object w/ following: { packageId: pkgId } or { err: err }  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadToplevelXmlFile"></a>
+
+### Loader API: Loader APIs~loadToplevelXmlFile(db, ctx) ⇒
+Toplevel function that loads the xml library file
+and orchestrates the promise chain.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: a Promise that resolves with the db.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| ctx | <code>\*</code> | Context of loading. |
+
+<a name="module_Loader API_ Loader APIs..recordToplevelPackage"></a>
+
+### Loader API: Loader APIs~recordToplevelPackage(db, metadataFile, crc, isTopLevelPackageInSync) ⇒
+Records the toplevel package information and resolves into packageId
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| crc | <code>\*</code> | 
+| isTopLevelPackageInSync | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..recordVersion"></a>
+
+### Loader API: Loader APIs~recordVersion(db, ctx)
+Records the version into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetaFilesCommon"></a>
+
+### Loader API: Loader APIs~loadZclMetaFilesCommon(db, metadataFile, options) ⇒
+Retrieve zcl package information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: package zcl package information  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+| options | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadAttributeMappingForMultiProtocol"></a>
+
+### Loader API: Loader APIs~loadAttributeMappingForMultiProtocol(db, multiProtcolInfo, categoryToPackageIdMap)
+Load attribute mapping table if there is multi-protocol information from a json file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| multiProtcolInfo | <code>\*</code> | 
+| categoryToPackageIdMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclMetafiles"></a>
+
+### Loader API: Loader APIs~loadZclMetafiles(db, metadataFile) ⇒
+Toplevel function that loads the zcl file and passes it off to the correct zcl loader.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array of loaded packageIds.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| metadataFile | <code>\*</code> | array of paths |
+
+<a name="module_Loader API_ Loader APIs..loadZcl"></a>
+
+### Loader API: Loader APIs~loadZcl(db, metadataFile) ⇒
+Loads individual zcl.json metafile.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Context object that contains .db and .packageId  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metadataFile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualFile"></a>
+
+### Loader API: Loader APIs~loadIndividualFile(db, filePath, sessionId)
+Load individual custom XML files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| filePath | <code>\*</code> |  |
+| sessionId | <code>\*</code> | Current session within which we're loading this file. |
+
+<a name="module_Loader API_ Loader APIs..qualifyZclFile"></a>
+
+### Loader API: Loader APIs~qualifyZclFile(db, info, parentPackageId, isCustom) ⇒
+Promises to qualify whether zcl file needs to be reloaded.
+If yes, the it will resolve with {filePath, data, packageId}
+If not, then it will resolve with {error}
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves int he object of data.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| info | <code>\*</code> | 
+| parentPackageId | <code>\*</code> | 
+| isCustom | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processZclPostLoading"></a>
+
+### Loader API: Loader APIs~processZclPostLoading(db, packageId) ⇒
+Promises to perform a post loading step.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise to deal with the post-loading cleanup.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..getDiscriminatorMap"></a>
+
+### Loader API: Loader APIs~getDiscriminatorMap(db, packageIds) ⇒
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: data type discriminator map  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageIds | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseNewXmlFiles"></a>
+
+### Loader API: Loader APIs~parseNewXmlFiles(db, packageId, files, context) ⇒
+Parses the new XML files. Returns an object containing
+loaded data:
+   clusterIdsLoaded: array of cluster ids that were loaded
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the new XML data is loaded.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| files | <code>\*</code> | 
+| context | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlFeature"></a>
+
+### Loader API: Loader APIs~prepXmlFeature(f) ⇒
+Prepare features from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: feature information  
+
+| Param | Type |
+| --- | --- |
+| f | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlAttribute"></a>
+
+### Loader API: Loader APIs~prepXmlAttribute(a) ⇒
+Prepare attributes from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: attribute information  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlCommand"></a>
+
+### Loader API: Loader APIs~prepXmlCommand(c) ⇒
+Prepare commands from xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: command information  
+
+| Param | Type |
+| --- | --- |
+| c | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepXmlEvent"></a>
+
+### Loader API: Loader APIs~prepXmlEvent(e) ⇒
+Prepare events from xml
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: event information  
+
+| Param | Type |
+| --- | --- |
+| e | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleNewXmlFile"></a>
+
+### Loader API: Loader APIs~parseSingleNewXmlFile(f) ⇒
+Parse xml file.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: xml information from file  
+
+| Param | Type |
+| --- | --- |
+| f | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..collectDataFromJsonFile"></a>
+
+### Loader API: Loader APIs~collectDataFromJsonFile(ctx) ⇒
+Promises to read the JSON file and resolve all the data.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved file.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context containing information about the file |
+
+<a name="module_Loader API_ Loader APIs..collectDataFromPropertiesFile"></a>
+
+### Loader API: Loader APIs~collectDataFromPropertiesFile(ctx) ⇒
+Promises to read the properties file, extract all the actual xml files, and resolve with the array of files.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of resolved files.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| ctx | <code>\*</code> | Context which contains information about the propertiesFiles and data |
+
+<a name="module_Loader API_ Loader APIs..maskToType"></a>
+
+### Loader API: Loader APIs~maskToType(mask) ⇒
+Silabs XML does not carry types with bitmap fields, but dotdot does, so they are in the schema.
+Just to put some data in, we differentiate between "bool" and "enum" types here.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: bool or corresponding enum  
+
+| Param | Type |
+| --- | --- |
+| mask | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareAtomic"></a>
+
+### Loader API: Loader APIs~prepareAtomic(a)
+Prepare atomic to db insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAtomics"></a>
+
+### Loader API: Loader APIs~processAtomics(db, filePath, packageId, data) ⇒
+Processes atomic types for DB insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted bitmaps  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareClusterGlobalAttribute"></a>
+
+### Loader API: Loader APIs~prepareClusterGlobalAttribute(cluster) ⇒
+Prepares global attribute data.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing the data from XML.  
+
+| Param | Type |
+| --- | --- |
+| cluster | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..extractAccessTag"></a>
+
+### Loader API: Loader APIs~extractAccessTag(ac) ⇒
+Extract access information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: access tag information  
+
+| Param | Type |
+| --- | --- |
+| ac | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..extractAccessIntoArray"></a>
+
+### Loader API: Loader APIs~extractAccessIntoArray(xmlElement) ⇒
+Extract list of access information
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: array of access information  
+
+| Param | Type |
+| --- | --- |
+| xmlElement | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareCluster"></a>
+
+### Loader API: Loader APIs~prepareCluster(cluster) ⇒
+Prepare XML cluster for insertion into the database.
+This method can also prepare clusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Object containing all data from XML.  
+
+| Param | Type |
+| --- | --- |
+| cluster | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusters"></a>
+
+### Loader API: Loader APIs~processClusters(db, filePath, packageId, data) ⇒
+Process clusters for insertion into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of cluster insertion.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusterGlobalAttributes"></a>
+
+### Loader API: Loader APIs~processClusterGlobalAttributes(db, filePath, packageId, data) ⇒
+Processes global attributes for insertion into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted data.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processClusterExtensions"></a>
+
+### Loader API: Loader APIs~processClusterExtensions(db, filePath, packageId, data) ⇒
+Cluster Extension contains attributes and commands in a same way as regular cluster,
+and it has an attribute code="0xXYZ" where code is a cluster code.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise to resolve the clusterExtension tags  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processGlobals"></a>
+
+### Loader API: Loader APIs~processGlobals(db, filePath, packageId, data) ⇒
+Processes the globals in the XML files. The `global` tag contains
+attributes and commands in a same way as cluster or clusterExtension
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise to resolve the globals  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareTag"></a>
+
+### Loader API: Loader APIs~prepareTag(tag) ⇒
+Prepare tag object from tag
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: tag information  
+
+| Param | Type |
+| --- | --- |
+| tag | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDefaultAccess"></a>
+
+### Loader API: Loader APIs~processDefaultAccess(db, filePath, packageId, defaultAccessList)
+Process defaultAccess tag in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| defaultAccessList | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAccessControl"></a>
+
+### Loader API: Loader APIs~processAccessControl(db, filePath, packageId, accessControlList)
+Process accessControl tag in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| accessControlList | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processTags"></a>
+
+### Loader API: Loader APIs~processTags(db, filePath, packageId, tags)
+Processes the tags in the XML.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| tags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDomain"></a>
+
+### Loader API: Loader APIs~prepareDomain(domain) ⇒
+Convert domain from XMl to domain for DB.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Domain object for DB.  
+
+| Param | Type |
+| --- | --- |
+| domain | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDomains"></a>
+
+### Loader API: Loader APIs~processDomains(db, filePath, packageId, data) ⇒
+Process domains for insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of database insertion of domains.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~prepareDataTypeDiscriminator(a) ⇒
+Prepare Data Type Discriminator for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataTypeDiscriminator"></a>
+
+### Loader API: Loader APIs~processDataTypeDiscriminator(db, filePath, zclDataTypes) ⇒
+Processes Data Type Discriminator.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Type Discriminators.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| zclDataTypes | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDataType"></a>
+
+### Loader API: Loader APIs~prepareDataType(a, dataType, typeMap) ⇒
+Prepare Data Types for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+| typeMap | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processDataType"></a>
+
+### Loader API: Loader APIs~processDataType(db, filePath, packageId, knownPackages, data, dataType) ⇒
+Processes Data Type.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted Data Types into the Data Type table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareNumber"></a>
+
+### Loader API: Loader APIs~prepareNumber(a, dataType) ⇒
+Prepare numbers for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNumber"></a>
+
+### Loader API: Loader APIs~processNumber(db, filePath, packageId, knownPackages, data) ⇒
+Processes Numbers.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted numbers into the number table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareString"></a>
+
+### Loader API: Loader APIs~prepareString(a, dataType) ⇒
+Prepare strings for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processString"></a>
+
+### Loader API: Loader APIs~processString(db, filePath, packageId, knownPackages, data) ⇒
+Processes Strings.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of inserted strings into the String table.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmapAtomic"></a>
+
+### Loader API: Loader APIs~prepareEnumOrBitmapAtomic(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumAtomic"></a>
+
+### Loader API: Loader APIs~processEnumAtomic(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareEnumOrBitmap"></a>
+
+### Loader API: Loader APIs~prepareEnumOrBitmap(a, dataType) ⇒
+Prepare enums or bitmaps for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnum"></a>
+
+### Loader API: Loader APIs~processEnum(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enums.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enums.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processEnumItems"></a>
+
+### Loader API: Loader APIs~processEnumItems(db, filePath, packageId, knownPackages, data) ⇒
+Processes the enum Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted enum items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapAtomic"></a>
+
+### Loader API: Loader APIs~processBitmapAtomic(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmap"></a>
+
+### Loader API: Loader APIs~processBitmap(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmaps.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmaps.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processBitmapFields"></a>
+
+### Loader API: Loader APIs~processBitmapFields(db, filePath, packageId, knownPackages, data) ⇒
+Processes the bitmap fields.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted bitmap fields.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareStruct"></a>
+
+### Loader API: Loader APIs~prepareStruct(a, dataType) ⇒
+Prepare structs for database table insertion.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: An Object  
+
+| Param | Type |
+| --- | --- |
+| a | <code>\*</code> | 
+| dataType | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStruct"></a>
+
+### Loader API: Loader APIs~processStruct(db, filePath, packageId, knownPackages, data) ⇒
+Processes the structs.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processStructItems"></a>
+
+### Loader API: Loader APIs~processStructItems(db, filePath, packageIds, data) ⇒
+Processes the struct Items.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise of inserted struct items.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageIds | <code>\*</code> | 
+| data | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..prepareDeviceType"></a>
+
+### Loader API: Loader APIs~prepareDeviceType(deviceType) ⇒ <code>Object</code>
+Prepares a device type object by extracting and transforming its properties.
+
+This function takes a device type object and processes its properties to create
+a new object with a specific structure. It handles various properties such as
+device ID, profile ID, domain, name, description, class, scope, and superset.
+Additionally, it processes endpoint compositions and clusters if they exist.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Object</code> - The prepared device type object with transformed properties.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| deviceType | <code>Object</code> | The device type object to be prepared. |
+
+<a name="module_Loader API_ Loader APIs..processDeviceTypes"></a>
+
+### Loader API: Loader APIs~processDeviceTypes(db, filePath, packageId, data, context) ⇒ <code>Promise</code>
+Processes and inserts device types into the database.
+This function logs the number of device types being processed for debugging purposes.
+It maps over the provided data to prepare each device type and then iterates over each prepared device type.
+If a device type has a compositionType, it inserts the endpoint composition into the database,
+retrieves the endpoint composition ID, and then inserts the device composition.
+Finally, it inserts all prepared device types into the database.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise</code> - A promise that resolves after all device types have been inserted into the database.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> | The database connection object. |
+| filePath | <code>string</code> | The file path from which the device types are being processed. |
+| packageId | <code>\*</code> | The package ID associated with the device types. |
+| data | <code>Array</code> | The array of device types to be processed. |
+| context | <code>\*</code> | Additional context that might be required for processing. |
+
+<a name="module_Loader API_ Loader APIs..processReloadDeviceTypes"></a>
+
+### Loader API: Loader APIs~processReloadDeviceTypes() ⇒ <code>Promise</code>
+Processes and reloads device type entities in the database.
+This function is called when a custom xml with device types is reloaded.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise</code> - A promise that resolves after all device types have been reloaded.  
+<a name="module_Loader API_ Loader APIs..processDataTypes"></a>
+
+### Loader API: Loader APIs~processDataTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
+Process promises for loading the data types
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of data types  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processAtomicTypes"></a>
+
+### Loader API: Loader APIs~processAtomicTypes(db, filePath, packageId, knownPackages, toplevel) ⇒
+Processes promises for loading individual tables per data type for
+atomics/baseline types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of atomic/baseline processing.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processNonAtomicTypes"></a>
+
+### Loader API: Loader APIs~processNonAtomicTypes(db, filePath, packageId, knownPackages, toplevel, featureClusters) ⇒
+Processes promises for loading individual tables per data type for no-atomic
+and inherited types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of non-atomic/inherited data type processing.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+| featureClusters | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processSubItems"></a>
+
+### Loader API: Loader APIs~processSubItems(db, filePath, packageId, knownPackages, toplevel, featureClusters, context, collectedStructItems) ⇒
+Processes promises for loading items within a bitmap, struct, and enum data types.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of processing sub items within a bitmap, enum and structs.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| knownPackages | <code>\*</code> | 
+| toplevel | <code>\*</code> | 
+| featureClusters | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processParsedZclData"></a>
+
+### Loader API: Loader APIs~processParsedZclData(db, argument, previouslyKnownPackages, context, collectedStructItems) ⇒
+After XML parser is done with the barebones parsing, this function
+branches the individual toplevel tags.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise that resolves when all the subtags are parsed.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| argument | <code>\*</code> | 
+| previouslyKnownPackages | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseSingleZclFile"></a>
+
+### Loader API: Loader APIs~parseSingleZclFile(db, packageId, file, context, collectedStructItems) ⇒
+This function is used for parsing each individual ZCL file at a grouped zcl file package level.
+This should _not_ be used for custom XML addition due to custom xmls potentially relying on existing packges.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: A promise for when the last stage of the loading pipeline finishes.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| file | <code>\*</code> | 
+| context | <code>\*</code> | 
+| collectedStructItems | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..isCrcMismatchOrPackageDoesNotExist"></a>
+
+### Loader API: Loader APIs~isCrcMismatchOrPackageDoesNotExist(db, packageId, files) ⇒
+Checks if there is a crc mismatch on any xml file. This can be used to
+decide if there is a need to reload all the xml files. Also check if the
+package is not loaded before.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: the status of crc mismatch and whether a package is present in an
+object  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| files | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseZclFiles"></a>
+
+### Loader API: Loader APIs~parseZclFiles(db, packageId, zclFiles, context) ⇒
+Promises to iterate over all the XML files and returns an aggregate promise
+that will be resolved when all the XML files are done, or rejected if at least one fails.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that resolves when all the individual promises of each file pass.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| zclFiles | <code>\*</code> | 
+| context | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseManufacturerData"></a>
+
+### Loader API: Loader APIs~parseManufacturerData(db, ctx) ⇒
+Parses the manufacturers xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed manufacturers file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseProfilesData"></a>
+
+### Loader API: Loader APIs~parseProfilesData(db, ctx) ⇒
+Parses the profiles xml.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed profiles file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseFeatureFlags"></a>
+
+### Loader API: Loader APIs~parseFeatureFlags(db, packageId, featureFlags) ⇒
+Inside the `zcl.json` can be a `featureFlags` key, which is
+a general purpose object. It contains keys, that map to objects.
+Each key is a "package option category".
+Key/velues of the object itself, end up in CODE/LABEL combinations.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: array of feature flags  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| featureFlags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseUiOptions"></a>
+
+### Loader API: Loader APIs~parseUiOptions(db, packageId, featureFlags) ⇒
+Inside the `zcl.json` can be a `featureFlags` key, which is
+a general purpose object. It contains keys, that map to objects.
+Each key is a "package option category".
+Key/velues of the object itself, end up in CODE/LABEL combinations.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise that loads the uiOptions object into the database.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| packageId | <code>\*</code> | 
+| featureFlags | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseOptions"></a>
+
+### Loader API: Loader APIs~parseOptions(db) ⇒
+Parses and loads the text and boolean options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: promise of parsed options  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseTextOptions"></a>
+
+### Loader API: Loader APIs~parseTextOptions(db, pkgRef, textOptions) ⇒
+Parses the text options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed text options.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| textOptions | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseBoolOptions"></a>
+
+### Loader API: Loader APIs~parseBoolOptions(db, pkgRef, booleanCategories) ⇒
+Parses the boolean options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a parsed boolean options.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| booleanCategories | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseattributeAccessInterfaceAttributes"></a>
+
+### Loader API: Loader APIs~parseattributeAccessInterfaceAttributes(db, pkgRef, attributeAccessInterfaceAttributes) ⇒ <code>Promise.&lt;void&gt;</code>
+Asynchronously parses and inserts attribute access interface attributes into the database.
+This function iterates over the attributeAccessInterfaceAttributes object, processing each cluster
+by mapping its values to a specific structure and then inserting them into the database using
+the insertOptionsKeyValues function.
+
+The main purpose of this function is to store cluster/attribute pairs including global attributes and their cluster pair
+The ATTRIBUTE table has cluster_ref as null for global attributes so this second method was necessary
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: <code>Promise.&lt;void&gt;</code> - A promise that resolves when all attributes have been processed and inserted.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> | The database connection object. |
+| pkgRef | <code>\*</code> | The package reference id for which the attributes are being parsed. |
+| attributeAccessInterfaceAttributes | <code>\*</code> | An object containing the attribute access interface attributes,                                                  structured by cluster. |
+
+<a name="module_Loader API_ Loader APIs..parseDefaults"></a>
+
+### Loader API: Loader APIs~parseDefaults(db, ctx) ⇒
+Parses the default values inside the options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promised of parsed text and bool defaults.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseTextDefaults"></a>
+
+### Loader API: Loader APIs~parseTextDefaults(db, pkgRef, textDefaults) ⇒
+Parse text defaults from default options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Array of promises  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| textDefaults | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..parseBoolDefaults"></a>
+
+### Loader API: Loader APIs~parseBoolDefaults(db, pkgRef, booleanCategories) ⇒
+Parse the boolean defaults inside options.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: List of promises  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| pkgRef | <code>\*</code> | 
+| booleanCategories | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadIndividualSilabsFile"></a>
+
+### Loader API: Loader APIs~loadIndividualSilabsFile(db, filePath) ⇒
+Parses a single file. This function is used specifically
+for adding a package through an existing ZAP session because of its reliance
+on relating the new XML content to the packages associated with that session.
+e.g. for ClusterExtensions.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of a loaded file.  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| filePath | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..processCustomZclDeviceType"></a>
+
+### Loader API: Loader APIs~processCustomZclDeviceType(db, ctx) ⇒
+If custom device is supported, then this method creates it.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: context  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| ctx | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclJson"></a>
+
+### Loader API: Loader APIs~loadZclJson(db, metafile) ⇒
+Load ZCL metadata
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of loaded zcl json file  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metafile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclProperties"></a>
+
+### Loader API: Loader APIs~loadZclProperties(db, metafile) ⇒
+Load ZCL metadata
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: Promise of loaded zcl properties file  
+
+| Param | Type |
+| --- | --- |
+| db | <code>\*</code> | 
+| metafile | <code>\*</code> | 
+
+<a name="module_Loader API_ Loader APIs..loadZclJsonOrProperties"></a>
+
+### Loader API: Loader APIs~loadZclJsonOrProperties(db, ctx) ⇒
+Toplevel function that loads the toplevel metafile
+and orchestrates the promise chain.
+
+**Kind**: inner method of [<code>Loader API: Loader APIs</code>](#module_Loader API_ Loader APIs)  
+**Returns**: a Promise that resolves with the db.  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| db | <code>\*</code> |  |
+| ctx | <code>\*</code> | The context of loading. |
+
diff --git a/docs/sdk-integration.md b/docs/sdk-integration.md
index 46af240..65417b6 100644
--- a/docs/sdk-integration.md
+++ b/docs/sdk-integration.md
@@ -82,7 +82,7 @@
 
 The _replacement pattern_ inside the output key, comes handy when iterator key is used and defines how each generated file will be named. Replacement patterns are in a format of `{key}` or `{key:modifier}`. The `key` can be any usual key that the iterated object provides. For example, if you iterate over cluster, these can be `code`, `name`, `description`, `define` and all the usual keys that a cluster supports. So if your output contains `{code}` then this pattern will be replaced by the actual cluster code.
 
-The modifier can be one of the following: `hexuppercase`, `hexlowercase`, `tolowercase`, `touppercase`, `tocamelcase`, `touppercamelcase`, `tosnakecase` or `tosnakecaseallcaps`.
+The modifier can be one of the following: `hexuppercase`, `hexlowercase`, `tolowercase`, `touppercase`, `tocamelcase`, `tokensintouppercamelcase`, `tosnakecase` or `tosnakecaseallcaps`.
 
 ## Templates key: options
 
diff --git a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
index 40565e7..fc0bd67 100644
--- a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
+++ b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js
@@ -525,74 +525,14 @@
   return this.count > kGlobalAttributes.length;
 }
 
-// firstLower should be true for asLowerCamelCase, false for asUpperCamelCase.
-function asCamelCase(label, firstLower, preserveAcronyms) {
-  const wordSplitRegexp = / |_|-|\//;
-  let tokens = label.replace(/[+()&]/g, '').split(wordSplitRegexp);
-
-  let str = tokens
-    .map((token, index) => {
-      let isAllUpperCase = token == token.toUpperCase();
-      // PERSONAL is not actually an acronym.
-      let isAcronym = isAllUpperCase && token != 'PERSONAL';
-
-      if (isAcronym && preserveAcronyms) {
-        return token;
-      }
-
-      if (token.length === 0) return token;
-
-      let newToken =
-        index == 0 && firstLower
-          ? token[0].toLowerCase()
-          : token[0].toUpperCase();
-
-      if (!isAllUpperCase) {
-        if (token.length > 1) {
-          newToken += token.substring(1);
-        }
-        return newToken;
-      }
-
-      // If this is an all-upper-case thing not being preserved as an acronym,
-      // then anything beyond the first letter becomes lower-case.
-      if (token.length > 1) {
-        newToken += token.substring(1).toLowerCase();
-      }
-      return newToken;
-    })
-    .join('');
-
-  if (firstLower) {
-    // Check for the case when we're:
-    // 1. A single word (i.e. not matching our word-split regexp).
-    // 2. Starting with multiple capital letters in a row.
-    // 3. But not _all_ capital letters (which we purposefully
-    //    convert to all-lowercase in the don't-preserve-acronyms case).
-    //
-    // and if all those conditions hold, preserve the leading capital letters by
-    // uppercasing the first one, which got lowercased.
-    if (
-      !wordSplitRegexp.test(label) &&
-      label.length > 1 &&
-      label.substring(0, 2).toUpperCase() == label.substring(0, 2) &&
-      label.toUpperCase() != label
-    ) {
-      str = str[0].toUpperCase() + str.substring(1);
-    }
-  }
-
-  return str.replace(/[^A-Za-z0-9_]/g, '');
-}
-
 function asLowerCamelCase(label, options) {
   const preserveAcronyms = options && options.hash.preserveAcronyms;
-  return asCamelCase(label, true, preserveAcronyms);
+  return string.tokensIntoCamelCase(label, true, preserveAcronyms);
 }
 
 function asUpperCamelCase(label, options) {
   const preserveAcronyms = options && options.hash.preserveAcronyms;
-  return asCamelCase(label, false, preserveAcronyms);
+  return string.tokensIntoCamelCase(label, false, preserveAcronyms);
 }
 /**
  * Same as asUpperCamelCase, but with a special case for "RFID".
diff --git a/src-electron/util/string.js b/src-electron/util/string.js
index e573c81..60b9d2f 100644
--- a/src-electron/util/string.js
+++ b/src-electron/util/string.js
@@ -61,6 +61,74 @@
 }
 
 /**
+ * Converts a string into `camelCase` or `CamelCase` by splitting
+ * the string into tokens.
+ *
+ * Differs from `toCamelCase` by different handling of "." inside names,
+ * so that results are always usable as a code-compatible name (e.g.
+ * "Foo 2.5" becomes "Foo25" rather than "Foo2.5").
+ *
+ */
+function tokensIntoCamelCase(label, firstLower, preserveAcronyms) {
+  const wordSplitRegexp = / |_|-|\//
+  let tokens = label.replace(/[+()&]/g, '').split(wordSplitRegexp)
+
+  let str = tokens
+    .map((token, index) => {
+      let isAllUpperCase = token == token.toUpperCase()
+      // PERSONAL is not actually an acronym.
+      let isAcronym = isAllUpperCase && token != 'PERSONAL'
+
+      if (isAcronym && preserveAcronyms) {
+        return token
+      }
+
+      if (token.length === 0) return token
+
+      let newToken =
+        index == 0 && firstLower
+          ? token[0].toLowerCase()
+          : token[0].toUpperCase()
+
+      if (!isAllUpperCase) {
+        if (token.length > 1) {
+          newToken += token.substring(1)
+        }
+        return newToken
+      }
+
+      // If this is an all-upper-case thing not being preserved as an acronym,
+      // then anything beyond the first letter becomes lower-case.
+      if (token.length > 1) {
+        newToken += token.substring(1).toLowerCase()
+      }
+      return newToken
+    })
+    .join('')
+
+  if (firstLower) {
+    // Check for the case when we're:
+    // 1. A single word (i.e. not matching our word-split regexp).
+    // 2. Starting with multiple capital letters in a row.
+    // 3. But not _all_ capital letters (which we purposefully
+    //    convert to all-lowercase in the don't-preserve-acronyms case).
+    //
+    // and if all those conditions hold, preserve the leading capital letters by
+    // uppercasing the first one, which got lowercased.
+    if (
+      !wordSplitRegexp.test(label) &&
+      label.length > 1 &&
+      label.substring(0, 2).toUpperCase() == label.substring(0, 2) &&
+      label.toUpperCase() != label
+    ) {
+      str = str[0].toUpperCase() + str.substring(1)
+    }
+  }
+
+  return str.replace(/[^A-Za-z0-9_]/g, '')
+}
+
+/**
  * Takes a label, and delimits is on camelcasing.
  * For example:
  *    VerySimpleLabel will turn into VERY_SIMPLE_LABEL
@@ -162,6 +230,7 @@
   return ch >= '0' && ch <= '9'
 }
 
+exports.tokensIntoCamelCase = tokensIntoCamelCase
 exports.toCamelCase = toCamelCase
 exports.toCleanSymbol = toCleanSymbol
 exports.toCleanMacro = toCleanMacro
diff --git a/src-electron/util/util.js b/src-electron/util/util.js
index 42b6d04..0c18f79 100644
--- a/src-electron/util/util.js
+++ b/src-electron/util/util.js
@@ -931,10 +931,6 @@
       string.toCamelCase(value.toString())
     )
     out = out.replace(
-      `{${key}:touppercamelcase}`,
-      string.toCamelCase(value.toString(), /* firstLower = */ false)
-    )
-    out = out.replace(
       `{${key}:tosnakecase}`,
       string.toSnakeCase(value.toString())
     )
@@ -942,6 +938,10 @@
       `{${key}:tosnakecaseallcaps}`,
       string.toSnakeCaseAllCaps(value.toString())
     )
+    out = out.replace(
+      `{${key}:tokensintouppercamelcase}`,
+      string.tokensIntoCamelCase(value.toString())
+    )
     // Note: if you add more of these, add the documentation to sdk-integration.md
   }
   return out
diff --git a/test/string.test.js b/test/string.test.js
index 7063970..e727745 100644
--- a/test/string.test.js
+++ b/test/string.test.js
@@ -71,3 +71,37 @@
   },
   timeout.short()
 )
+
+test(
+  'asCamelCase',
+  () => {
+    expect(string.tokensIntoCamelCase('foo')).toEqual('Foo')
+    expect(string.tokensIntoCamelCase('foo', /* firstLower = */ true)).toEqual(
+      'foo'
+    )
+    expect(string.tokensIntoCamelCase('foo bar')).toEqual('FooBar')
+    expect(
+      string.tokensIntoCamelCase('foo bar', /* firstLower = */ true)
+    ).toEqual('fooBar')
+    expect(string.tokensIntoCamelCase('Some 1.2.3 Test')).toEqual('Some123Test')
+    expect(
+      string.tokensIntoCamelCase('Some 1.2.3 Test', /* firstLower = */ true)
+    ).toEqual('some123Test')
+    expect(string.tokensIntoCamelCase('some ACR here')).toEqual('SomeAcrHere')
+    expect(
+      string.tokensIntoCamelCase(
+        'some ACR here',
+        /* firstLower = */ false,
+        /* preserveAcronyms = */ false
+      )
+    ).toEqual('SomeAcrHere')
+    expect(
+      string.tokensIntoCamelCase(
+        'some ACR here',
+        /* firstLower = */ true,
+        /* preserveAcronyms = */ true
+      )
+    ).toEqual('someACRHere')
+  },
+  timeout.short()
+)
diff --git a/test/util.test.js b/test/util.test.js
index aa0c6d2..6d2ddcb 100644
--- a/test/util.test.js
+++ b/test/util.test.js
@@ -47,13 +47,17 @@
     )
     expect(
       util2.patternFormat(
-        '{a:tocamelcase} {b:tosnakecase} {b:tosnakecaseallcaps} {a:touppercamelcase} {b:touppercamelcase}',
+        '{a:tocamelcase} {b:tosnakecase} {b:tosnakecaseallcaps} {a:tokensintouppercamelcase} {c:tokensintouppercamelcase} {d:tokensintouppercamelcase}',
         {
           a: 'some string',
-          b: 'another string'
+          b: 'another string',
+          c: 'PM2.5 Concentration Measurement',
+          d: 'FOO2.5 BAR Baz'
         }
       )
-    ).toEqual('someString another_string ANOTHER_STRING SomeString AnotherString')
+    ).toEqual(
+      'someString another_string ANOTHER_STRING SomeString Pm25ConcentrationMeasurement Foo25BarBaz'
+    )
   },
   timeout.short()
 )