StackHCIVM.Autorest/custom/New-AzStackHCIVMVirtualMachine_New.ps1


# ----------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Code generated by Microsoft (R) AutoRest Code Generator.Changes may cause incorrect behavior and will be lost if the code
# is regenerated.
# ----------------------------------------------------------------------------------

<#
.Synopsis
The operation to create or update a virtual machine.
Please note some properties can be set only during virtual machine creation.
.Description
The operation to create or update a virtual machine.
Please note some properties can be set only during virtual machine creation.
 
.Outputs
Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Models.IVirtualMachineInstance
.Notes
COMPLEX PARAMETER PROPERTIES
 
To create the parameters described below, construct a hash table containing the appropriate properties. For information on hash tables, run Get-Help about_Hash_Tables.
 
LINUXCONFIGURATIONSSHPUBLICKEY <IVirtualMachinePropertiesOSProfileLinuxConfigurationSshPublicKeysItem[]>: PublicKeys - The list of SSH public keys used to authenticate with linux based VMs.
  [KeyData <String>]: KeyData - SSH public key certificate used to authenticate with the VM through ssh. The key needs to be at least 2048-bit and in ssh-rsa format. For creating ssh keys, see [Create SSH keys on Linux and Mac for Li nux VMs in Azure](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-linux-mac-create-ssh-keys?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json).
  [Path <String>]: Path - Specifies the full path on the created VM where ssh public key is stored. If the file already exists, the specified key is appended to the file. Example: /home/user/.ssh/authorized_keys
 
NETWORKPROFILENETWORKINTERFACE <IVirtualMachinePropertiesNetworkProfileNetworkInterfacesItem[]>: NetworkInterfaces - list of network interfaces to be attached to the virtual machine
  [Id <String>]: ID - Resource Id of the network interface
 
STORAGEPROFILEDATADISK <IVirtualMachinePropertiesStorageProfileDataDisksItem[]>: adds data disks to the virtual machine
  [Id <String>]: Resource ID of the data disk
 
