functions/Invoke-Data.ps1

function Invoke-Data {
    [CmdletBinding()]
    [OutputType([PSObject])]
    param
    (
        [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)]
        [psobject]$RawData,
        [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)]
        [string]$OutDir
    )
    begin {
        # Get function definition files.
        $functions = @( Get-ChildItem -Path "$PSScriptRoot\data" -Filter *.ps1 -ErrorAction SilentlyContinue )

        # Dot source the files
        foreach ($import in @($functions)) {
            try {
                . $import.fullname
            }
            catch {
                Write-Error -Message "Failed to import function $($import.fullname): $_"
            }
        }
    }
    process {
        #$OutDirFilePath = "$($OutDir)\metadata_new.json"
        $SplitDirectory = "$($OutDir)\Datamart"
        
        $Msg = "$(" " * 4)Creating new $(($RawData.DatamartNM).ToLower()) object..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg;
        $Data = New-HCEmptyDatamartObject
        
        #region DATAMART
        $Data.ContentId = $RawData.ContentId.ToString()
        $Data.DatamartNM = $RawData.DatamartNM
        $Data.DatamartNoSpacesNM = (Get-CleanFileName -Name $RawData.DatamartNM -RemoveSpace)
        $Data.DataMartTypeDSC = $RawData.DataMartTypeDSC
        $Data.DescriptionTXT = $RawData.DescriptionTXT
        $Data.DestinationDatabaseName = $RawData.DestinationDatabaseName
        $Data.DestinationObjectPrefix = $RawData.DestinationObjectPrefix
        $Data.DestinationSchemaName = $RawData.DestinationSchemaName
        $Data.SamTypeCode = $RawData.SamTypeCode
        $Data.Status = $RawData.Status
        $Data.VersionText = $RawData.VersionText
        $Data.SAMDVersionText<#extension#> = $RawData.SAMDVersionText
        $Data._hcposh<#extension#> = $RawData._hcposh
        #endregion
        
        #region ENTITIES
        foreach ($Entity in $RawData.Tables.GetEnumerator()) {
            $HCEntity = New-HCEmptyEntityObject
            #region GENERAL PROPS
            $HCEntity.ContentId = $Entity.ContentId.ToString()
            $HCEntity.DescriptionTXT = $Entity.DescriptionTXT
            $HCEntity.DatabaseNM = $Entity.DatabaseNM
            $HCEntity.SchemaNM = $Entity.SchemaNM
            $HCEntity.TableNM = $Entity.TableNM
            $HCEntity.TableTypeNM = $Entity.TableTypeNM
            $HCEntity.ViewName = $Entity.ViewName
            $HCEntity.LoadType = $Entity.LoadType
            $HCEntity.LastModifiedTimestamp = $Entity.LastModifiedTimestamp
            $HCEntity.IsPersisted = $Entity.IsPersisted
            $HCEntity.IsPublic = $Entity.IsPublic
            $IsUniversal = $Entity.AttributeValues | Where-Object AttributeName -eq 'IsUniversal'
            if ($IsUniversal) {
                $HCEntity | Add-Member -Type NoteProperty -Name IsUniversal -Value $([System.Convert]::ToBoolean($IsUniversal.TextValue))
            }
            #endregion
            #region PROTECTION PROPS
            $IsProtected = $Entity.AttributeValues | Where-Object AttributeName -eq 'IsProtected'
            if ($IsProtected) {
                #New attributes introduced with CAP 4.0
                $HCEntity | Add-Member -Type NoteProperty -Name IsProtected -Value $([System.Convert]::ToBoolean($IsProtected.TextValue))
            }
            #endregion
            #region FULLYQUALIFIEDNAME PROPS
            $HCFullyQualifiedName = New-HCEmptyFullyQualifiedNameObject
            $HCFullyQualifiedName.Table = "$($Entity.DatabaseNM).$($Entity.SchemaNM).$($Entity.TableNM)"
            $HCFullyQualifiedName.View = "$($Entity.DatabaseNM).$($Entity.SchemaNM).$($Entity.ViewName)"
            $HCEntity.FullyQualifiedNames = $HCFullyQualifiedName
            #endregion
            #region COLUMN PROPS
            foreach ($Column in $Entity.Columns.GetEnumerator()) {
                $HCColumn = New-HCEmptyColumnObject
                $HCColumn.ContentId = $Column.ContentId.ToString()
                $HCColumn.ColumnNM = $Column.ColumnNM
                $HCColumn.DataSensitivityCD = $Column.DataSensitivityCD
                $HCColumn.DataTypeDSC = $Column.DataTypeDSC
                $HCColumn.DescriptionTXT = $Column.DescriptionTXT
                $HCColumn.IsIncrementalColumnValue = $Column.IsIncrementalColumnValue
                $HCColumn.IsSystemColumnValue = $Column.IsSystemColumnValue
                $HCColumn.IsNullableValue = $Column.IsNullableValue
                $HCColumn.IsPrimaryKeyValue = $Column.IsPrimaryKeyValue
                $HCColumn.Ordinal = $Column.Ordinal
                $HCColumn.Status = $Column.Status
                $HCEntity.Columns += $HCColumn
            }
            #endregion
            #region INDEX PROPS
            foreach ($Index in $Entity.Indexes.GetEnumerator()) {
                $HCIndex = New-HCEmptyIndexObject
                $HCIndex.IndexName = $Index.IndexName
                $HCIndex.IndexTypeCode = $Index.IndexTypeCode
                $HCIndex.IsActive = $Index.IsActive
                    
                foreach ($IndexColumn in $Index.IndexColumns.GetEnumerator()) {
                    $HCIndexColumn = New-HCEmptyIndexColumnObject
                    $HCIndexColumn.Ordinal = $IndexColumn.Ordinal
                    $HCIndexColumn.ColumnNM = $IndexColumn.Column.ColumnNM
                    $HCIndexColumn.IsCovering = $IndexColumn.IsCovering
                    $HCIndexColumn.IsDescending = $IndexColumn.IsDescending                        
                    $HCIndex.IndexColumns += $HCIndexColumn
                }
                    
                $HCEntity.Indexes += $HCIndex
            }
            #endregion
            #region BINDING PROPS
            foreach ($Binding in $Entity.FedByBindings.GetEnumerator()) {
                $HCBinding = New-HCEmptyBindingObject
                $HCBinding.ContentId = $Binding.ContentId.ToString()
                $HCBinding.BindingName = $Binding.BindingName
                $HCBinding.BindingNameNoSpaces = (Get-CleanFileName -Name $Binding.BindingName -RemoveSpace)
                $HCBinding.BindingStatus = $Binding.BindingStatus
                $HCBinding.BindingDescription = $Binding.BindingDescription
                $HCBinding.ClassificationCode = $Binding.ClassificationCode
                $HCBinding.GrainName = $Binding.GrainName
                $HCBinding.BindingType = $Binding.GetType().ToString().split('.')[-1]
                switch ($HCBinding.BindingType) {
                    'SqlBinding' { $HCBinding.Script = $Binding.UserDefinedSQL }
                    'RBinding' { $HCBinding.Script = $Binding.Script }
                }
                #New attributes introduced with CAP 4.0
                $IsProtected = $Binding.AttributeValues | Where-Object AttributeName -eq 'IsProtected'
                if ($IsProtected) {
                    $HCBinding | Add-Member -Type NoteProperty -Name IsProtected -Value $([System.Convert]::ToBoolean($IsProtected.TextValue))
                }
                $LoadType = if ($Binding.LoadType) { $Binding.LoadType } else { $HCEntity.LoadType }
                if ($LoadType) {
                    $HCBinding | Add-Member -Type NoteProperty -Name LoadType -Value $LoadType
                        
                    if ($Binding.IncrementalConfigurations) {
                        $HCBinding | Add-Member -Type NoteProperty -Name IncrementalConfigurations -Value @()
                            
                        foreach ($IncrementalConfiguration in $Binding.IncrementalConfigurations.GetEnumerator()) {
                            $HCIncrementalConfiguration = New-HCEmptyIncrementalConfigurationObject
                            $HCIncrementalConfiguration.IncrementalColumnName = $IncrementalConfiguration.IncrementalColumnName
                            $HCIncrementalConfiguration.OverlapNumber = $IncrementalConfiguration.OverlapNumber
                            $HCIncrementalConfiguration.OverlapType = $IncrementalConfiguration.OverlapType
                            $HCIncrementalConfiguration.SourceDatabaseName = $IncrementalConfiguration.SourceDatabaseName
                            $HCIncrementalConfiguration.SourceSchemaName = $IncrementalConfiguration.SourceSchemaName
                            $HCIncrementalConfiguration.SourceTableAlias = $IncrementalConfiguration.SourceTableAlias
                            $HCIncrementalConfiguration.SourceTableName = $IncrementalConfiguration.SourceTableName
                                
                            $HCBinding.IncrementalConfigurations += $HCIncrementalConfiguration
                        }
                    }
                }
                $HCEntity.Bindings += $HCBinding
            }
            #endregion
            #region EXTENSION PROPS
            $ExtensionContentIds = New-HCEmptyExtensionContentIdsObject
            if ($Entity.ParentEntityRelationships.Count -or $Entity.ChildEntityRelationships.Count) {
                $HCEntity | Add-Member -Type NoteProperty -Name IsExtended -Value $true -Force
                $HCEntity | Add-Member -Type NoteProperty -Name ExtensionContentIds -Value $ExtensionContentIds -Force
            }
            if ($Entity.ParentEntityRelationships.Count) {
                $HCEntity.ExtensionContentIds.CoreEntity = $Entity.ContentId.ToString()
                foreach ($Relationship in $Entity.ParentEntityRelationships.GetEnumerator()) {
                    $HCEntity.ExtensionContentIds."$($Relationship.ChildRoleName)" = $Relationship.ChildEntity.ContentId.ToString()
                }
            }
            if ($Entity.ChildEntityRelationships.Count) {
                $HCEntity.ExtensionContentIds."$($Entity.ChildEntityRelationships.ChildRoleName)" = $Entity.ChildEntityRelationships.ChildEntity.ContentId.ToString()
                foreach ($Relationship in $Entity.ChildEntityRelationships.ParentEntity.ParentEntityRelationships.GetEnumerator()) {
                    $HCEntity.ExtensionContentIds."$($Relationship.ChildRoleName)" = $Relationship.ChildEntity.ContentId.ToString()
                    $HCEntity.ExtensionContentIds."$($Relationship.ParentRoleName)" = $Relationship.ParentEntity.ContentId.ToString()
                }
            }
            #endregion
            #region CUSTOM GROUP PROPS
            $HCEntity.EntityGroupNM = $HCEntity.Bindings[0].GrainName #Set the EntityGroupNM to the first Grain name for now // not a perfect solution
            if ($HCEntity.Bindings) {
                $HCEntity.ClassificationCode = $HCEntity.Bindings[0].ClassificationCode #Set the ClassificationCode to the first ClassificationCode for now // not a perfect solution
            }
            if ($Entity.AllowsDataEntry -eq $true) {
                $HCEntity.ClassificationCode = 'DataEntry'
            }
            #endregion

            $Data.Entities += $HCEntity
        }        
        #endregion

        #region Update extension entity classification
        foreach ($Extension in $Data.Entities | Where-Object { ($_.ExtensionContentIds.PsObject.Properties.Value | Measure-Object).Count -eq 3 }) {
            foreach ($property in $Extension.ExtensionContentIds.PsObject.Properties) {
                $Entity = $Data.Entities[$Data.Entities.ContentId.IndexOf($property.Value)];
                $Entity | Add-Member -Type NoteProperty -Name ExtensionTypeNM -Value $property.Name -Force;
                $Entity.ExtensionContentIds = $Extension.ExtensionContentIds;
                if ($property.Name -eq "OverridingExtensionView") {
                    $Entity.ClassificationCode = "OverridingExtensionView";
                }
                elseif ($property.Name -ne "CoreEntity" -and $Entity.ClassificationCode -notmatch "-") {
                    $Entity.ClassificationCode = "$($Entity.ClassificationCode)-Extension"
                }
                foreach ($Binding in $Entity.Bindings) {
                    $Binding.ClassificationCode = $Entity.ClassificationCode;
                }
            }
        }
        #endregion
        
        $Data.MaxLastModifiedTimestamp<#extension#> = ($Data.Entities.LastModifiedTimestamp | Measure-Object -Maximum).Maximum
        $Msg = "$(" " * 8)$(($Data.Entities | Measure-Object).Count) - Entities"; Write-Host $Msg -ForegroundColor White; Write-Verbose $Msg; Write-Log $Msg;
        $Msg = "$(" " * 8)$(($Data.Entities.Bindings | Measure-Object).Count) - Bindings"; Write-Host $Msg -ForegroundColor White; Write-Verbose $Msg; Write-Log $Msg;
        
        #region ADD DATA ENTRY DATA
        if ($RawData.DataEntryData) {
            foreach ($HCEntity in $Data.Entities | Where-Object { $_.ClassificationCode -eq 'DataEntry' }) {
                $DataEntryDataIndex = $RawData.DataEntryData.FullyQualifiedNM.IndexOf($HCEntity.FullyQualifiedNames.View)
                if ($DataEntryDataIndex -ne -1) {
                    #New property added to store a maximum of 300 records for that Data entry entity
                    #@{ FullyQualifiedNM = $Csv.BaseName; Data = Import-Csv -Path $Csv.FullName; Msg = $null }
                    $DataEntryRecordCNT = ($RawData.DataEntryData[$DataEntryDataIndex].Data | Measure-Object).Count
                    if ($DataEntryRecordCNT -gt 300) {
                        $Msg = "Displaying only 300 out of $($DataEntryRecordCNT) records"
                    }
                    else {
                        $Msg = "Displaying $($DataEntryRecordCNT) records"
                    }
                    
                    $DataEntryData = New-Object PSObject
                    $DataEntryData | Add-Member -Type NoteProperty -Name FullyQualifiedNM -Value $RawData.DataEntryData[$DataEntryDataIndex].FullyQualifiedNM
                    $DataEntryData | Add-Member -Type NoteProperty -Name Data -Value ($RawData.DataEntryData[$DataEntryDataIndex].Data | Select-Object -First 300)
                    $DataEntryData | Add-Member -Type NoteProperty -Name Data_All -Value ($RawData.DataEntryData[$DataEntryDataIndex].Data)
                    $DataEntryData | Add-Member -Type NoteProperty -Name Msg -Value $Msg
                    
                    $HCEntity | Add-Member -Type NoteProperty -Name DataEntryData -Value $DataEntryData
                }
            }
        }
        #endregion
        #region PARSE BINDINGS
        $Msg = "$(" " * 4)Parsing tables and columns from sql..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg;
        foreach ($HCEntity in $Data.Entities) {
            foreach ($HCBinding in $HCEntity.Bindings | Where-Object BindingType -eq 'SqlBinding' | Where-Object {-not([String]::IsNullOrEmpty($_.Script))}) {
                #For each SqlBinding that has a Script value:
                
                $SourcedByEntities = $(Invoke-SqlParser -Query $HCBinding.Script -Log $False -SelectStar $False -Brackets $False)
                
                foreach ($SourcedByEntity in $SourcedByEntities | Where-Object { $_.DatabaseNM -and $_.SchemaNM -and $_.TableNM }) {
                    $HCSourcedByEntity = New-HCEmptySourcedByEntityObject
                    #$HCSourcedByEntity.ServerNM = $SourcedByEntity.ServerNM
                    $HCSourcedByEntity.DatabaseNM = $SourcedByEntity.DatabaseNM
                    $HCSourcedByEntity.SchemaNM = $SourcedByEntity.SchemaNM
                    $HCSourcedByEntity.TableNM = $SourcedByEntity.TableNM
                    $HCSourcedByEntity.FullyQualifiedNM = $SourcedByEntity.FullyQualifiedNM
                    $HCSourcedByEntity.AliasNM = $SourcedByEntity.AliasNM
                    $HCSourcedByEntity.BindingCount = 1
                    
                    #if table originated from a system table
                    if ($HCSourcedByEntity.SchemaNM -eq 'CatalystAdmin') {
                        $HCSourcedByEntity.TableOrigin = 'System'
                    }
                    #or if table originated from a local table
                    elseif (($Data.Entities.FullyQualifiedNames.Table -contains $HCSourcedByEntity.FullyQualifiedNM) -or `
                        ($Data.Entities.FullyQualifiedNames.View -contains $HCSourcedByEntity.FullyQualifiedNM)) {
                        $HCSourcedByEntity.TableOrigin = 'Local'
                        $HCSourcedByEntity.SourceContentId = ($Data.Entities | Where-Object { (($_.FullyQualifiedNames.Table -eq $HCSourcedByEntity.FullyQualifiedNM) -or ($_.FullyQualifiedNames.View -eq $HCSourcedByEntity.FullyQualifiedNM)) -and $_.ClassificationCode -ne 'OverridingExtensionView' }).ContentId
                        
                        #if it's a universal entity then it originates outside of this datamart
                        if ($Data.Entities[$Data.Entities.ContentId.IndexOf($HCSourcedByEntity.SourceContentId)].IsUniversal) {
                            $HCSourcedByEntity.TableOrigin = 'External'
                        }
                    }
                    #else table must have originated externally
                    else {
                        $HCSourcedByEntity.TableOrigin = 'External'
                    }
                    
                    foreach ($SourcedByColumn in $SourcedByEntity.Columns) {
                        $HCSourcedByColumn = New-HCEmptySourcedByColumnObject
                        $HCSourcedByColumn.ColumnNM = $SourcedByColumn.ColumnNM
                        $HCSourcedByColumn.FullyQualifiedNM = $SourcedByColumn.FullyQualifiedNM
                        $HCSourcedByColumn.AliasNM = $SourcedByColumn.AliasNM
                        $HCSourcedByColumn.BindingCount = 1
                        
                        $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn
                    }
                    
                    #check for missing alias ie PossibleColumns
                    if ($SourcedByEntity.PossibleColumns) {
                        $HCSourcedByEntity | Add-Member -Type NoteProperty -Name SourcedByPossibleColumns -Value @()
                        foreach ($SourcedByPossibleColumn in $SourcedByEntity.PossibleColumns) {
                            $HCSourcedByPossibleColumn = New-HCEmptySourcedByPossibleColumnObject
                            $HCSourcedByPossibleColumn.ColumnNM = $SourcedByPossibleColumn.ColumnNM
                            $HCSourcedByPossibleColumn.FullyQualifiedNM = "$($HCSourcedByEntity.FullyQualifiedNM).$($HCSourcedByPossibleColumn.ColumnNM)"
                            
                            $HCSourcedByEntity.SourcedByPossibleColumns += $HCSourcedByPossibleColumn
                        }
                    }
                    
                    $HCBinding.SourcedByEntities += $HCSourcedByEntity
                }
            }
            
            #region LEVEL-UP SOURCES (BINDING TO ENTITY)
            $HCEntityGroups = $HCEntity.Bindings.SourcedByEntities | Group-Object -Property FullyQualifiedNM
            foreach ($HCEntityGroup in $HCEntityGroups) {
                $HCSourcedByEntity = New-HCEmptySourcedByEntityObject
                #$HCSourcedByEntity.ServerNM = $HCEntityGroup.Group[0].ServerNM
                $HCSourcedByEntity.DatabaseNM = $HCEntityGroup.Group[0].DatabaseNM
                $HCSourcedByEntity.SchemaNM = $HCEntityGroup.Group[0].SchemaNM
                $HCSourcedByEntity.TableNM = $HCEntityGroup.Group[0].TableNM
                $HCSourcedByEntity.FullyQualifiedNM = $HCEntityGroup.Group[0].FullyQualifiedNM
                $HCSourcedByEntity.TableOrigin = $HCEntityGroup.Group[0].TableOrigin
                $HCSourcedByEntity.SourceContentId = $HCEntityGroup.Group[0].SourceContentId
                $HCSourcedByEntity.BindingCount = ($HCEntityGroup.Group.BindingCount | Measure-Object -Sum).Sum
                $HCSourcedByEntity.PSObject.Properties.Remove('AliasNM')
                
                
                $ColumnGroups = $HCEntityGroup.Group.SourcedByColumns | Group-Object ColumnNM
                foreach ($ColumnGroup in $ColumnGroups) {
                    $HCSourcedByColumn = New-HCEmptySourcedByColumnObject
                    $HCSourcedByColumn.ColumnNM = $ColumnGroup.Group[0].ColumnNM
                    $HCSourcedByColumn.FullyQualifiedNM = $ColumnGroup.Group[0].FullyQualifiedNM
                    $HCSourcedByColumn.BindingCount = ($ColumnGroup.Group.BindingCount | Measure-Object -Sum).Sum
                    $HCSourcedByColumn.PSObject.Properties.Remove('AliasNM')
                    
                    $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn
                }
                $HCEntity.SourcedByEntities += $HCSourcedByEntity
            }
            #endregion
        }
        #endregion
        #region UPDATE EXTENSION ENTITIES
        function Get-Entity ($ContentId) {
            return $Data.Entities[$Data.Entities.ContentId.IndexOf($ContentId)]
        }
        foreach ($HCEntity in $Data.Entities | Where-Object { $_.ExtensionTypeNM -eq 'CoreEntity' }) {
            $ExtensionEntityId = $HCEntity.ExtensionContentIds.ExtensionEntity;
            $ExtensionEntity = Get-Entity($ExtensionEntityId);
            
            $OverridingExtensionViewId = $HCEntity.ExtensionContentIds.OverridingExtensionView;
            $OverridingExtensionView = Get-Entity($OverridingExtensionViewId);
            
            #Add the SourcedByEntities from the OverridingExtensionView to the CoreEntity
            $HCEntity.SourcedByEntities += $OverridingExtensionView.SourcedByEntities | Where-Object { $_.SourceContentId -ne $HCEntity.ContentId };
            
            #Add the Columns from the ExtensionEntity to the CoreEntity
            $ColumnsExt = $ExtensionEntity.Columns | Where-Object { $_.IsSystemColumnValue -eq $false -and $_.IsPrimaryKeyValue -eq $false };
            $MaxOrdinal = ($HCEntity.Columns.Ordinal | Measure-Object -Maximum).Maximum + 1;
            foreach ($ColumnExt in $ColumnsExt | Sort-Object Ordinal) {
                $ColumnExt | Add-Member -Type NoteProperty -Name IsExtended -Value $True;
                $ColumnExt.Ordinal = $MaxOrdinal;
                $MaxOrdinal++;
            }
            $HCEntity.Columns += $ColumnsExt;
            
            #Add the OverridingExtensionView as a property of the CoreEntity
            $HCEntity | Add-Member -Type NoteProperty -Name OverridingExtensionView -Value $OverridingExtensionView;
            
            #Remove the OverridingExtensionView as a true entity
            $Data.Entities = $Data.Entities | Where-Object { $_.ContentId -ne $OverridingExtensionViewId };
            
            #if the CoreEntity is not a public entity, then turn off the extension and overridingextension as being public
            #if (!($HCEntity.IsPublic))
            #{
            # $ExtensionEntity.IsPublic = $false;
            # $OverridingExtensionView.IsPublic = $false;
            #}
        }
        #endregion
        #region UPDATE OVERRIDING VIEW ENTITIES (SEPARATE FROM EXTENSIONS)
        $OverrideList = $Data.Entities | Group-Object -Property { $_.FullyQualifiedNames.View } | Where-Object Count -gt 1
        
        $OverrideObjects = @();
        foreach ($Override in $OverrideList) {
            $OverrideObject = New-Object PSObject
            $OverrideObject | Add-Member -Type NoteProperty -Name OverriddenContentId -Value $Null
            $OverrideObject | Add-Member -Type NoteProperty -Name OverridingContentId -Value $Null
            
            foreach ($Entity in $Override.Group) {
                if ($Entity.IsPersisted) {
                    $OverrideObject.OverriddenContentId = $Entity.ContentId
                }
                else {
                    $OverrideObject.OverridingContentId = $Entity.ContentId
                }
            }
            $OverrideObjects += $OverrideObject;
        }
        foreach ($OverrideObject in $OverrideObjects) {
            $OverriddenEntity = $Data.Entities[$Data.Entities.ContentId.IndexOf($OverrideObject.OverriddenContentId)];
            $OverriddenEntity | Add-Member -Type NoteProperty -Name IsOverridden -Value $True
            $OverriddenEntity.ViewName = $OverriddenEntity.ViewName + 'BASE'
            $OverriddenEntity.FullyQualifiedNames.View = $OverriddenEntity.FullyQualifiedNames.View + 'BASE'
            
            $OverridingEntity = $Data.Entities[$Data.Entities.ContentId.IndexOf($OverrideObject.OverridingContentId)];
            $OverridingEntity | Add-Member -Type NoteProperty -Name DoesOverride -Value $True
        }
        #endregion
        #region LEVEL-UP SOURCES (ENTITY TO DATAMART)
        $DataGroups = $Data.Entities.SourcedByEntities | Group-Object -Property FullyQualifiedNM
        foreach ($DataGroup in $DataGroups) {
            $HCSourcedByEntity = New-HCEmptySourcedByEntityObject
            #$HCSourcedByEntity.ServerNM = $DataGroup.Group[0].ServerNM
            $HCSourcedByEntity.DatabaseNM = $DataGroup.Group[0].DatabaseNM
            $HCSourcedByEntity.SchemaNM = $DataGroup.Group[0].SchemaNM
            $HCSourcedByEntity.TableNM = $DataGroup.Group[0].TableNM
            $HCSourcedByEntity.FullyQualifiedNM = $DataGroup.Group[0].FullyQualifiedNM
            $HCSourcedByEntity.TableOrigin = $DataGroup.Group[0].TableOrigin
            $HCSourcedByEntity.SourceContentId = $DataGroup.Group[0].SourceContentId
            $HCSourcedByEntity.BindingCount = ($DataGroup.Group.BindingCount | Measure-Object -Sum).Sum
            $HCSourcedByEntity.PSObject.Properties.Remove('AliasNM')
            
            
            $ColumnGroups = $DataGroup.Group.SourcedByColumns | Group-Object ColumnNM
            foreach ($ColumnGroup in $ColumnGroups) {
                $HCSourcedByColumn = New-HCEmptySourcedByColumnObject
                $HCSourcedByColumn.ColumnNM = $ColumnGroup.Group[0].ColumnNM
                $HCSourcedByColumn.FullyQualifiedNM = $ColumnGroup.Group[0].FullyQualifiedNM
                $HCSourcedByColumn.BindingCount = ($ColumnGroup.Group.BindingCount | Measure-Object -Sum).Sum
                $HCSourcedByColumn.PSObject.Properties.Remove('AliasNM')
                
                $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn
            }
            $Data.SourcedByEntities += $HCSourcedByEntity
        }
        #endregion
        #region ADD GIT REPO PROPERTIES
        # try {
        # $Msg = "$(" " * 4)Adding git properties..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg;
        # function checkGit {
        # [CmdletBinding()]
        # param ()
        # begin {
        # if (!(Test-Path $((Get-Location).Path + '\.git'))) { throw; }
        # }
        # process {
        # git --version
        # $GitUrl = (git config --local remote.origin.url).Replace(".git", "")
        # $Data | Add-Member -Type NoteProperty -Name Team -Value $(($GitUrl -split "/")[3])
        # $Data | Add-Member -Type NoteProperty -Name Repository -Value $(($GitUrl -split "/")[4])
        # $Data | Add-Member -Type NoteProperty -Name Branch -Value $(git rev-parse --abbrev-ref HEAD)
        # }
        # }
        # checkGit -ErrorAction Stop
        # }
        # catch {
        # $Msg = "$(" " * 8)Git not installed or not inside a git directory -- unable to add git properties"; Write-Host $Msg -ForegroundColor Yellow; Write-Verbose $Msg; Write-Log $Msg 'warning';
        # }
        #endregion
        #region SPLIT OBJECT INTO SMALLER FILES
        if (!$NoSplit) {
            $Msg = "$(" " * 4)Splitting data object into smaller files..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg;
            Split-ObjectToFiles -Data $Data -splitDirectory $SplitDirectory
        }
        #endregion
        
       
        $Msg = "Success!`r`n"; Write-Host $Msg -ForegroundColor Green; Write-Verbose $Msg; Write-Log $Msg;
        $Output = New-Object PSObject
        $Output | Add-Member -Type NoteProperty -Name Data -Value $Data
        $Output | Add-Member -Type NoteProperty -Name Outdir -Value $OutDir
        return $Output
    }
}
# SIG # Begin signature block
# MIIpNQYJKoZIhvcNAQcCoIIpJjCCKSICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAzltoSh0UHigNR
# mCIqGM85mD/16iJR9dGP4pekY78TVqCCDiMwggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wggdrMIIFU6ADAgECAhADsuWQRbq1qj3ect5VAxkgMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjMwNTE2MDAwMDAwWhcNMjYwNTIw
# MjM1OTU5WjBzMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEVMBMGA1UEBxMM
# U291dGggSm9yZGFuMR4wHAYDVQQKExVIZWFsdGggQ2F0YWx5c3QsIEluYy4xHjAc
# BgNVBAMTFUhlYWx0aCBDYXRhbHlzdCwgSW5jLjCCAiIwDQYJKoZIhvcNAQEBBQAD
# ggIPADCCAgoCggIBAObA/ZMm0ngFmqmUW8QpvB5R2WwUIbCHZkoYN3LLelwf6FCX
# NNCZOxBz6CppjoQ4kL1HtQNpENDPMTMxG5/lMTlZvf1mu/mYEYXOddPsgv+QP4bd
# P+9w+NVE4vguFffuBSzQi8KmnrgGgDVLuhTjvN5WlP/AhzHldDNhKtkQh/bzIgrL
# sivSLRo3ow2kVCzJTZYwXudZ/cI2vrNf0jKRQgcC/ao1emvt68RNQJPxDpmd4Eb5
# DOF+jd9w0Sb77/m/ir2rTbVjoLOlPxD9FlGsdB+kyMV45D9hYuD4D1s998j/wDeL
# ezs/sXgrJToXS0Yjpxaul++7GVuLYgBQvB1UAVejXjDuJO2FF7gUeJihWk/OKmaW
# kQTGavOt8/RcOrru1LdJ733fJnMZsmonQPokOdlUADNKBSAEskgRbD3SQ/Y9LKcm
# 8w/hj9L6PSXBF/E/Kaq92SArEjkvYDlsXp7xslKgAxP26pzq7/hn2gro6/jjLUyh
# xt60j8Pm0tjhOdQhCcioRO2zouopusZmPMO6H95T1PEkhd/cEmkywmMqOMVMpAUg
# O796xTvZ4kjOsaQTOKvAEJDjc42EHZd2RWcVUMI41iHpNILkYHSPHe4mVQC8BdZx
# qzGI6ay7U1mEvCYlMYQZwDZ/xYxI7q0YBjQOm5jVuPvAHmlE6pUiWuGz3JKXAgMB
# AAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNV
# HQ4EFgQUaRlF8Nw4+YnDPBwkIaUEjV2a1MowDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwz
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5
# NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx
# Q0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRw
# Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG
# AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0
# dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT
# aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZI
# hvcNAQELBQADggIBABpsvUpsQVtdpqQNUxSC3Ix3qXeJ81vNGS7sXYxlYhvEChJF
# gixfjebMfHZu0YLJ3xIeX7VwW8wyF+9RkI4RnPtkJD2JSmDd2mH4y/gy138EZMHa
# n+XbMeMXcsOTL9cI5zUBw86EGj/xcL5NIj9DDym8DPh9/OZY5L5sGXrO1VjA/mUM
# lnpqpoNZaNsjQ7Gla6K5BC0xIoHxNYTX1uRSjmYkKdnNMTcHqOLcgxwaXzix26Bs
# n1pKO+NMe3DqthjFX0Pe6Z47b3GrjEYT4IoJP0N3H1crDfpm2vlBMwdSrNvr+epH
# VfZqOx8/VwS7VKygkP5Dp4zXyOa3W+11sMQIQ4AS4lER4g1GS/DmrlP2FWYGaaVJ
# YB01y1tWA23V3VM/Z/aeOR3uUE8p6tc5AFu2jNa16l9f5XNp9p5Fx2QzFh6pGqBu
# d0ict3T/vGWZWxzOhWqqp/Xd1oV5lMwW50t9CEKWpHidZXZZUkw2vwLnkZZzpFzs
# +b1HFxPKAvBXcwWO9ZV+FGeDk09ZBy3E4hY9JaF2Z9KiYa8EMzEOtHaHAkynD6Za
# TFhRSAnO3OMixVE/ro6dW7drPYKxKKYf1Y5QXaPU9ijer9ub0gnYDjPqsh3gWolp
# 7vjAE7t5JDE1PQDqCuuUn8FQakB/NJVs3Nt/Xz5ADD7e6h6JADmUr1l2e4agMYIa
# aDCCGmQCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT
# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADsuWQRbq1qj3ect5VAxkgMA0GCWCGSAFl
# AwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB
# gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE
# MSIEIBXI2PmtmPWNVz02vnMzONc9SX362lZUjvkq7rYuDcoqMA0GCSqGSIb3DQEB
# AQUABIICAMjVzFSLYdvH3UA2qQf+pdvAs4DiJb2c1Jksz05DtWtBJkecj3uKSdu/
# krh/KmN60m41bfM3JHlcGVCHgpwGudSyLjuWjhv5lMIiUJFDdOlRxh3sYHxCKP8d
# om9jSfgeFufC/gUluj23Z26HWi+8Zr2vttKRGvyPMKgNiSzHJCxnGDYtgbmL5Y/H
# VbuH0L09fTrQHR11QqOzkRyXj1jJN2BAuzXnMQT70lpC61R5WXPplIYq3QAq7Six
# fp9K/PawuxRkmloK2i1QzS1ThzNp6g+NNu22zW0efWT/qlt+JWobIwzM/2JlGw0e
# dXtfrJX0w2MUs07GNMvU34ymz6CM2nOBJisqhyfPLtMAwZWSZLUOtWGx9+Id/gfp
# rT4QfewKhTdiT/sjbV4jfByeRZ9LrXfEbNULh668mw77OmcGipwD8UJ+PZs5dvww
# JHnqUp7uQNTdVoq29DoBmiJ2QM914ih0HHdK+SVHgv+pO9CbzutdtHc6KVSPMNQI
# 1JPwH3lCtWE11ikcy2qsFuFr8oDHQd3IRWOvk3ALKgPZcOInNCwD7GrrVFf2relr
# yHa3cmHnXDXqIQ3PDceha11I/j703h7yHJIJkvWLg0UpFlhcUTxdIwcs0yVRyBaJ
# XFK8cbed2om9gQY2Le+IlIhxaiEZmUIlVW4qzHeHMHo1983T0T4+oYIXPjCCFzoG
# CisGAQQBgjcDAwExghcqMIIXJgYJKoZIhvcNAQcCoIIXFzCCFxMCAQMxDzANBglg
# hkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEw
# DQYJYIZIAWUDBAIBBQAEIGv2WyN/i3nG1SMHlxZ9g/9t5PoCMyNWxbWrDTUK1w7s
# AhEA4aAx0HMTwpbXu4iv7y6dsRgPMjAyMzA1MTcxNzA5MjZaoIITBzCCBsAwggSo
# oAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UE
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2Vy
# dCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0y
# MjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYD
# VQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIg
# LSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43B
# DZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW
# +3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7Khbn
# UEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd
# 4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtA
# bm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhY
# HTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbv
# BkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EI
# a/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvm
# QaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mN
# ec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XS
# fRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIH
# gDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZ
# MBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2
# mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0f
# BFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
# c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUH
# AQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBY
# BggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG
# 9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV
# +zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMU
# KkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyY
# QfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrS
# BWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue
# 4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5D
# mhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqL
# xksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprV
# wvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpx
# tU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxj
# qCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggau
# MIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAe
# Fw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3Rl
# ZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9Ge
# TKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0
# hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZl
# jZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAsh
# aG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVY
# TXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1
# biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCir
# c0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+
# DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA
# +bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42Pg
# puE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzS
# M7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU
# uhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6
# mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsG
# AQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
# MEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
# cnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3Js
# My5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAE
# GTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1Z
# jsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8d
# B+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVp
# P0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp8
# 76i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2
# nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3
# ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQ
# txMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc
# 4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+Y
# AN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZ
# vAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQr
# H4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsY
# jvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMG
# A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
# IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAw
# MDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln
# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhE
# aWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57
# G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
# k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFh
# mzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463J
# T17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFw
# q1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yh
# Tzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU
# 75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LV
# jHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJ
# bOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8Qg
# UWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IB
# OjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6
# mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/
# BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
# ZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2Vy
# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4
# oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv
# b3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBw
# oL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0
# E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtD
# IeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlU
# sLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFig
# DkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwY
# w02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUG
# A1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQg
# RzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkH
# gD1aMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB
# BDAcBgkqhkiG9w0BCQUxDxcNMjMwNTE3MTcwOTI2WjArBgsqhkiG9w0BCRACDDEc
# MBowGDAWBBTzhyJNhjOCkjWplLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgxONz
# BR273IyxzFvRHaisgUsGM9B+qgWvd5Y+AqSnRGQwNwYLKoZIhvcNAQkQAi8xKDAm
# MCQwIgQgx/ThvjIoiSCr4iY6vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcN
# AQEBBQAEggIASn+3807OGXkWBKRwJOXBvLXGCTOxnFSFdAm04HGGBQPiMb5UmM/b
# Q97h1VMk5SIW7WgypFTSpbEGn880ozO9TwsG5VFhvhLl/EVF3K3gkG5Z/bVWY8tp
# Lh5F3MLQSgEApMw6MOUffQ8vGpuikzWa5Sdkmxt1FsxpCRPPOntQCUUhOy+BJ9J1
# YF++Z+S9yS85LGhaipSv/90j+ZCExgFke0W7EsSVrf4qXM1F0kI5yvWYc1uZZqNZ
# aYNXYYLaMCXnqcq/XapcCdsWwj2rodikC132satDrNm/UiLu8JpHWkqYihBH5GAp
# N0nZimcyiU5EUrSwqxGdjlv6Qs5lbe25/lvKb2HuoutnCjxJoxWUsVL8f520jzeC
# 68xzhMWHI03W8cx363GhOayPwRKZX0lwcbBhAxMWSJe9XH2xffv1doQNWGmcMB10
# l6qpuo7ssv23BkMzuidXvHnFeT9bXF12CJnIcZqumsxCED7Y0cZzpEkzKNEW2hPB
# IE5HcGvuaq5/nQxQH3i+Y1c3UtE/wXl8Hlfr9syklu2M+z6dWhrcdPSZoQLYfPNX
# iYa9Nk/q1lPpgT9TK53K3pF+gGjtWi7q6jT7EDG1qhkrb0+/8yaRLbYOLjKmX/f5
# Y2Ce0t6nNI3knVyoacyl4NV7T8WUuovNeTqVTidTWilVCZNcVt0bVhg=
# SIG # End signature block