PSCertificateEnrollment.psm1

New-Variable -Option Constant -Name ObjectIdGroupId -Value @{
    XCN_CRYPT_ANY_GROUP_ID = 0
    XCN_CRYPT_HASH_ALG_OID_GROUP_ID = 1
    XCN_CRYPT_FIRST_ALG_OID_GROUP_ID = 1
    XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID = 2
    XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID = 3
    XCN_CRYPT_SIGN_ALG_OID_GROUP_ID = 4
    XCN_CRYPT_LAST_ALG_OID_GROUP_ID = 4
    XCN_CRYPT_RDN_ATTR_OID_GROUP_ID = 5
    XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID = 6
    XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID = 7
    XCN_CRYPT_POLICY_OID_GROUP_ID = 8
    XCN_CRYPT_TEMPLATE_OID_GROUP_ID = 9
    XCN_CRYPT_KDF_OID_GROUP_ID = 10
    XCN_CRYPT_LAST_OID_GROUP_ID = 10
    XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_SHIFT = 16
    XCN_CRYPT_GROUP_ID_MASK = 65535
    XCN_CRYPT_OID_INFO_OID_GROUP_BIT_LEN_MASK = 268369920
    XCN_CRYPT_OID_DISABLE_SEARCH_DS_FLAG = 0x80000000
    XCN_CRYPT_KEY_LENGTH_MASK = 268369920
    XCN_CRYPT_OID_PREFER_CNG_ALGID_FLAG = 1073741824
}

New-Variable -Option Constant -Name ObjectIdPublicKeyFlags -Value @{
    XCN_CRYPT_OID_INFO_PUBKEY_ANY = 0
    XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG = 0x80000000
    XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG = 0x40000000 
}

New-Variable -Option Constant -Name PropType -Value @{
    PROPTYPE_LONG = 1
    PROPTYPE_DATE = 2
    PROPTYPE_BINARY = 3
    PROPTYPE_STRING = 4
}

New-Variable -Option Constant -Name X500NameFlags -Value @{
    XCN_CERT_NAME_STR_NONE = 0
    XCN_CERT_SIMPLE_NAME_STR = 1
    XCN_CERT_OID_NAME_STR = 2
    XCN_CERT_X500_NAME_STR = 3
    XCN_CERT_XML_NAME_STR = 4
    XCN_CERT_NAME_STR_SEMICOLON_FLAG = 0x40000000
    XCN_CERT_NAME_STR_NO_PLUS_FLAG = 0x20000000
    XCN_CERT_NAME_STR_NO_QUOTING_FLAG = 0x10000000
    XCN_CERT_NAME_STR_CRLF_FLAG = 0x8000000
    XCN_CERT_NAME_STR_COMMA_FLAG = 0x4000000
    XCN_CERT_NAME_STR_REVERSE_FLAG = 0x2000000
    XCN_CERT_NAME_STR_FORWARD_FLAG = 0x1000000
    XCN_CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG = 0x10000
    XCN_CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG = 0x20000
    XCN_CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG = 0x40000
    XCN_CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG = 0x80000
    XCN_CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG = 0x100000
}

New-Variable -Option Constant -Name Oid -Value @{

    XCN_OID_CRL_DIST_POINTS = '2.5.29.31'
    XCN_OID_AUTHORITY_INFO_ACCESS = '1.3.6.1.5.5.7.1.1'
    XCN_OID_ENHANCED_KEY_USAGE = "2.5.29.37"
    XCN_OID_SUBJECT_ALT_NAME2 =  "2.5.29.17"
    XCN_OID_FRESHEST_CRL = "2.5.29.46"
    XCN_OID_CERTSRV_CA_VERSION = "1.3.6.1.4.1.311.21.1"
    XCN_OID_CRL_NEXT_PUBLISH = "1.3.6.1.4.1.311.21.4"
    
    XCN_OID_ANY_APPLICATION_POLICY = "1.3.6.1.4.1.311.10.12.1"
    XCN_OID_AUTO_ENROLL_CTL_USAGE = "1.3.6.1.4.1.311.20.1"
    XCN_OID_DRM = "1.3.6.1.4.1.311.10.5.1"
    XCN_OID_DS_EMAIL_REPLICATION = "1.3.6.1.4.1.311.21.19"
    XCN_OID_EFS_RECOVERY = "1.3.6.1.4.1.311.10.3.4.1"
    XCN_OID_EMBEDDED_NT_CRYPTO = "1.3.6.1.4.1.311.10.3.8"
    XCN_OID_ENROLLMENT_AGENT = "1.3.6.1.4.1.311.20.2.1"
    XCN_OID_IPSEC_KP_IKE_INTERMEDIATE = "1.3.6.1.5.5.8.2.2"
    XCN_OID_KP_CA_EXCHANGE = "1.3.6.1.4.1.311.21.5"
    XCN_OID_KP_CTL_USAGE_SIGNING = "1.3.6.1.4.1.311.10.3.1"
    XCN_OID_KP_DOCUMENT_SIGNING = "1.3.6.1.4.1.311.10.3.12"
    XCN_OID_KP_EFS = "1.3.6.1.4.1.311.10.3.4"
    XCN_OID_KP_KEY_RECOVERY = "1.3.6.1.4.1.311.10.3.11"
    XCN_OID_KP_KEY_RECOVERY_AGENT = "1.3.6.1.4.1.311.21.6"
    XCN_OID_KP_LIFETIME_SIGNING = "1.3.6.1.4.1.311.10.3.13"
    XCN_OID_KP_QUALIFIED_SUBORDINATION = "1.3.6.1.4.1.311.10.3.10"
    XCN_OID_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2"
    XCN_OID_KP_TIME_STAMP_SIGNING = "1.3.6.1.4.1.311.10.3.2"
    XCN_OID_LICENSE_SERVER = "1.3.6.1.4.1.311.10.6.2"
    XCN_OID_LICENSES = "1.3.6.1.4.1.311.10.6.1"
    XCN_OID_NT5_CRYPTO = "1.3.6.1.4.1.311.10.3.7"
    XCN_OID_OEM_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.7"
    XCN_OID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"
    XCN_OID_PKIX_KP_CODE_SIGNING = "1.3.6.1.5.5.7.3.3"
    XCN_OID_PKIX_KP_EMAIL_PROTECTION = "1.3.6.1.5.5.7.3.4"
    XCN_OID_PKIX_KP_IPSEC_END_SYSTEM = "1.3.6.1.5.5.7.3.5"
    XCN_OID_PKIX_KP_IPSEC_TUNNEL = "1.3.6.1.5.5.7.3.6"
    XCN_OID_PKIX_KP_IPSEC_USER = "1.3.6.1.5.5.7.3.7"
    XCN_OID_PKIX_KP_OCSP_SIGNING = "1.3.6.1.5.5.7.3.9"
    XCN_OID_PKIX_KP_SERVER_AUTH = "1.3.6.1.5.5.7.3.1"
    XCN_OID_PKIX_KP_TIMESTAMP_SIGNING = "1.3.6.1.5.5.7.3.8"
    XCN_OID_ROOT_LIST_SIGNER = "1.3.6.1.4.1.311.10.3.9"
    XCN_OID_WHQL_CRYPTO = "1.3.6.1.4.1.311.10.3.5"

    XCN_OID_OIWSEC_desCBC = "1.3.14.3.2.7"
    XCN_OID_RSA_DES_EDE3_CBC = "1.2.840.113549.3.7"
    XCN_OID_RSA_RC2CBC = "1.2.840.113549.3.2"
    XCN_OID_RSA_RC4 = "1.2.840.113549.3.4"
    XCN_OID_RSA_SMIMEalgCMS3DESwrap = "1.2.840.113549.1.9.16.3.6"
    XCN_OID_RSA_SMIMEalgCMSRC2wrap = "1.2.840.113549.1.9.16.3.7"
    XCN_OID_NIST_AES128_CBC = "2.16.840.1.101.3.4.1.2"
    XCN_OID_NIST_AES192_CBC = "2.16.840.1.101.3.4.1.22"
    XCN_OID_NIST_AES256_CBC = "2.16.840.1.101.3.4.1.42"
    XCN_OID_NIST_AES128_WRAP = "2.16.840.1.101.3.4.1.5"
    XCN_OID_NIST_AES192_WRAP = "2.16.840.1.101.3.4.1.25"
    XCN_OID_NIST_AES256_WRAP = "2.16.840.1.101.3.4.1.45"

    # Own Definition
    XCN_OID_KP_KDC = "1.3.6.1.5.2.3.5"
    XCN_OID_KP_RDC = "1.3.6.1.4.1.311.54.1.2"
    XCN_OID_KP_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"

    md5NoSign = "1.2.840.113549.2.5"
    sha1NoSign = "1.3.14.3.2.26"
    sha256NoSign = "2.16.840.1.101.3.4.2.1"
    sha384NoSign = "2.16.840.1.101.3.4.2.2"
    sha512NoSign = "2.16.840.1.101.3.4.2.3"

    szOID_NTDS_CA_SECURITY_EXT = "1.3.6.1.4.1.311.25.2"

    szOID_CERTIFICATE_TEMPLATE = "1.3.6.1.4.1.311.21.7"
    szOID_AUTHORITY_KEY_IDENTIFIER2 = "2.5.29.35"
    szOID_APPLICATION_CERT_POLICIES = "1.3.6.1.4.1.311.21.10"
    szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"
    szOID_KEY_USAGE = "2.5.29.15"

    OcspNoRevocationCheck = "1.3.6.1.5.5.7.48.1.5"
    SmimeCapabilities = "1.2.840.113549.1.9.15"
}