WINDOWSCONFIGURATIONSSHPUBLICKEY <IVirtualMachinePropertiesOSProfileWindowsConfigurationSshPublicKeysItem[]>: PublicKeys - The list of SSH public keys used to authenticate with linux based VMs.
  [KeyData <String>]: KeyData - SSH public key certificate used to authenticate with the VM through ssh. The key needs to be at least 2048-bit and in ssh-rsa format. For creating ssh keys, see [Create SSH keys on Linux and Mac for Li nux VMs in Azure](https://docs.microsoft.com/azure/virtual-machines/virtual-machines-linux-mac-create-ssh-keys?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json).
  [Path <String>]: Path - Specifies the full path on the created VM where ssh public key is stored. If the file already exists, the specified key is appended to the file. Example: /home/user/.ssh/authorized_keys
.Link
https://learn.microsoft.com/powershell/module/az.stackhcivm/new-azstackhcivmvirtualmachine
#>

function New-AzStackHCIVMVirtualMachine {
  [OutputType([Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Models.IVirtualMachineInstance])]
  [CmdletBinding(PositionalBinding=$false, SupportsShouldProcess, ConfirmImpact='Medium')]
  param(
      [Parameter(Mandatory)]
      [Alias('VirtualMachineName')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Path')]
      [System.String]
      # Name of the virtual machine
      ${Name},
    
      [Parameter(Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Path')]
      [System.String]
      # The name of the resource group.
      # The name is case insensitive.
      ${ResourceGroupName},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Path')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Runtime.DefaultInfo(Script='(Get-AzContext).Subscription.Id')]
      [System.String]
      # The ID of the target subscription.
      ${SubscriptionId},

      [Parameter(Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # The geo-location where the resource lives
      ${Location},

      [Parameter(Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # The name of the extended location.
      ${CustomLocationId},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Int64]
      # Maximum Dynamic Memory
      ${DynamicMemoryMaximumMemoryInMb},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Int64]
      # Minimum Dynamic Memory
      ${DynamicMemoryMinimumMemoryInMb},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Int32]
      # Defines the amount of extra memory that should be reserved for a virtual machine at runtime, as a percentage of the total memory that the virtual machine is thought to need.
      # This only applies to virtual systems with dynamic memory enabled.
      # This property can be in the range of 5 to 2000.
      ${DynamicMemoryTargetBuffer},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Int64]
      # RAM in MB for the virtual machine
      ${VmMemoryInMB},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Int32]
      # Number of processors for the virtual machine
      ${VmProcessor},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.PSArgumentCompleterAttribute("Default", "Standard_A2_v2", "Standard_A4_v2", "Standard_D2s_v3", "Standard_D4s_v3", "Standard_D8s_v3", "Standard_D16s_v3", "Standard_D32s_v3", "Standard_DS2_v2", "Standard_DS3_v2", "Standard_DS4_v2", "Standard_DS5_v2", "Standard_DS13_v2", "Standard_K8S_v1", "Standard_K8S2_v1", "Standard_K8S3_v1", "Standard_K8S4_v1", "Standard_NK6", "Standard_NK12", "Standard_NV6", "Standard_NV12", "Standard_K8S5_v1", "Custom")]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Size of the VM. Can be a Predefined size or Custom. Possible Predefined Sizes include - Custom,Standard_A2_v2,Standard_A4_v2,Standard_D16s_v3,Standard_D2s_v3,Standard_D32s_v3,Standard_D4s_v3,Standard_D8s_v3,Standard_DS13_v2,Standard_DS2_v2,Standard_DS3_v2,Standard_DS4_v2,Standard_DS5_v2,Standard_K8S2_v1,Standard_K8S3_v1,Standard_K8S4_v1,Standard_K8S5_v1,Standard_K8S_v1,Standard_NK12,Standard_NK6,Standard_NV12, StandardNv6

      ${VmSize},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.PSArgumentCompleterAttribute("SystemAssigned")]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # The identity type.
      ${IdentityType},

      [Parameter(ParameterSetName='ByImageId', Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Resource ID of the image to create the VM with.
      ${ImageId}, 

      [Parameter(ParameterSetName='ByImageName',Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Name of the image to create the VM with.
      ${ImageName},

      [Parameter(ParameterSetName='ByImageName')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Resource group of the image to create the VM from.
      ${ImageResourceGroup},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # DisablePasswordAuthentication - whether password authentication should be disabled
      ${DisablePasswordAuthentication},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # Used to indicate whether Arc for Servers agent onboarding should be triggered during the virtual machine creation process. VM Agent is provsioned by default. Please pass -ProvisionVMAgent:$false to disable.
      ${ProvisionVMAgent},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # Indicates whether virtual machine configuration agent should be provisioned on the virtual machine. When this property is not specified, default behavior is to set it to true. VM Config Agent is provisioned by default. Please pass -ProvisionVMConfigAgent:$false to disable.
      ${ProvisionVMConfigAgent},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String[]]
      # NetworkInterfaces - list of network interfaces to be attached to the virtual machine in ARM Id format.
      ${NicId},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String[]]
      # NetworkInterfaces - list of network interfaces to be attached to the virtual machine in name format.
      ${NicName},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # NetworkInterfaces - Resource Group of Network Interfaces.
      ${NicResourceGroup},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String[]]
      # Data Disks - List of data disks to be attached to the virtual machine in id format.
      ${DataDiskId},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String[]]
      # Data Disks - List of data disks to be attached to the virtual machine in name format .
      ${DataDiskName},

      [Parameter()]
      [AllowEmptyCollection()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Data Disks - Resource Group of Data Disks.
      ${DataDiskResourceGroup},

      [Parameter(ParameterSetName='ByOsDiskId',Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Resource ID of the OS disk
      ${OSDiskId},

      [Parameter(ParameterSetName='ByOsDiskName',Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Name of the OS disk
      ${OSDiskName},

      [Parameter(ParameterSetName='ByOsDiskName')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Resource Group of the OS disk
      ${OSDiskResourceGroup},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # AdminPassword - admin password
      ${AdminPassword},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # AdminUsername - admin username
      ${AdminUsername},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # ComputerName - name of the computer
      ${ComputerName},

      [Parameter(Mandatory)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.PSArgumentCompleterAttribute("Windows", "Linux")]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # OsType - string specifying whether the OS is Linux or Windows
      ${OsType},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # Used to indicate whether or not to enable TPM
      ${EnableTpm},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String[]]
      # PublicKeys - The list of SSH public keys used to authenticate with VMs
      ${SshPublicKey},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Id of the storage container that hosts the VM configuration file
      ${StoragePathId},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Name of the storage container that hosts the VM configuration file
      ${StoragePathName},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # Storage Container resource group. The resource group of the virtual machine will be used if this value is not provided.
      ${StoragePathResourceGroup},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # Specifies whether secure boot should be enabled on the virtual machine.
      ${SecureBootEnabled},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.Management.Automation.SwitchParameter]
      # Specifies Whether to EnableAutomaticUpdates on the machine.
      ${EnableAutomaticUpdate},

      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Body')]
      [System.String]
      # TimeZone for the virtual machine
      ${TimeZone},

      [Parameter()]
      [Alias('AzureRMContext', 'AzureCredential')]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Azure')]
      [System.Management.Automation.PSObject]
      # The credentials, account, tenant, and subscription used for communication with Azure.
      ${DefaultProfile},
  
      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Run the command as a job
      ${AsJob},
  
      [Parameter(DontShow)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Wait for .NET debugger to attach
      ${Break},
  
      [Parameter(DontShow)]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Runtime.SendAsyncStep[]]
      # SendAsync Pipeline Steps to be appended to the front of the pipeline
      ${HttpPipelineAppend},
  
      [Parameter(DontShow)]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Runtime.SendAsyncStep[]]
      # SendAsync Pipeline Steps to be prepended to the front of the pipeline
      ${HttpPipelinePrepend},
  
      [Parameter()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Run the command asynchronously
      ${NoWait},
  
      [Parameter(DontShow)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Uri]
      # The URI for the proxy server to use
      ${Proxy},
  
      [Parameter(DontShow)]
      [ValidateNotNull()]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Management.Automation.PSCredential]
      # Credentials for a proxy server to use for the remote call
      ${ProxyCredential},
  
      [Parameter(DontShow)]
      [Microsoft.Azure.PowerShell.Cmdlets.StackHCIVM.Category('Runtime')]
      [System.Management.Automation.SwitchParameter]
      # Use the default credentials for the proxy
      ${ProxyUseDefaultCredentials}
  )

    #name
    if ($Name -notmatch $machineNameRegex){
      Write-Error "Invalid Name: $Name. The name must start with an alphanumeric character, contain all alphanumeric characters or '-' or '_' or '.' and end with an alphanumeric character. The max length is 64 characters." -ErrorAction Stop
    }

    if ($CustomLocationId -notmatch $customLocationRegex){
      Write-Error "Invalid CustomLocationId: $CustomLocationId" -ErrorAction Stop
    }
    
    $PSBoundParameters.Add("Kind", "HCI")
    $PSBoundParameters.Add("IdentityType", "SystemAssigned")
    $null = $PSBoundParameters.Remove("DynamicMemoryMaximumMemory") 
    $null = $PSBoundParameters.Remove("DynamicMemoryMinimumMemory") 
    $null = $PSBoundParameters.Remove("DynamicMemoryTargetBuffer") 
    $null = $PSBoundParameters.Remove("VmMemoryInMB")
    $null = $PSBoundParameters.Remove("VmProcessor")
    $null = $PSBoundParameters.Remove("VmSize") 
    $null = $PSBoundParameters.Remove("NicId") 
    $null = $PSBoundParameters.Remove("NicName")
    $null = $PSBoundParameters.Remove("NicResourceGroup")
    $null = $PSBoundParameters.Remove("CustomLocationId") 
    $null = $PSBoundParameters.Remove("ImageId") 
    $null = $PSBoundParameters.Remove("ImageName")
    $null = $PSBoundParameters.Remove("ImageResourceGroup") 
    $null = $PSBoundParameters.Remove("DisablePasswordAuthentication") 
    $null = $PSBoundParameters.Remove("ProvisionVMAgent")
    $null = $PSBoundParameters.Remove("ProvisionVMConfigAgent")
    $null = $PSBoundParameters.Remove("DataDiskId") 
    $null = $PSBoundParameters.Remove("DataDiskName") 
    $null = $PSBoundParameters.Remove("DataDiskResourceGroup") 
    $null = $PSBoundParameters.Remove("OSDiskId") 
    $null = $PSBoundParameters.Remove("OSDiskName") 
    $null = $PSBoundParameters.Remove("OSDiskResourceGroup")
    $null = $PSBoundParameters.Remove("AdminPassword") 
    $null = $PSBoundParameters.Remove("AdminUsername")
    $null = $PSBoundParameters.Remove("ComputerName") 
    $null = $PSBoundParameters.Remove("EnableTpm") 
    $null = $PSBoundParameters.Remove("SshPublicKey") 
    $null = $PSBoundParameters.Remove("SecureBootEnabled") 
    $null = $PSBoundParameters.Remove("StoragePathResourceGroup")
    $null = $PSBoundParameters.Remove("StoragePathName")
    $null = $PSBoundParameters.Remove("StoragePathId")
    $null = $PSBoundParameters.Remove("EnableAutomaticUpdate")
    $null = $PSBoundParameters.Remove("TimeZone")
    $null = $PSBoundParameters.Remove("NoWait")
    $null = $PSBoundParameters.Remove("AsJob")

    if ($OsType.ToString().ToLower() -eq "windows"){
      $null = $PSBoundParameters.Remove("OsType")
      $PSBoundParameters.Add('OSType', "Windows")
    } elseif ($OsType.ToString().ToLower() -eq "linux"){
      $null = $PSBoundParameters.Remove("OsType")
      $PSBoundParameters.Add('OSType', "Linux")
    } else {
      Write-Error "Invalid OSType provided: $OsType. Accepted Values are 'Windows' and 'Linux'" -ErrorAction Stop
   }


    Az.StackHCIVM.internal\New-AzStackHCIVMMachine @PSBoundParameters  | Out-Null

    if ($PSCmdlet.ParameterSetName -eq "ByImageId"){
      if($ImageId -notmatch $marketplaceGalImageRegex -and $ImageId -notmatch $galImageRegex){
        Write-Error "Invalid ImageId: $ImageId" -ErrorAction Stop
      }
      $PSBoundParameters.Add('ImageId', $ImageId)
    } elseif ($PSCmdlet.ParameterSetName -eq "ByImageName"){
        $rg = $ResourceGroupName
        if($ImageResourceGroup){
          $rg = $ImageResourceGroup
        }
        $isGalleryImage = $false
        $isMarketplaceGalleryImage = $false
      
      $galImage = Az.StackHCIVM.internal\Get-AzStackHCIVMGalleryImage -Name $ImageName -ResourceGroupName $rg -SubscriptionId $SubscriptionId -ErrorAction SilentlyContinue
      if($galImage -eq $null){
        $marketplaceGalImage = Az.StackHCIVM.internal\Get-AzStackHCIVMMarketplaceGalleryImage -Name $ImageName -ResourceGroupName $rg -SubscriptionId $SubscriptionId -ErrorAction SilentlyContinue
        if ($marketplacegalImage -eq $null){
          Write-Error "An Image with name: $ImageName does not exist in Resource Group: $rg" -ErrorAction Stop
        } else {
          $isMarketplaceGalleryImage = $true
        }
      
      } else{
        $isGalleryImage = $true 
        }

        if ($isGalleryImage){
          $ImageId = "/subscriptions/$SubscriptionId/resourceGroups/$rg/providers/Microsoft.AzureStackHCI/galleryimages/$ImageName"
        } else {
          $ImageId = "/subscriptions/$SubscriptionId/resourceGroups/$rg/providers/Microsoft.AzureStackHCI/marketplacegalleryimages/$ImageName"
        }

        $null = $PSBoundParameters.Remove("ImageResourceGroup")
        $null = $PSBoundParameters.Remove("ImageName")
        $PSBoundParameters.Add('ImageId', $ImageId)

  } elseif ($PSCmdlet.ParameterSetName -eq "ByOsDiskId"){      
      if($OSDiskId -notmatch $vhdRegex){
        Write-Error "Invalid OSDiskId : $OSDiskId" -ErrorAction Stop
      }
      $PSBoundParameters.Add('OSDiskId', $OSDiskId)
  } elseif ($PSCmdlet.ParameterSetName -eq "ByOsDiskName"){
      if ($OSDiskResourceGroup){
          $OSDiskId = "/subscriptions/$SubscriptionId/resourceGroups/$OSDiskResourceGroup/providers/Microsoft.AzureStackHCI/virtualharddisks/$OSDiskName"
      } else {
          $OSDiskId = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.AzureStackHCI/virtualharddisks/$OSDiskName"
      }
      $PSBoundParameters.Add('OSDiskId', $OSDiskId)
      $null = $PSBoundParameters.Remove("OSDiskResourceGroup")
      $null = $PSBoundParameters.Remove("OSDiskName")
      
  } else {
      Write-Error "Either Image or OS Disk is required. " -ErrorAction Stop
  }

  if ($VmSize){
    if($VmSize.ToString().ToLower() -eq "default"){
      Write-Error "Invalid VM Size provided. 'Default' is not a supported VmSize." -ErrorAction Stop
    }
    if($VmSize.ToString().ToLower() -eq "custom"){
      if (-Not ($VmProcessor -and $VmMemoryInMB)){
        Write-Error "VmMemory and VmProcessor required for Custom VmSize" -ErrorAction Stop
      }
      $PSBoundParameters.Add("VmMemory", $VmMemoryInMB)
      $PSBoundParameters.Add("VmProcessor", $VmProcessor)
    } else {
        if ($VmProcessor -or $VmMemoryInMB){
          Write-Error "VmMemory and VmProcessor will be ignored. Please specify Custom for VMSize." -ErrorAction Continue
          $null = $PSBoundParameters.Remove("VmProcessor")
          $null = $PSBoundParameters.Remove("VmMemoryInMB")
        }
    }
  }

  if ($NicId){
    $NetworkProfileNetworkInterface =  [System.Collections.ArrayList]::new()
    foreach ($NId in $NicId){
      if ($NId -notmatch $nicRegex){
        Write-Error "Invalid Nic Id provided: $NId." -ErrorAction Stop
      }
      
      $nic = Az.StackHCIVM\Get-AzStackHCIVMNetworkInterface  -ResourceId $NId -ErrorAction SilentlyContinue  
      if ($nic -eq $null){
        Write-Error "A Network Interface with id: $NId does not exist." -ErrorAction Stop
      }
      
      $NetworkInterface = @{Id = $NId}
      [void]$NetworkProfileNetworkInterface.Add($NetworkInterface)
    }
    $null = $PSBoundParameters.Remove("NicId")
    $PSBoundParameters.Add('NetworkProfileNetworkInterface', $NetworkProfileNetworkInterface)
  } elseif ($NicName){
      $rg = $ResourceGroupName
      if($NicResourceGroup){
        $rg = $NicResourceGroup
      }

      $NetworkProfileNetworkInterface =  [System.Collections.ArrayList]::new()
      foreach ($NName in $NicName){
        $NicIdNew = "/subscriptions/$SubscriptionId/resourceGroups/$rg/providers/Microsoft.AzureStackHCI/networkinterfaces/$NName"
        $nic = Az.StackHCIVM\Get-AzStackHCIVMNetworkInterface -ResourceId $NicIdNew  -ErrorAction SilentlyContinue
   
        if ($nic -eq $null){
          Write-Error "A Network Interface with id: $NicIdNew does not exist." -ErrorAction Stop
        }
      
        $NetworkInterface = @{Id = $NicIdNew}
        [void]$NetworkProfileNetworkInterface.Add($NetworkInterface)
      }
      $null = $PSBoundParameters.Remove("NicName")
      $null = $PSBoundParameters.Remove("NicResourceGroup")

      $PSBoundParameters.Add('NetworkProfileNetworkInterface', $NetworkProfileNetworkInterface)
  }
  if ($OsType.ToString().ToLower() -eq "windows"){
    $OsType = "Windows"
    if($ComputerName){
      if ($ComputerName.length -gt 15 -or $ComputerName -match $allDigitsRegex -or $ComputerName -match $invalidCharactersComputerName){
        Write-Error "Invalid Computer Name : $ComputerName." -ErrorAction Stop
      }
    }
    if ($DisablePasswordAuthentication.IsPresent){
      $null = $PSBoundParameters.Remove('DisablePasswordAuthentication')
    }
  
    $PSBoundParameters.Add("WindowConfigurationProvisionVMAgent", $true)
    $PSBoundParameters.Add("WindowConfigurationProvisionVMConfigAgent", $true)
    if(-not $ProvisionVMAgent){
      $null = $PSBoundParameters.Remove("WindowConfigurationProvisionVMAgent")
      $PSBoundParameters.Add("WindowConfigurationProvisionVMAgent", $false)
    }
    if (-not $ProvisionVMConfigAgent){
      $null = $PSBoundParameters.Remove("WindowConfigurationProvisionVMConfigAgent")
      $PSBoundParameters.Add("WindowConfigurationProvisionVMConfigAgent", $true)
    }
    $null = $PSBoundParameters.Remove("ProvisionVMAgent")
    $null = $PSBoundParameters.Remove("ProvisionVMConfigAgent")


    if ($SshPublicKey){
      $WindowsConfigurationSshPublicKey = [System.Collections.ArrayList]::new()
      foreach ($key in $SshPublicKey){
        $keyData = Get-Content -Path $key
        $WindowsKey = @{KeyData = $keyData}
        [void]$WindowsConfigurationSshPublicKey.Add($WindowsKey)
      }
      $null = $PSBoundParameters.Remove('SshPublicKey')
      $PSBoundParameters.Add("WindowsConfigurationSshPublicKey", $WindowsConfigurationSshPublicKey)
    }
  } elseif ($OsType.ToString().ToLower() -eq "linux"){
      $OsType = "Linux"
      if ($ComputerName.length -gt 64 -or $ComputerName -match $allDigitsRegex -or $ComputerName -match $invalidCharactersComputerName){
        Write-Error "Invalid Computer Name : $ComputerName." -ErrorAction Stop
      }
      if ($EnableAutomaticUpdates.IsPresent){
        $null = $PSBoundParameters.Remove('EnableAutomaticUpdates')
      }
      if ($TimeZone){
        $null = $PSBoundParameters.Remove('TimeZone')
      }
      $PSBoundParameters.Add("LinuxConfigurationProvisionVMAgent", $true)
      $PSBoundParameters.Add("LinuxConfigurationProvisionVMConfigAgent", $true)
      if(-not $ProvisionVMAgent){
        $null = $PSBoundParameters.Remove("LinuxConfigurationProvisionVMAgent")
        $PSBoundParameters.Add("LinuxConfigurationProvisionVMAgent", $false)
      }
      if (-not $ProvisionVMConfigAgent){
        $null = $PSBoundParameters.Remove("LinuxConfigurationProvisionVMConfigAgent")
        $PSBoundParameters.Add("LinuxConfigurationProvisionVMConfigAgent", $false)
      }
      $null = $PSBoundParameters.Remove("ProvisionVMAgent")
      $null = $PSBoundParameters.Remove("ProvisionVMConfigAgent")

      
      if ($SshPublicKey){
        $LinuxConfigurationSshPublicKey = [System.Collections.ArrayList]::new()
        foreach ($key in $SshPublicKey){
          $keyData = Get-Content -Path $key
          $LinuxKey = @{KeyData = $keyData}
          [void]$LinuxConfigurationSshPublicKey.Add($LinuxKey)
        }
        $null = $PSBoundParameters.Remove('SshPublicKey')
        $PSBoundParameters.Add("LinuxConfigurationSshPublicKey", $LinuxConfigurationSshPublicKey)
      }
  } else {
     Write-Error "Invalid OSType provided: $OsType. Accepted Values are 'Windows' and 'Linux'" -ErrorAction Stop
  }

  if($StoragePathId){
    if($StoragePathId -notmatch $storagePathRegex){
      Write-Error "Invalid StoragePathId: $StoragePathId" -ErrorAction Stop
    }
  } elseif ($StoragePathName){
      if ($StoragePathResourceGroup){
          $ContainerId = "/subscriptions/$SubscriptionId/resourceGroups/$StoragePathResourceGroup/providers/Microsoft.AzureStackHCI/storagecontainers/$StoragePathName"
      } else {
          $ContainerId = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.AzureStackHCI/storagecontainers/$StoragePathName"
      }
      $PSBoundParameters.Add('StoragePathId', $ContainerId)
      $null = $PSBoundParameters.Remove("StoragePathName")
      $null = $PSBoundParameters.Remove("StoragePathReourceGroup")
  }


  if ($DataDiskId){
    $StorageProfileDataDisk =  [System.Collections.ArrayList]::new()
    foreach ($DiskId in $DataDiskId){
      if ($DiskId -notmatch $vhdRegex){
        Write-Error "Invalid Data Disk Id provided: $DiskId." -ErrorAction Stop
      }
      $DataDisk = @{Id = $DiskId}
      [void]$StorageProfileDataDisk.Add($DataDisk)
    }
    $null = $PSBoundParameters.Remove("DataDiskId")
    $PSBoundParameters.Add('StorageProfileDataDisk',  $StorageProfileDataDisk)
  } elseif ($DataDiskName){
      $rg = $ResourceGroupName
      if($DataDiskResourceGroup){
        $rg = $DataDiskResourceGroup
      }
     
      $StorageProfileDataDisk =  [System.Collections.ArrayList]::new()
      foreach ($DiskName in $DataDiskName){
        $DataDiskIdNew = "/subscriptions/$SubscriptionId/resourceGroups/$rg/providers/Microsoft.AzureStackHCI/virtualharddisks/$DiskName"
        $DataDisk = @{Id = $DataDiskIdNew}
        [void]$StorageProfileDataDisk.Add($DataDisk)
      }
      $null = $PSBoundParameters.Remove("DataDiskName")
      $null = $PSBoundParameters.Remove("DataDiskResourceGroup")
      $PSBoundParameters.Add('StorageProfileDataDisk',  $StorageProfileDataDisk)
  }  
  $resourceUri = "/subscriptions/" + $subscriptionId + "/resourceGroups/" + $resourceGroupName + "/providers/Microsoft.HybridCompute/machines/" + $Name
  $PSBoundParameters.Add("ResourceUri", $resourceUri)
  $PSBoundParameters.Add("CustomLocationId", $CustomLocationId)
  $PSBoundParameters.Add("OSDiskOstype", $OsType)
  $PSBoundParameters.Add('VmSize', $VmSize)
  if ($ComputerName){
    $PSBoundParameters.Add('ComputerName', $ComputerName)
  }
  if ($AdminUsername){
    $PSBoundParameters.Add('AdminUsername', $AdminUsername)
  }
  if ($AdminPassword){
    $PSBoundParameters.Add('AdminPassword', $AdminPassword)
  }
  if ($DynamicMemoryMaximumMemory){
    $PSBoundParameters.Add('DynamicMemoryMaximumMemory', $DynamicMemoryMaximumMemory)
  }
  if ($DynamicMemoryMinimumMemory){
    $PSBoundParameters.Add('DynamicMemoryMinimumMemory', $DynamicMemoryMinimumMemory)
  }
  if ($DynamicMemoryTargetBuffer){
    $PSBoundParameters.Add('DynamicMemoryTargetBuffer', $DynamicMemoryTargetBuffer)
  }
  if ($EnableTpm.IsPresent){
    $PSBoundParameters.Add('EnableTpm', $EnableTpm)
  }
  if($SecureBootEnabled.IsPresent){
    $PSBoundParameters.Add('SecureBootEnabled', $SecureBootEnabled)
  }
  $null = $PSBoundParameters.Remove("Name")
  $null = $PSBoundParameters.Remove("ResourceGroupName")
  $null = $PSBoundParameters.Remove("SubscriptionId")
  $null = $PSBoundParameters.Remove("ResourceId")
  $null = $PSBoundParameters.Remove("NicResourceGroup")
  $null = $PSBoundParameters.Remove("NicName")
  $null = $PSBoundParameters.Remove("Kind") 
  $null = $PSBoundParameters.Remove("Location") 
  $null = $PSBoundParameters.Remove("OSType")
  $null = $PSBoundParameters.Remove("IdentityType")
 
  try{
    Az.StackHCIVM.internal\New-AzStackHCIVMVirtualMachine -ErrorAction Stop @PSBoundParameters 
  } catch {
    $e = $_
    if ($e.FullyQualifiedErrorId -match "MissingAzureKubernetesMapping" ){
        Write-Error "An older version of the Arc VM cluster extension is installed on your cluster. Please downgrade the Az.StackHCIVm version to 1.0.1 to proceed." -ErrorAction Stop
    } else {
        Write-Error $e.Exception.Message -ErrorAction Stop
    }
  }
}


# SIG # Begin signature block
# MIIoLQYJKoZIhvcNAQcCoIIoHjCCKBoCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCg9NDDaZLXqf8J
# 0TYIasTU3EE0ZMWq7bukvkjnqzJ9FqCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGg0wghoJAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIDJIxfy2ALU9IrRChm2/SU/E
# HKg6l04i9LrLjXopyD5EMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAUT+2EsfFeC3cYcjWXsRSC08OKffP5/PCYUVmVrYTJhyj31FsPwz+ELIa
# EJNJrlFQF5VChPe8SxskwI0VzhRwBzQ1yPiqu8JRzaZijqrBwVjrS+7CUWM/Q71l
# p1J1C3AbkHBnixLgvx3q+gLiCeLCb+t972MMFEVnZkJl3z/mv7biigwcXfhzaUXh
# c/WnoRzrytARUti3L3vnB0nIaSDvJiZH3t0+GJhFUEBOGrAwCgzP4xV5qV/Uykp3
# +6LT1MlS7lLy/TQHXNz6+DtRvTOZsj9vZjcdgWvAu17GVSQ4SUJfHlqMLWZv+mi3
# MzWkFx7EyG5/pJsqhhj9bTH2TnpM1aGCF5cwgheTBgorBgEEAYI3AwMBMYIXgzCC
# F38GCSqGSIb3DQEHAqCCF3AwghdsAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsq
# hkiG9w0BCRABBKCCAUEEggE9MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCDbnoopwHoyUP6zrkWQTjXxk2DM50RwHTPj9S7Dmd2C0QIGZjOaePn9
# GBMyMDI0MDUxNjA2NDIxMS45MzJaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1l
# cmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046RjAwMi0w
# NUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wg
# ghHtMIIHIDCCBQigAwIBAgITMwAAAfI+MtdkrHCRlAABAAAB8jANBgkqhkiG9w0B
# AQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMzEyMDYxODQ1
# NThaFw0yNTAzMDUxODQ1NThaMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046RjAwMi0wNUUwLUQ5NDcxJTAjBgNV
# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQC85fPLFwppYgxwYxkSEeYvQBtnYJTtKKj2FKxzHx0f
# gV6XgIIrmCWmpKl9IOzvOfJ/k6iP0RnoRo5F89Ad29edzGdlWbCj1Qyx5HUHNY8y
# u9ElJOmdgeuNvTK4RW4wu9iB5/z2SeCuYqyX/v8z6Ppv29h1ttNWsSc/KPOeuhzS
# AXqkA265BSFT5kykxvzB0LxoxS6oWoXWK6wx172NRJRYcINfXDhURvUfD70jioE9
# 2rW/OgjcOKxZkfQxLlwaFSrSnGs7XhMrp9TsUgmwsycTEOBdGVmf1HCD7WOaz5EE
# cQyIS2BpRYYwsPMbB63uHiJ158qNh1SJXuoL5wGDu/bZUzN+BzcLj96ixC7wJGQM
# BixWH9d++V8bl10RYdXDZlljRAvS6iFwNzrahu4DrYb7b8M7vvwhEL0xCOvb7WFM
# sstscXfkdE5g+NSacphgFfcoftQ5qPD2PNVmrG38DmHDoYhgj9uqPLP7vnoXf7j6
# +LW8Von158D0Wrmk7CumucQTiHRyepEaVDnnA2GkiJoeh/r3fShL6CHgPoTB7oYU
# /d6JOncRioDYqqRfV2wlpKVO8b+VYHL8hn11JRFx6p69mL8BRtSZ6dG/GFEVE+fV
# mgxYfICUrpghyQlETJPITEBS15IsaUuW0GvXlLSofGf2t5DAoDkuKCbC+3VdPmlY
# VQIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFJVbhwAm6tAxBM5cH8Bg0+Y64oZ5MB8G
# A1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCG
# Tmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy
# MFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4w
# XAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2Vy
# dHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwG
# A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQD
# AgeAMA0GCSqGSIb3DQEBCwUAA4ICAQA9S6eO4HsfB00XpOgPabcN3QZeyipgilcQ
# SDZ8g6VCv9FVHzdSq9XpAsljZSKNWSClhJEz5Oo3Um/taPnobF+8CkAdkcLQhLdk
# Shfr91kzy9vDPrOmlCA2FQ9jVhFaat2QM33z1p+GCP5tuvirFaUWzUWVDFOpo/O5
# zDpzoPYtTr0cFg3uXaRLT54UQ3Y4uPYXqn6wunZtUQRMiJMzxpUlvdfWGUtCvnW3
# eDBikDkix1XE98VcYIz2+5fdcvrHVeUarGXy4LRtwzmwpsCtUh7tR6whCrVYkb6F
# udBdWM7TVvji7pGgfjesgnASaD/ChLux66PGwaIaF+xLzk0bNxsAj0uhd6QdWr6T
# T39m/SNZ1/UXU7kzEod0vAY3mIn8X5A4I+9/e1nBNpURJ6YiDKQd5YVgxsuZCWv4
# Qwb0mXhHIe9CubfSqZjvDawf2I229N3LstDJUSr1vGFB8iQ5W8ZLM5PwT8vtsKEB
# wHEYmwsuWmsxkimIF5BQbSzg9wz1O6jdWTxGG0OUt1cXWOMJUJzyEH4WSKZHOx53
# qcAvD9h0U6jEF2fuBjtJ/QDrWbb4urvAfrvqNn9lH7gVPplqNPDIvQ8DkZ3lvbQs
# Yqlz617e76ga7SY0w71+QP165CPdzUY36et2Sm4pvspEK8hllq3IYcyX0v897+X9
# YeecM1Pb1jCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZI
# hvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# MjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAy
# MDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25Phdg
# M/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPF
# dvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6
# GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBp
# Dco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50Zu
# yjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3E
# XzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0
# lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1q
# GFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ
# +QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PA
# PBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkw
# EgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxG
# NSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARV
# MFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWlj
# cm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAK
# BggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMC
# AYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvX
# zpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v
# cGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYI
# KwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG
# 9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0x
# M7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmC
# VgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449
# xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wM
# nosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDS
# PeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2d
# Y3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxn
# GSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+Crvs
# QWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokL
# jzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL
# 6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNQ
# MIICOAIBATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkYwMDItMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBr
# i943cFLH2TfQEfB05SLICg74CKCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA6e/kdzAiGA8yMDI0MDUxNjAxNDgz
# OVoYDzIwMjQwNTE3MDE0ODM5WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDp7+R3
# AgEAMAoCAQACAhdjAgH/MAcCAQACAhPkMAoCBQDp8TX3AgEAMDYGCisGAQQBhFkK
# BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ
# KoZIhvcNAQELBQADggEBAGgUSBK7uVURyU4HK/dJr1vVD5ZLQF2IVTBpgme2LkAy
# RNPOKxKPE5Ryfb8O9qjgD8qFoiA1ozsu7EFE0Z9/Rqk84cbeSEfs3ona7Atp4Vjb
# 6SxQgYFjGDlB43H0tjt6UrRKDp7ulM/Hpx9N96oEvr+sFS9/5M9THX/JkjED/UJ+
# Ow3mjJ+TZHdAn+/N0bYvK61QpGQeV3lgEa7Xx8hzYx0VaMYL7Zwea7M7OuTf1U0J
# tHqhpE4iAMv/UePbfUzs3zF3kt0adYNWzXmf1pdu4KO2ssdUPFHWHCJ3gTkcOB6y
# FOZidY/WZAQAG5gZWAUqBxPDLoUWk+QuDrzBDwv9igUxggQNMIIECQIBATCBkzB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAfI+MtdkrHCRlAABAAAB
# 8jANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE
# MC8GCSqGSIb3DQEJBDEiBCD0Ezk0Mk5IXwIYwosZw2U2KduJFFJ7ow6/t3sm7QGm
# gTCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIPjaPh0uMVJc04+Y4Ru5BUUb
# HE4suZ6nRHSUu0XXSkNEMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAHyPjLXZKxwkZQAAQAAAfIwIgQggJX3U7IzUMEK7mnRzIEEZ3gJ
# GNt/5ZfESO4QGjDmG2swDQYJKoZIhvcNAQELBQAEggIAGB/N2Sahnw0bpaRsko+C
# vcJ0ZHU6FGkYLLeN0ROO5CVFuLezTWRn6gRhbBdqYfNx88L3w8BiYnd8bYmu3hxr
# yLlURFvHPJwO/MfkmTcKMPEKZmq30JuYXDwvrfqLSR/mi6WjMzoWBdp7Kcz8wMMI
# 0/n9A4HUysuyzY6zKTrOP4UvwUZW60QrMVTpeuW79ohCYK03h040aLh5CtGXCT0Y
# cLVLLpXxWFzwwxFQ1EP+r+PC379q3VrU7PzMow1SB85lcma4B6Pe4F9DjFRyASUX
# 6Ao5Ms0BycCFZevW0dljY68jhR++UPKr57VZLd68mFOmVn8Judrj8oOpZQWTkiRp
# e98+5EU0VblvR0wvtCGGA0uAKY7Rt8Xn+iX3Z2fRIcVfcOSDjPPMPL4eTtyB2+b5
# RQkZ5mD3Z+67kNdoZKWMRye9Ol1/UQrUbSVqhIX8kWqEO5MfoVrICklZz1/vHLNs
# 0r5mkg7KXhIgev5HBrGjwpHWYRK9StIfiTQaAmR7RHZ2rQ0PAFI16bW/+KrQQB0T
# 8+SsXKgC9XjFVNi2mzpMGb9sVN2d5ueF06JaufQHy4a4Jdw6Pf2i8tLw4xNcLSRR
# Yu+Tep9ostd9Ftii2bqLSgZxWbQPZ89w5BB+oug0+hb1NrU/I0cc/zalNg/P2IWg
# U2PUgaEVqhdoyzWtmk3nKUk=
# SIG # End signature block