New-Variable -Option Constant -Name FullResponseProperty -Value @{
    FR_PROP_NONE = 0
    FR_PROP_FULLRESPONSE = 1
    FR_PROP_STATUSINFOCOUNT = 2
    FR_PROP_BODYPARTSTRING = 3
    FR_PROP_STATUS = 4
    FR_PROP_STATUSSTRING = 5
    FR_PROP_OTHERINFOCHOICE = 6
    FR_PROP_FAILINFO = 7
    FR_PROP_PENDINFOTOKEN = 8
    FR_PROP_PENDINFOTIME = 9
    FR_PROP_ISSUEDCERTIFICATEHASH = 10
    FR_PROP_ISSUEDCERTIFICATE = 11
    FR_PROP_ISSUEDCERTIFICATECHAIN = 12
    FR_PROP_ISSUEDCERTIFICATECRLCHAIN = 13
    FR_PROP_ENCRYPTEDKEYHASH = 14
    FR_PROP_FULLRESPONSENOPKCS7 = 15
    FR_PROP_CAEXCHANGECERTIFICATEHASH = 16
    FR_PROP_CAEXCHANGECERTIFICATE = 17
    FR_PROP_CAEXCHANGECERTIFICATECHAIN = 18
    FR_PROP_CAEXCHANGECERTIFICATECRLCHAIN = 19
    FR_PROP_ATTESTATIONCHALLENGE = 20
    FR_PROP_ATTESTATIONPROVIDERNAME = 21
}

New-Variable -Option Constant -Name RequestFlags -Value @{
    CR_IN_BASE64HEADER = 0
    CR_IN_BASE64 = 1
    CR_IN_BINARY = 2
    CR_IN_ENCODEANY = 0xff
    CR_IN_MACHINE = 0x100000
    CR_OUT_BASE64HEADER = 0
    CR_OUT_BASE64 = 1
    CR_OUT_BINARY = 2
}

New-Variable -Option Constant -Name AlternativeNameType -Value @{
    XCN_CERT_ALT_NAME_UNKNOWN = 0
    XCN_CERT_ALT_NAME_OTHER_NAME = 1
    XCN_CERT_ALT_NAME_RFC822_NAME = 2
    XCN_CERT_ALT_NAME_DNS_NAME = 3
    XCN_CERT_ALT_NAME_DIRECTORY_NAME = 5
    XCN_CERT_ALT_NAME_URL = 7
    XCN_CERT_ALT_NAME_IP_ADDRESS = 8
    XCN_CERT_ALT_NAME_REGISTERED_ID = 9
    XCN_CERT_ALT_NAME_GUID = 10
    XCN_CERT_ALT_NAME_USER_PRINCIPLE_NAME = 11
}

New-Variable -Option Constant -Name DispositionType -Value @{
    CR_DISP_INCOMPLETE = 0
    CR_DISP_ERROR = 1
    CR_DISP_DENIED = 2
    CR_DISP_ISSUED = 3
    CR_DISP_ISSUED_OUT_OF_BAND = 4
    CR_DISP_UNDER_SUBMISSION = 5
    CR_DISP_REVOKED = 6
}

New-Variable -Option Constant -Name EncodingType -Value @{
    XCN_CRYPT_STRING_NOCR = [Int]::MinValue
    XCN_CRYPT_STRING_BASE64HEADER = 0
    XCN_CRYPT_STRING_BASE64 = 1
    XCN_CRYPT_STRING_BINARY = 2
    XCN_CRYPT_STRING_BASE64REQUESTHEADER = 3
    XCN_CRYPT_STRING_HEX = 4
    XCN_CRYPT_STRING_HEXASCII = 5
    XCN_CRYPT_STRING_BASE64_ANY = 6
    XCN_CRYPT_STRING_ANY = 7
    XCN_CRYPT_STRING_HEX_ANY = 8
    XCN_CRYPT_STRING_BASE64X509CRLHEADER = 9
    XCN_CRYPT_STRING_HEXADDR = 10
    XCN_CRYPT_STRING_HEXASCIIADDR = 11
    XCN_CRYPT_STRING_HEXRAW = 12
    XCN_CRYPT_STRING_BASE64URI = 13
    XCN_CRYPT_STRING_ENCODEMASK = 255
    XCN_CRYPT_STRING_CHAIN = 256
    XCN_CRYPT_STRING_TEXT = 512
    XCN_CRYPT_STRING_PERCENTESCAPE = 134217728
    XCN_CRYPT_STRING_HASHDATA = 268435456
    XCN_CRYPT_STRING_STRICT = 536870912
    XCN_CRYPT_STRING_NOCRLF = 1073741824
}

New-Variable -Option Constant -Name X509KeySpec -Value @{
    XCN_AT_NONE = 0
    XCN_AT_KEYEXCHANGE = 1
    XCN_AT_SIGNATURE = 2
}

New-Variable -Option Constant -Name X509SCEPDisposition -Value @{
    SCEPDispositionUnknown = -1
    SCEPDispositionSuccess = 0
    SCEPDispositionFailure = 2
    SCEPDispositionPending = 3
    SCEPDispositionPendingChallenge = 11
}

New-Variable -Option Constant -Name X509PrivateKeyVerify -Value @{ 
    VerifyNone = 0
    VerifySilent = 1
    VerifySmartCardNone = 2
    VerifySmartCardSilent = 4
    VerifyAllowUI = 8
}

New-Variable -Option Constant -Name AlgorithmFlags -Value @{
    AlgorithmFlagsNone = 0
    AlgorithmFlagsWrap = 1
}

New-Variable -Option Constant -Name InstallResponseRestrictionFlags -Value @{
    AllowNone = 0
    AllowNoOutstandingRequest = 1
    AllowUntrustedCertificate = 2
    AllowUntrustedRoot = 4
}

New-Variable -Option Constant -Name X509EnrollmentAuthFlags -Value  @{ 
    X509AuthNone = 0
    X509AuthAnonymous = 1
    X509AuthKerberos = 2
    X509AuthUsername = 4
    X509AuthCertificate = 8
}

New-Variable -Option Constant -Name X509CertificateEnrollmentContext -Value  @{ 
    ContextNone = 0
    ContextUser = 1
    ContextMachine = 2
    ContextAdministratorForceMachine = 3
}

New-Variable -Option Constant -Name X509RequestInheritOptions -Value @{
    InheritDefault = 0x00000000
    InheritRenewalCertificateFlag = 0x00000020
    InheritTemplateFlag = 0x00000040
    InheritSubjectFlag = 0x00000080
    InheritExtensionsFlag = 0x00000100
    InheritSubjectAltNameFlag = 0x00000200     
}

New-Variable -Option Constant -Name EnrollmentEnrollStatus -Value @{
    Enrolled = 0x00000001
    EnrollPended = 0x00000002
    EnrollUIDeferredEnrollmentRequired = 0x00000004
    EnrollError = 0x00000010
    EnrollUnknown = 0x00000020
    EnrollSkipped = 0x00000040
    EnrollDenied = 0x00000100 
}

New-Variable -Option Constant -Name InnerRequestLevel -Value @{
    LevelInnermost = 0
    LevelNext = 1
}

New-Variable -Option Constant -Name TaskRunFlags -Value @{
    TASK_RUN_NO_FLAGS = 0
    TASK_RUN_AS_SELF = 1
    TASK_RUN_IGNORE_CONSTRAINTS = 2
    TASK_RUN_USE_SESSION_ID = 3
    TASK_RUN_USER_SID = 4
}

New-Variable -Option Constant -Name SCEPFailInfo -Value @(

    @{
        Code = 0
        Message = "badAlg"
        Description = "Unrecognized or unsupported algorithm identifier"
    }
    @{
        Code = 1
        Message = "badMessageCheck"
        Description = "integrity check failed"
    }
    @{
        Code = 2
        Message = "badRequest"
        Description = "transaction not permitted or supported"
    }
    @{
        Code = 3
        Message = "badTime"
        Description = "The signingTime attribute from the PKCS#7 authenticatedAttributes was not sufficiently close to the system time."
    }
    @{
        Code = 4
        Message = "badCertId"
        Description = "No certificate could be identified matching the provided criteria."
    }

)

# Built from the Error Codes I observed whilst testing Get-SCEPCertificate
# Stored as String as this gets compared against a text that is returned from the API
New-Variable -Option Constant -Name NDESErrorCode -Value @{
    CERT_E_WRONG_USAGE = "0x800b0110"
    TRUST_E_CERT_SIGNATURE = "0x80096004"
    ERROR_NOT_FOUND = "0x80070490"
    CERTSRV_E_BAD_REQUESTSUBJECT = "0x80094001"
    RPC_S_SERVER_UNAVAILABLE = "0x800706ba"
}

New-Variable -Option Constant -Name EkuNameToOidTable -Value @{
    EnrollmentAgent = $Oid.XCN_OID_ENROLLMENT_AGENT
    ClientAuthentication = $Oid.XCN_OID_PKIX_KP_CLIENT_AUTH
    CodeSigning = $Oid.XCN_OID_PKIX_KP_CODE_SIGNING
    LifeTimeSigning = $Oid.XCN_OID_KP_LIFETIME_SIGNING
    DocumentSigning = $Oid.XCN_OID_KP_DOCUMENT_SIGNING
    DocumentEncryption = $Oid.XCN_OID_KP_DOCUMENT_ENCRYPTION
    EncryptingFileSystem = $Oid.XCN_OID_KP_EFS
    FileRecovery = $Oid.XCN_OID_EFS_RECOVERY
    IPSecEndSystem = $Oid.XCN_OID_PKIX_KP_IPSEC_END_SYSTEM
    IPSecIKEIntermediate = $Oid.XCN_OID_IPSEC_KP_IKE_INTERMEDIATE
    IPSecTunnelEndpoint = $Oid.XCN_OID_PKIX_KP_IPSEC_TUNNEL
    IPSecUser = $Oid.XCN_OID_PKIX_KP_IPSEC_USER
    KeyRecovery = $Oid.XCN_OID_KP_KEY_RECOVERY
    KDCAuthentication = $Oid.XCN_OID_KP_KDC
    SecureEmail = $Oid.XCN_OID_PKIX_KP_EMAIL_PROTECTION
    ServerAuthentication = $Oid.XCN_OID_PKIX_KP_SERVER_AUTH
    SmartCardLogon = $Oid.XCN_OID_KP_SMARTCARD_LOGON
    TimeStamping = $Oid.XCN_OID_PKIX_KP_TIMESTAMP_SIGNING
    OCSPSigning = $Oid.XCN_OID_PKIX_KP_OCSP_SIGNING
    RemoteDesktopAuthentication = $Oid.XCN_OID_KP_RDC
    PrivateKeyArchival = $Oid.XCN_OID_KP_CA_EXCHANGE
}

New-Variable -Option Constant -Name SmimeCapabilityToOidTable -Value @{
    des = $Oid.XCN_OID_OIWSEC_desCBC
    des3 = $Oid.XCN_OID_RSA_DES_EDE3_CBC
    rc2 = $Oid.XCN_OID_RSA_RC2CBC
    rc4 = $Oid.XCN_OID_RSA_RC4
    des3wrap = $Oid.XCN_OID_RSA_SMIMEalgCMS3DESwrap
    rc2wrap = $Oid.XCN_OID_RSA_SMIMEalgCMSRC2wrap
    aes128 = $Oid.XCN_OID_NIST_AES128_CBC
    aes192 = $Oid.XCN_OID_NIST_AES192_CBC
    aes256 = $Oid.XCN_OID_NIST_AES256_CBC
    aes128wrap = $Oid.XCN_OID_NIST_AES128_WRAP
    aes192wrap = $Oid.XCN_OID_NIST_AES192_WRAP
    aes256wrap = $Oid.XCN_OID_NIST_AES256_WRAP
    md5 = $Oid.md5noSign
    sha1 = $Oid.sha1noSign
    sha256 = $Oid.sha256noSign
    sha384 = $Oid.sha384noSign
    sha512 = $Oid.sha512noSign
}

$ModuleRoot = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

# Import Public Functions
. $ModuleRoot\Functions\Get-NDESOTP.ps1
. $ModuleRoot\Functions\Get-SCEPCertificate.ps1
. $ModuleRoot\Functions\Get-KeyStorageProvider.ps1
. $ModuleRoot\Functions\Get-IssuedCertificate.ps1
. $ModuleRoot\Functions\New-CertificateRequest.ps1
. $ModuleRoot\Functions\New-SignedCertificateRequest.ps1
. $ModuleRoot\Functions\Install-IssuedCertificate.ps1
. $ModuleRoot\Functions\Undo-CertificateArchival.ps1
. $ModuleRoot\Functions\Get-RemoteDesktopCertificate.ps1
. $ModuleRoot\Functions\Set-RemoteDesktopCertificate.ps1
. $ModuleRoot\Functions\Invoke-AutoEnrollmentTask.ps1
. $ModuleRoot\Functions\Get-ESTCertificate.ps1
. $ModuleRoot\Functions\Get-ESTCACertificates.ps1
. $ModuleRoot\Functions\Get-XCEPEnrollmentPolicy.ps1
. $ModuleRoot\Functions\New-EnrollmentPolicy.ps1
. $ModuleRoot\Functions\Get-EnrollmentPolicy.ps1
. $ModuleRoot\Functions\Remove-EnrollmentPolicy.ps1
. $ModuleRoot\Functions\Clear-EnrollmentPolicyCache.ps1
. $ModuleRoot\Functions\Get-WSTEPResponse.ps1
. $ModuleRoot\Functions\Grant-PrivateKeyPermission.ps1
. $ModuleRoot\Functions\Get-PGWYCertificate.ps1

# Import Private Functions
. $ModuleRoot\Functions\Convert-DERToBASE64.ps1
. $ModuleRoot\Functions\Convert-StringToCertificateSerialNumber.ps1
. $ModuleRoot\Functions\Convert-StringToDER.ps1
. $ModuleRoot\Functions\Convert-StringToHex.ps1
. $ModuleRoot\Functions\Get-Asn1LengthOctets.ps1
. $ModuleRoot\Functions\Get-Hash.ps1
. $ModuleRoot\Functions\New-AiaExtension.ps1
. $ModuleRoot\Functions\New-CdpExtension.ps1
. $ModuleRoot\Functions\New-SidExtension.ps1
. $ModuleRoot\Functions\Invoke-PGWYPKCS10Operation.ps1
. $ModuleRoot\Functions\Get-CertificateByThumbprint.ps1
. $ModuleRoot\Functions\ConvertFrom-Base64ToPem.ps1
. $ModuleRoot\Functions\ConvertFrom-PemToBase64.ps1
. $ModuleRoot\Functions\New-SignedCms.ps1
. $ModuleRoot\Functions\New-TemplateExtension.ps1
. $ModuleRoot\Functions\Unregister-ComObject.ps1
. $ModuleRoot\Functions\New-AkiExtension.ps1
. $ModuleRoot\Functions\New-ApplicationPoliciesExtension.ps1
. $ModuleRoot\Functions\New-BasicConstraintsExtension.ps1
. $ModuleRoot\Functions\New-SmimeCapabilitiesExtension.ps1
. $ModuleRoot\Functions\New-ExtendedKeyUsageExtension.ps1
. $ModuleRoot\Functions\New-KeyUsageExtension.ps1
. $ModuleRoot\Functions\Test-IsElevated.ps1
# SIG # Begin signature block
# MIInYwYJKoZIhvcNAQcCoIInVDCCJ1ACAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAKGIyv2q62Fam5
# otnMsG2j2OPaTKxMSOXiEFqeYo9kBqCCIBMwggZCMIIEKqADAgECAhBpEmNtaQD5
# xRtKmVz7/u/QMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQK
# ExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2Rl
# IFNpZ25pbmcgMjAyMSBDQTAeFw0yNjAzMTgwNzQ5NDRaFw0yNzA2MjAwNzQ5NDNa
# MGgxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCYXllcm4xFDASBgNVBAcMC0TDvHJy
# d2FuZ2VuMRgwFgYDVQQKDA9Vd2UgR3JhZGVuZWdnZXIxGDAWBgNVBAMMD1V3ZSBH
# cmFkZW5lZ2dlcjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2hKwhe
# E1F2z3bW4sx0w3zQoHm6QC3uXPWzhQ9slqAzgu4PHaIRE22OqlABXYtXq+iu2kh6
# PZxkim0QEdq1vtuHOKBnD1XEOBUx/NIi+PxZ02AaRulDO685tLUOrnupohxaG4qq
# 6C/Seyab8/7tXzMEhv/PsOGl1N4m3YOLJjUslMVhkLoNc12T/PzF6qTZThBRiKeD
# N0tlQo5EraLhghZ3jFKkpCH6ckGEVolBNwqg0BBJiT6mQtVlcZmlJK2c1rNq9Apw
# IvN9bA+5A/w9T3yhbIlz0nuoIqdTaFq0DUH2SFQdXZP6xEPuAICJCDaDrc3hL4WF
# gLc4Tw5SzwVKLawFeYhzCbq22CvA6+c4dGgMyLY99UXtIiHB52UQEmL50tkMRxWw
# Hsonxy2/H380mrVQus2/lM1X9xYcQrxHcjoDjQSi4JCClZekVYPUxgd9lxYQBd8+
# PpdRucjAzKmOx0uc5+tddVRzMYYoc/xQSWj06aTr2zDQu+dpchWFJHEirQIDAQAB
# o4IBeDCCAXQwDAYDVR0TAQH/BAIwADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v
# Y2NzY2EyMDIxLmNybC5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcB
# AQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0u
# Y29tMDUGCCsGAQUFBzAChilodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2Nz
# Y2EyMDIxLmNlcjAfBgNVHSMEGDAWgBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNV
# HQ4EFgQUwj1KxaiWz3BWxuN8zTWx+dWip28wSwYDVR0gBEQwQjAIBgZngQwBBAEw
# NgYLKoRoAYb2dwIFAQQwJzAlBggrBgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVt
# LnBsL0NQUzATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJ
# KoZIhvcNAQELBQADggIBADrSbHhlYMa9ixnpIWBgVhL76qdlK5iPN35rlMHgK89n
# O9afz8EYTK7UExehOZxHtpLqO/hJu4eIQmjzC+tyUDii/3+IPoL1R9NlxAgoPxMc
# 3voLsX0xwTkl+R6dO6Q8RM3EDsknyUtVpjBggCPZ0pZsNumV1BXdIPPzdA1Rxm3F
# 6zcOGaXAJH37EWtbnc2e3X4EIxRFPm2EP5oiEYVEi90B3lcmo5p3iJG6zNSr+apG
# neN4AWuoGMbYBT7Ms5CdmbaM6uhuq73OqP6x47VjyeXpfuEVxvLSBfL24AI73//3
# 8sq2gH//j4qE8Ic4hV8NIBsHLvHuFH06z2EqWoEI0dKz2C92S86hqw+OGAcgLTVE
# StRppJXgtJwwxusm9OiJPIfDFY7kQxSGRq4B1YR1GGaUm1p4s2+819H8sYM+RGbM
# MCrY4C8EQNeCJedXZeCIXyWFDRizK7BB6B24DC0a7XR7cedQOMwMy/m9kZRsSt6X
# 7c84iOhCEL3Degnv8V4/KJSDtaOMVQUm6vRyFdQEfkVCHCaOuM6i4lQwKu38nOx+
# vNkCOSm3LWrYJGMxk1/KcPL5T+nR8WIR9SaS2vEGEvZmie71Q6qdug8cmPibxIs6
# N8wM2NJ+fDBHhoZl6as2VmDvLhqkbJaC0Piz82UWi6lGAfrhs4sLjOPIRvSauJTe
# MIIGuTCCBKGgAwIBAgIRAJmjgAomVTtlq9xuhKaz6jkwDQYJKoZIhvcNAQEMBQAw
# gYAxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBT
# LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJDAi
# BgNVBAMTG0NlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMjAeFw0yMTA1MTkwNTMy
# MThaFw0zNjA1MTgwNTMyMThaMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3Nl
# Y28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25p
# bmcgMjAyMSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ0jzwQw
# IzvBRiznM3M+Y116dbq+XE26vest+L7k5n5TeJkgH4Cyk74IL9uP61olRsxsU/WB
# AElTMNQI/HsE0uCJ3VPLO1UufnY0qDHG7yCnJOvoSNbIbMpT+Cci75scCx7UsKK1
# fcJo4TXetu4du2vEXa09Tx/bndCBfp47zJNsamzUyD7J1rcNxOw5g6FJg0ImIv7n
# CeNn3B6gZG28WAwe0mDqLrvU49chyKIc7gvCjan3GH+2eP4mYJASflBTQ3HOs6JG
# driSMVoD1lzBJobtYDF4L/GhlLEXWgrVQ9m0pW37KuwYqpY42grp/kSYE4BUQrbL
# gBMNKRvfhQPskDfZ/5GbTCyvlqPN+0OEDmYGKlVkOMenDO/xtMrMINRJS5SY+jWC
# i8PRHAVxO0xdx8m2bWL4/ZQ1dp0/JhUpHEpABMc3eKax8GI1F03mSJVV6o/nmmKq
# DE6TK34eTAgDiBuZJzeEPyR7rq30yOVw2DvetlmWssewAhX+cnSaaBKMEj9O2GgY
# kPJ16Q5Da1APYO6n/6wpCm1qUOW6Ln1J6tVImDyAB5Xs3+JriasaiJ7P5KpXeiVV
# /HIsW3ej85A6cGaOEpQA2gotiUqZSkoQUjQ9+hPxDVb/Lqz0tMjp6RuLSKARsVQg
# ETwoNQZ8jCeKwSQHDkpwFndfCceZ/OfCUqjxAgMBAAGjggFVMIIBUTAPBgNVHRMB
# Af8EBTADAQH/MB0GA1UdDgQWBBTddF1MANt7n6B0yrFu9zzAMsBwzTAfBgNVHSME
# GDAWgBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0l
# BAwwCgYIKwYBBQUHAwMwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL2NybC5jZXJ0
# dW0ucGwvY3RuY2EyLmNybDBsBggrBgEFBQcBAQRgMF4wKAYIKwYBBQUHMAGGHGh0
# dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMgYIKwYBBQUHMAKGJmh0dHA6Ly9y
# ZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYTIuY2VyMDkGA1UdIAQyMDAwLgYEVR0g
# ADAmMCQGCCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZI
# hvcNAQEMBQADggIBAHWIWA/lj1AomlOfEOxD/PQ7bcmahmJ9l0Q4SZC+j/v09CD2
# csX8Yl7pmJQETIMEcy0VErSZePdC/eAvSxhd7488x/Cat4ke+AUZZDtfCd8yHZgi
# kGuS8mePCHyAiU2VSXgoQ1MrkMuqxg8S1FALDtHqnizYS1bIMOv8znyJjZQESp9R
# T+6NH024/IqTRsRwSLrYkbFq4VjNn/KV3Xd8dpmyQiirZdrONoPSlCRxCIi54vQc
# qKiFLpeBm5S0IoDtLoIe21kSw5tAnWPazS6sgN2oXvFpcVVpMcq0C4x/CLSNe0Xc
# kmmGsl9z4UUguAJtf+5gE8GVsEg/ge3jHGTYaZ/MyfujE8hOmKBAUkVa7NMxRSB1
# EdPFpNIpEn/pSHuSL+kWN/2xQBJaDFPr1AX0qLgkXmcEi6PFnaw5T17UdIInA58r
# Tu3mefNuzUtse4AgYmxEmJDodf8NbVcU6VdjWtz0e58WFZT7tST6EWQmx/OoHPel
# E77lojq7lpsjhDCzhhp4kfsfszxf9g2hoCtltXhCX6NqsqwTT7xe8LgMkH4hVy8L
# 1h2pqGLT2aNCx7h/F95/QvsTeGGjY7dssMzq/rSshFQKLZ8lPb8hFTmiGDJNyHga
# 5hZ59IGynk08mHhBFM/0MLeBzlAQq1utNjQprztZ5vv/NJy8ua9AGbwkMWkOMIIF
# yTCCBLGgAwIBAgIQG7WPJSrfIwBJKMmuPX7tJzANBgkqhkiG9w0BAQwFADB+MQsw
# CQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEn
# MCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYDVQQD
# ExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMB4XDTIxMDUzMTA2NDMwNloXDTI5
# MDkxNzA2NDMwNlowgYAxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRl
# Y2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
# dXRob3JpdHkxJDAiBgNVBAMTG0NlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMjCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL35ePjm1YAMZJ2GG5ZkZz8i
# Oh51AX3v+1xnjMnMXGupkea5QuUgS5vam3u5mV3Zm4BL14RAKyfT6Lowuz4JGqdJ
# le8rQCTCl8en7psl76gKAJeFWqqd3CnJ4jUH63BNStbBs1a4oUE4m9H7MX+P4F/h
# sT8PjhZJYNcGjRj5qiYQqyrT0NFnjRtGvkcw1S5y0cVj2udjeUR+S2MkiYYuND8p
# TFKLKqfA4pEoibnAW/kd2ecnrf+aApfBxlCSmwIsvam5NFkKv4RK/9/+s5/r2Z7g
# mCPspmt3FirbzK07HKSH3EZzXhliaEVX5JCCQrtC1vBh4MGjPWajXfQY7ojJjRdF
# KZkydQIx7ikmyGsC5rViRX83FVojaInUPt5OJ7DwQAy8TRfLTaKzHtAGWt32k89X
# dZn1+oYaZ3izv5b+NNy951JW5bPldXvXQZEF3F1p45UNQ7n8g5Y5lXtsgFpPE3LG
# 130pekS6UqQq1UFGCSD+IqC2WzCNvIkM1ddw+IdS/drvrFEuB7NO/tAJ2nDvmPpW
# 5m3btVdL3OUsJRXIni54TvjanJ6GLMpX8xrlyJKLGoKWesO8UBJp2A5aRos66yb6
# I8m2sIG+QgCk+Nb+MC7H0kb25Y51/fLMudCHW8wGEGC7gzW3XmfeR+yZSPGkoRX+
# rYxijjlVTzkWubFjnf+3AgMBAAGjggE+MIIBOjAPBgNVHRMBAf8EBTADAQH/MB0G
# A1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAfBgNVHSMEGDAWgBQIds3LB/8k
# 9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYwLwYDVR0fBCgwJjAkoCKgIIYe
# aHR0cDovL2NybC5jZXJ0dW0ucGwvY3RuY2EuY3JsMGsGCCsGAQUFBwEBBF8wXTAo
# BggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNvbTAxBggrBgEF
# BQcwAoYlaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2N0bmNhLmNlcjA5BgNV
# HSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0cDovL3d3dy5jZXJ0dW0u
# cGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4IBAQBRwqFYFiIQi/yGMdTCMtNc+EuiL2o+
# TfirCB7t1ej65wgN7LfGHg6ydQV6sQv613RqAAYfpM6q8mt92BHAEQjUDk1hxTqo
# +rHh45jq4mP9QfWTfQ28XZI7kZplutBfTL5MjWgDEBbV8dAEioUz+TfnWy4maUI8
# us281HrpTZ3a50P7Y1KAhQTEJZVV8H6nnwHFWyj44M6GcKYnOzn7OC6YU2UidS3X
# 9t0iIpGW691o7T+jGZfTOyWI7DYSPal+zgKNBZqSpyduRbKcYoY3DaQzjteoTtBK
# F0NMxfGnbNIeWGwUUX6KVKH27595el2BmhaQD+G78UoA+fndvu2q7M4KMIIGuTCC
# BKGgAwIBAgIRAOf/acc7Nc5LkSbYdHxopYcwDQYJKoZIhvcNAQEMBQAwgYAxCzAJ
# BgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScw
# JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJDAiBgNVBAMT
# G0NlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMjAeFw0yMTA1MTkwNTMyMDdaFw0z
# NjA1MTgwNTMyMDdaMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0
# YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAy
# MSBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOkSHwQ17bldesWm
# lUG+imV/TnfRbSV102aO2/hhKH9/t4NAoVoipzu0ePujH67y8iwlmWuhqRR4xLeL
# dPxolEL55CzgUXQaq+Qzr5Zk7ySbNl/GZloFiYwuzwWS2AVgLPLCZd5DV8QTF+V5
# 7Y6lsdWTrrl5dEeMfsxhkjM2eOXabwfLy6UH2ZHzAv9bS/SmMo1PobSx+vHWST7c
# 4aiwVRvvJY2dWRYpTipLEu/XqQnqhUngFJtnjExqTokt4HyzOsr2/AYOm8YOcoJQ
# xgvc26+LAfXHiBkbQkBdTfHak4DP3UlYolICZHL+XSzSXlsRgqiWD4MypWGU4A13
# xiHmaRBZowS8FET+QAbMiqBaHDM3Y6wohW07yZ/mw9ZKu/KmVIAEBhrXesxifPB+
# DTyeWNkeCGq4IlgJr/Ecr1px6/1QPtj66yvXl3uauzPPGEXUk6vUym6nZyE1IGXI
# 45uGVI7XqvCt99WuD9LNop9Kd1LmzBGGvxucOo0lj1M3IRi8FimAX3krunSDguC5
# HgD75nWcUgdZVjm/R81VmaDPEP25Wj+C1reicY5CPckLGBjHQqsJe7jJz1CJXBMU
# tZs10cVKMEK3n/xD2ku5GFWhx0K6eFwe50xLUIZD9GfT7s/5/MyBZ1Ep8Q6H+GMu
# udDwF0mJitk3G8g6EzZprfMQMc3DAgMBAAGjggFVMIIBUTAPBgNVHRMBAf8EBTAD
# AQH/MB0GA1UdDgQWBBS+VAIvv0Bsc0POrAklTp5DRBru4DAfBgNVHSMEGDAWgBS2
# oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYI
# KwYBBQUHAwgwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL2NybC5jZXJ0dW0ucGwv
# Y3RuY2EyLmNybDBsBggrBgEFBQcBAQRgMF4wKAYIKwYBBQUHMAGGHGh0dHA6Ly9z
# dWJjYS5vY3NwLWNlcnR1bS5jb20wMgYIKwYBBQUHMAKGJmh0dHA6Ly9yZXBvc2l0
# b3J5LmNlcnR1bS5wbC9jdG5jYTIuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQG
# CCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEM
# BQADggIBALiTWXfJTBX9lAcIoKd6oCzwQZOfARQkt0OmiQ390yEqMrStHmpfycgg
# fPGlBHdMDDYhHDVTGyvY+WIbdsIWpJ1BNRt9pOrpXe8HMR5sOu71AWOqUqfEIXaH
# WOEs0UWmVs8mJb4lKclOHV8oSoR0p3GCX2tVO+XF8Qnt7E6fbkwZt3/AY/C5KYzF
# ElU7TCeqBLuSagmM0X3Op56EVIMM/xlWRaDgRna0hLQze5mYHJGv7UuTCOO3wC1b
# zeZWdlPJOw5v4U1/AljsNLgWZaGRFuBwdF62t6hOKs86v+jPIMqFPwxNJN/ou22D
# qzpP+7TyYNbDocrThlEN9D2xvvtBXyYqA7jhYY/fW9edUqhZUmkUGM++Mvz9lyT/
# nBdfaKqM5otK0U5H8hCSL4SGfjOVyBWbbZlUIE8X6XycDBRRKEK0q5JTsaZksoKa
# bFAyRKJYgtObwS1UPoDGcmGirwSeGMQTJSh+WR5EXZaEWJVA6ZZPBlGvjgjFYaQ0
# kLq1OitbmuXZmX7Z70ks9h/elK0A8wOg8oiNVd3o1bb59ms1QF4OjZ45rkWfsGuz
# 8ctB9/leCuKzkx5Rt1WAOsXy7E7pws+9k+jrePrZKw2DnmlNaT19QgX2I+hFtvhC
# 6uOhj/CgjVEA4q1i1OJzpoAmre7zdEg+kZcFIkrDHgokA5mcIMK1MIIGgjCCBGqg
# AwIBAgIQKPB3wRw2vf5fdDJHcCcuAzANBgkqhkiG9w0BAQwFADBWMQswCQYDVQQG
# EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQwIgYDVQQD
# ExtDZXJ0dW0gVGltZXN0YW1waW5nIDIwMjEgQ0EwHhcNMjYwMzExMDczNDU0WhcN
# MzYwMjI3MDczNDU0WjBQMQswCQYDVQQGEwJQTDEhMB8GA1UECgwYQXNzZWNvIERh
# dGEgU3lzdGVtcyBTLkEuMR4wHAYDVQQDDBVDZXJ0dW0gVGltZXN0YW1wIDIwMjYw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4vc3wcPsSNdoYthfbjUAT
# Tkk5EyItd37odw4lsmyOd/dmwXycOrTu8w7O1Kj/63o1X+MRU1N1zTj7LjhZD+Uj
# xbJ1sJ91SS/jYTYbLro72LELWkJ7zaNcJOOq3k4MLNS/DhRHSmsYMqk+MzkMfNZi
# 8DWUqlzVPUa2/aACViReDMnc/gtXm7tA9Pr4DN7agEPE1NtN36oCgj6iHR5aGhah
# /XskfvLZ6ZstoZ5zefWTrZrLh3kcH+YkzoZYX9Hf6qqrizkiBj4BlS9R4+VwVKMd
# jhO7UEa/pf8cTWy+jrsATuAGthG7sWIN+3KV7+Ytv5Uy+DQEgf3bn/VuH4wN0aPh
# j/mwueJ9jmIjNwqvM/dno8fBeR1jtnuP++XgveQfbTMP3qu9dPRg8ltvtrreQZ9K
# PDFyUxEZMsrLVm6nJ1JKJgPe6n4gwsL6VrjjHX0zpLF3vUvsQ8TiWgm4sk4r4D7p
# cXE/rX0E0Vwa+VMLT73PiDZ2nzhIpc1RwNdbb/qR3Mpa8sQXNPHFIoX/7bapGUtG
# 5sd1cUGsvLqIWk6dP/xAgPb2BludUinSTCYV7ysiHQS8vFmDXIU7fMkSE7/QHcYP
# Sahro4fk5z9W1t2kIxbZRJe0s4DXiPDlQPwiQFllLkU9wLvU6DqR8v35a65J4TeI
# XhMO/+iCzL+B0rI9GGeKLQIDAQABo4IBUDCCAUwwdQYIKwYBBQUHAQEEaTBnMDsG
# CCsGAQUFBzAChi9odHRwOi8vc3ViY2EucmVwb3NpdG9yeS5jZXJ0dW0ucGwvY3Rz
# Y2EyMDIxLmNlcjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVt
# LmNvbTAfBgNVHSMEGDAWgBS+VAIvv0Bsc0POrAklTp5DRBru4DAMBgNVHRMBAf8E
# AjAAMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9zdWJjYS5jcmwuY2VydHVtLnBs
# L2N0c2NhMjAyMS5jcmwwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/
# BAQDAgeAMCIGA1UdIAQbMBkwCAYGZ4EMAQQCMA0GCyqEaAGG9ncCBQELMB0GA1Ud
# DgQWBBQjOWooq5oSp6Sn8h/5RZq/jf6CAzANBgkqhkiG9w0BAQwFAAOCAgEAZv6T
# m6wL3k6mBTwkrYcTVcAR01uE37gUGNihgnTJR+gC41T2H9lwETRjE10nEdCUNv3N
# i8S6aBx4UcMRX93fd9w4RUteua2I+oj0kCpuNa3PQDKUwozHZmotWivaPO9KTs08
# y0YVhVSMZvuUH/reFec9eLT6FLAFnX0Sg9Wc7833uQB5RPa8TmXBkTolC8bNxHX+
# 2SfEWSNI8w/Y7o9qBF9l0uwVSrjQitVtIdZo2qb9NvMqqPFLWYef9SG+PGMqfPAQ
# 2EoYeT0hlFLkubWF1X3HbiDwXtz3TU2EWHU+VTcZMC4IzMyHK/+kh9n3oxSQ45ws
# Y71y7mqxKyYPyHSPoV3RiAQ1Thr9c65BeJLaELxWSKeQyAGIdBsMlIXPO6qp+VGm
# E49vosogQ0jYe2hgq5LgJ6oO0Ie364V/kITBnifUqS6Zxu+qjfOYS8o72EeoEWIi
# 04/BuH8Y6leNNP27j8NKwaPciWcqv/HBnQjizzmH/aqXn03K2SnjvaYPlCR8fFAA
# W2k6os0cZvLFEhMnHHAghYSIrdwCP98BrkjgA3ogOu+jXEO/nbD9OGL873Te6U2T
# coOu9lqQQyXYNHiLR5eMqJrzXiDlodarOEKjlukyPDnLIuLkg0y6K8S1A5wU8CkM
# 86cXdWFHLRIEYd9kdCfRZBZHhK7iVPeEZYxa9bgxggamMIIGogIBATBqMFYxCzAJ
# BgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAi
# BgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQQIQaRJjbWkA+cUbSplc
# +/7v0DANBglghkgBZQMEAgEFAKCBiDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
# BDAcBgkqhkiG9w0BCQUxDxcNMjYxMDA3MTQyMTMxWjAcBgorBgEEAYI3AgELMQ4w
# DAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgYeMum0diD5jj/eotpRU9usYW
# VqBBdLGbGLAaC3BvWcMwDQYJKoZIhvcNAQEBBQAEggGAOdZl3/CmS+uWn/AsDCBD
# CP1Hi0AsVCyo8agMze9qTKnt6icAtnxs+DgN/jSCIn8lkNfG9CT5hD9Yw1qISZdc
# YvJxR9J5EBKfY9q81uqCZ1xiO/ey25RdOcDu8AB0x1gPCtjouO5XtEQAW2iFxPyM
# EeF8I9WAJXaPIq0VbGKsa5hD2gyOobAKaVPE8eAmaK0e/HNaubgafu+VDwB4GYvx
# +PHrXVWUEmVTMgNL8rwthTjlIl/UelNrM8q8q/4Z8LAt4lnmwx0uLQLycaUoPhTn
# cB6MIj/A4C9SJS9WbRN9z3om3RC5GavMssCnk9y/PsUT3Y1g3H9ij10kO3vvoU/H
# MVpf9VuTTKHrf/n0xmRtUrgm7S9bPwWfMIttyxhJ96DT6FyD7mni6B1Hy33zygg4
# 3Xo0H+Fg+cAfpc2qqUTnGjKXNP6+/VGOsmnRBJqfqcHfgE3Qi05spXD0gy8pDlw7
# N4i60SgjqA01tSPAcqmnZNy6YX9aOawkDuiOqJnJ+z7toYIEAjCCA/4GCSqGSIb3
# DQEJBjGCA+8wggPrAgEBMGowVjELMAkGA1UEBhMCUEwxITAfBgNVBAoTGEFzc2Vj
# byBEYXRhIFN5c3RlbXMgUy5BLjEkMCIGA1UEAxMbQ2VydHVtIFRpbWVzdGFtcGlu
# ZyAyMDIxIENBAhAo8HfBHDa9/l90MkdwJy4DMA0GCWCGSAFlAwQCAgUAoIIBVjAa
# BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MTAw
# NzE0MjEzMlowNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQghb6Q4QrSQ418ySi2r0iw
# mrIIF3zs+LASbFjTkQUlxDwwPwYJKoZIhvcNAQkEMTIEMGO8G/XkXlqMm9+1gYvW
# ejh+RKX2QXUeMih/dwA7jFvZue5olw+WxgEW9AmWCMzYHjCBnwYLKoZIhvcNAQkQ
# AgwxgY8wgYwwgYkwgYYEFFcUaEEMqFrzQk75FkpRNhD0042YMG4wWqRYMFYxCzAJ
# BgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAi
# BgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQQIQKPB3wRw2vf5fdDJH
# cCcuAzANBgkqhkiG9w0BAQEFAASCAgB5HMI6YvL+QKCULEzpaGfexzwVuLO7a2pG
# tqAynCZmJs7jBWY0DZ7Az0SKIDhVeP+0Kd2URS0SGTYKQeM9JD8nrazR0BojhJ8h
# fSTtjcW7TxOe1weaIxyrevDhOIlI2GgzFi3y8bRN4l02POy/MXWFqWozZ85RcGZb
# Txhxpmbk6YEtfHkQ2rTR6IYJffnQu3eVHLWPdKH1ypCankwabAe9ONXbg5h0S+O7
# MxwusANoVB38+5IskDUCDJ6kqMkNH472dniCbZrcfbLq4/AoL6kKvrXk6kizuEsm
# e/aTPpuuWOUApXmsNhWkZW1KnBwtT2LZNGPskaGnmsE3LKMHq29m9KQdcCgt2J0T
# SgACb3S9nctt5PL53JFtP6X6ahYASxptOft0zMOkyMGPkBjyFwyUbEE46iCc+H5I
# 8sSJ4m7kCVApHZelVP8js/G0KNrfAb9p98HLHc4twnCj30GwGMqMkJxJUjS3YqHm
# +VNx+xu3k1ZBy6N1mnplNYkrm6CAX+G2xhYKu31mGTIgDC5bPJvHkjFDAyY2r8jd
# HYqjwBgR4U0OnboREdzW6D71FanfrDRamPDBnVB53KO0er/dIHU2jSj/0NR5fj9t
# 7XL9cL/DgacCQ6+SHzyGcH8j0CAInWoziHwYMPTsn/NlJil+KZSJs7Tt8OjEekoF
# gb1Zl1Bt9Q==
# SIG # End signature block