Git.psd1
|
@{ # Script module or binary module file associated with this manifest. RootModule = 'Git.psm1' # Version number of this module. # Placeholder. build.ps1 derives the real version from CHANGELOG.md and # passes it to Build-Module via -SemVer; Build-Module rewrites this field # in the built manifest. Bumping it here has no effect. ModuleVersion = '2.0.0' # Supported PSEditions CompatiblePSEditions = @('Desktop', 'Core') # ID used to uniquely identify this module. # Preserved from the v1.x manifest. PSGallery uses GUID for module # identity; a new GUID would orphan upgraders, so this value is fixed. GUID = '5878A10C-EFEF-495E-AFF6-0C9347D4BDE7' # Author of this module Author = 'Manuel' # Company or vendor of this module CompanyName = 'mtb.me' # Copyright statement for this module Copyright = '(c) 2026 mtb.me. All rights reserved.' # Description of the functionality provided by this module Description = 'Common Git workflow helpers: branch maintenance, tagging, and repository synchronization.' # Minimum version of the PowerShell engine required by this module PowerShellVersion = '5.1' # Modules that must be imported into the global environment prior to importing this module. # Pinned to the minimum required Execution version; no upper bound. RequiredModules = @( @{ ModuleName = 'Execution'; ModuleVersion = '5.1.0' } ) # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. FunctionsToExport = @('Add-AssumedUnchanged','Add-GitTag','Clear-GitBranches','Invoke-Gitk','Invoke-GitkAll','Merge-GitAllRemoteBranches','Merge-GitBranchUseTheirs','Push-GitAllTrackedBranches','Remove-AssumedUnchanged','Remove-GitAllBranches','Reset-GitAllBranches','Set-GitTrackAllRemoteBranches','Set-GitTrackMatchedRemoteBranches','Update-GitAllBranches','Update-GitBranch') # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. CmdletsToExport = @() # Variables to export from this module VariablesToExport = @() # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. AliasesToExport = @('agt','cgb','gk','gka','pgst','ugab','ugb') # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. PrivateData = @{ PSData = @{ # Tags applied to this module. These help with module discovery in online galleries. Tags = @('Git', 'Branch', 'Tag', 'Workflow', 'PowerShell', 'Windows', 'PSEdition_Desktop', 'PSEdition_Core') # A URL to the license for this module. # Forward-looking pointer; LICENSE lands in PR 2. LicenseUri = 'https://github.com/ww3d/git/blob/main/LICENSE' # A URL to the main website for this project. ProjectUri = 'https://github.com/ww3d/git' # ReleaseNotes of this module. # Placeholder. build.ps1 extracts the matching version section # from CHANGELOG.md and writes it here in the built manifest via # Update-Metadata. Editing this here has no effect. ReleaseNotes = 'Git v2.0.0+sha.9c72bc1 ## [v2.0.0] - 2026-05-06 Major rewrite. Drops the `Common` and `SmartLogging` runtime dependencies, migrates every native git invocation to `Invoke-NativeCommand` from `Execution v5.1`, replaces the legacy `$Host.UI.PromptForChoice(...)` confirmation pattern with `SupportsShouldProcess`, fixes ten concrete bugs from the v1.x code, and ships a ModuleBuilder-driven build pipeline with CI and a Pester test suite. See the migration notes in [README.md](README.md) before upgrading. ### Added - `build.ps1` at repo root: ModuleBuilder pipeline with CHANGELOG-driven version derivation, BOM-less UTF-8 normalization of built artifacts, optional `-Sign` (Authenticode against `$env:GIT_SIGN_THUMBPRINT`) and optional `-Publish` to PSGallery. `-Publish` is gated on a populated `[Unreleased]`-empty CHANGELOG and a manifest version strictly greater than the latest PSGallery entry. (#1) - GitHub Actions CI at `.github/workflows/test.yml`. Builds, then runs `Test-ModuleManifest`, `Import-Module`, PSScriptAnalyzer (against source) and Pester (against the built artifact). Matrix: `windows-latest × {powershell, pwsh}`. (#1) - Pester 5.x test suite under `tests/`. 46 tests covering the 15 Public functions, the `Invoke-Git` wrapper contract, `Reset-GitAllBranches` confirm-propagation through the three composed Public calls, and the cross-cutting manifest invariants. - `Invoke-Git` private wrapper (`src/Git/Private/Invoke-Git.ps1`). Single funnel for every git invocation in the module. Two reasons: cross-module preference scoping (`-Confirm:$false` / `-WhatIf:$false` pinned on the inner call so the user-facing confirmation gate lives at the Public-function boundary, never on the bare git invocation - PowerShell does not propagate Confirm/WhatIf preferences across module SessionState), and PowerShell''s prefix-match defenses (`Invoke-Git` is intentionally NOT `[CmdletBinding()]` so that `-D` for `git branch -D` does not bind to `-Debug` and so that `-a`, `-t`, `-b`, `-s` etc. land in `$args` cleanly). (#1) - `Invoke-Gitk` / `Invoke-GitkAll`: `-NoWait` forwarding so `gk` / `gka` no longer block the prompt while the GUI is open. Extra arguments forwarded via `[Parameter(ValueFromRemainingArguments)]`. (#1) - `Update-GitBranch`: rebase-failure now emits a `Write-Warning` with recovery instructions ("Resolve conflicts and run `git rebase --continue`, or abort with `git rebase --abort`") before re-throwing, so the user does not have to consult docs after a conflict. (#1) - `Set-StrictMode -Version Latest` compliance throughout the module: defensive `@()`-wrapping of native-command results, explicit null-initialization before conditional blocks, parameter-set declarations on `Merge-GitAllRemoteBranches`. (#1) - `MIT LICENSE`, `README.md`, `CHANGELOG.md`, `.gitignore`. ### Changed (BREAKING) - `RequiredModules`: `Common` and `SmartLogging` are removed. The only remaining runtime dependency is `Execution >= 5.1.0` (pinned, no upper bound). Consumers that imported `Common` or `SmartLogging` transitively via `Git` must now import them explicitly. (#1) - `Merge-GitAllRemoteBranches`: parameter renamed from `-Strategie` (German typo) to `-Strategy`. No compatibility alias. Callers passing `-Strategie` need to update. (#1) - `Merge-GitAllRemoteBranches`: `-UseTheirs` and `-UseOurs` are now mutually exclusive via parameter sets (`Default` / `Theirs` / `Ours`). Passing both raises a parameter-set-resolution error rather than silently picking one. (#1) - `Clear-GitBranches`, `Add-AssumedUnchanged`, `Remove-AssumedUnchanged`: replace the legacy `$Host.UI.PromptForChoice(...)` confirmation pattern with standard `[CmdletBinding(SupportsShouldProcess, ConfirmImpact = ''High'')]` plus per-item `$PSCmdlet.ShouldProcess(...)`. Behaviour change for direct interactive use: prompts now appear per branch / per file rather than batch. The standard `[A]ll` answer at the confirm prompt accepts all remaining items in one keystroke. Trade-off: `-WhatIf`, `-Confirm:$false`, `$ConfirmPreference` and `Invoke-StubScript` preference-forwarding now work where they did not before. (#1) - All other state-changing Public functions (`Remove-GitAllBranches`, `Reset-GitAllBranches`, `Update-GitAllBranches`, `Update-GitBranch`, `Push-GitAllTrackedBranches`, `Merge-*`, `Set-GitTrack*`) gain `SupportsShouldProcess` with appropriate `ConfirmImpact`. They now honour `-WhatIf` and `-Confirm:$false` cleanly. (#1) - Build output moves to `_build/Git/` (was no build pipeline previously). Distribution / installation should target the built form (`Import-Module ./_build/Git/Git.psd1`); source-form `Import-Module ./src/Git/Git.psd1` still works for fast development iteration. (#1) ### Changed - All `Start-NativeExecution`-based and bare-`git`-based command invocations migrated to `Invoke-NativeCommand` from `Execution v5.1` (via the local `Invoke-Git` wrapper). Backend selection is automatic: ScriptBlock for status / state-change calls (faster), Process for `Invoke-Gitk` (`-NoWait` GUI). `$LASTEXITCODE`-checking is replaced by the wrapper''s exit-code surfacing combined with per-function `$ErrorActionPreference = ''Stop''`. (#1) - All `| Out-Null` suppressions replaced with `> $null` for parser-level performance (3-5x faster on PS 5.1, ~2x on PS 7) and consistency with `ww3d/execution`. Includes both source and Pester test files. (#2) - `New-GitTempBranchName` (private helper) renamed to `Get-GitTempBranchName`. Semantically more correct (returns a string, does not mutate state) and sidesteps an instability with `PSScriptAnalyzer`''s `PSUseShouldProcessForStateChangingFunctions` rule on the `windows-latest` pwsh runner. (#1) - `Push-GitAllTrackedBranches`, `Update-GitAllBranches`, `Merge-GitAllRemoteBranches`, `Merge-GitBranchUseTheirs`, `Remove-GitAllBranches`: working-tree restoration is now wrapped in `try/finally`. An interrupted multi-branch operation always returns the user to their original branch. Cleanup steps in `finally` are best-effort (each wrapped in its own `try/catch + Write-Debug`) so a cleanup failure cannot mask the original in-flight error. (#1) - Public/Private folder split with dot-sourcing loader. 15 Public functions under `src/Git/Public/`, 8 Private helpers under `src/Git/Private/`. Source `.psm1` is the loader; the built `.psm1` is concatenated by ModuleBuilder. (#1) - All Public functions get `[CmdletBinding()]`, `[OutputType()]` and comment-based help with realistic `.EXAMPLE` entries. (#1) - `# SIG #` Authenticode signature blocks removed from `Git.psd1` and `Git.psm1`. Source files are no longer signed; only the built artifact is, via `build.ps1 -Sign`. (#1) ### Fixed - `Update-GitBranch`: called undefined `Print-Warning`. Replaced with `Write-Warning`. Plus: redundant `for-each-ref` loop removed. The upstream ref was already resolved by `git rev-parse --abbrev-ref @{upstream}`; the loop both was an unnecessary O(n) and had a real correctness bug - it iterated upstreams of all local branches instead of confirming the current upstream''s existence, so the rebase silently skipped when the current branch was the only tracker of its upstream. (#1) - `Clear-GitBranches`: `$remoteGoneBranches` was conditionally initialized but unconditionally referenced (StrictMode crash). Now initialized to `@()` ahead of the conditional. Plus: branch-list concatenation is now defensively `@()`-wrapped per operand to handle the single-element collapse case (PowerShell `+` between two arrays where one is collapsed to a scalar by single-element auto-unwrapping). (#1) - `Add-GitTag`: doubled assignment `$shortSha = $shortSha = ...`. Trivial typo, dropped. (#1) - `Set-GitTrackAllRemoteBranches` / `Set-GitTrackMatchedRemoteBranches`: parameter casing inconsistency (`$RemoteRefs` declared, `$remoteRefs` referenced in body). Normalized to `$RemoteRefs`. (#1) - `Get-Distincted`: over-engineered with `[HashSet[Object]]` and a jagged `[object[][]]` parameter type. Replaced with `Where-Object { $_ } | Select-Object -Unique`; parameter type fixed to `[string[]]`. (#1) - `Get-GitMergedBranches`, `Get-GitRemoteGoneBranches`: returned implicit `$null` on error paths (StrictMode crash for callers). Now `return @()`. (#1) - `Update-GitBranch`: iterated captured native-command result without null-check (StrictMode crash on empty output). Now `@()`-wrapped. Pattern applied consistently across the module. (#1) - `$LASTEXITCODE` was silently ignored at roughly 90% of bare-`git` call sites. Now centralised: `Invoke-NativeCommand` (via `Invoke-Git`) raises a Write-Error on non-zero exit, combined with per-function `$ErrorActionPreference = ''Stop''`. (#1) - `Add-AssumedUnchanged` / `Remove-AssumedUnchanged`: `Get-Item` crashed on non-existent paths with an unfriendly stack. Now typed `catch [System.Management.Automation.ItemNotFoundException]` produces a clean `WriteError` ("Path not found: ..."); other exceptions (`Permission denied`, IO errors) `throw` with full detail rather than being misattributed as "Path not found". (#1) - `Get-RebasedAndSquashedBranches`: leaked merge state on Ctrl-C. Now `try/finally`-wrapped per branch with a `MERGE_HEAD`-gated `git merge --abort` in the `finally`. The `MERGE_HEAD` gate avoids the "fatal: There is no merge to abort" stderr that Pester surfaces as a `NativeCommandError` even with `-IgnoreExitCode`. (#1) ### Removed - `RequiredModules`: `Common`, `SmartLogging`. (#1) - The legacy `# SIG #` Authenticode signature blocks at the bottom of `Git.psd1` and `Git.psm1`. (#1) ### Note on v1.x The v1.x release history is not migrated into this changelog. The old manifest''s `ReleaseNotes` block was malformed (mixed bullet styles, leading whitespace) and was discarded during the PR 1 refactor. The v1.x packages remain on PSGallery as published; this changelog starts fresh from v2.0.0.' # Prerelease string of this module. # Placeholder. Build-Module derives this from the -SemVer suffix # passed by build.ps1 (e.g. '2.0.0-beta1' -> 'beta1'). Empty for # stable releases. Must exist as a property so Build-Module # rewrites it; otherwise it only emits a warning. Prerelease = '' } # End of PSData hashtable } # End of PrivateData hashtable } # SIG # Begin signature block # MIIn8gYJKoZIhvcNAQcCoIIn4zCCJ98CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDYfKhh1IF7uUkv # tc9Z5Guc+nFjHEWyvnfMJsl7hao1haCCIP4wggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggahMIIEiaADAgECAhAHhD2tAcEVwnTuQacoIkZ5MA0GCSqG # SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy # dXN0ZWQgUm9vdCBHNDAeFw0yMjA2MjMwMDAwMDBaFw0zMjA2MjIyMzU5NTlaMFox # CzAJBgNVBAYTAkxWMRkwFwYDVQQKExBFblZlcnMgR3JvdXAgU0lBMTAwLgYDVQQD # EydHb0dldFNTTCBHNCBDUyBSU0E0MDk2IFNIQTI1NiAyMDIyIENBLTEwggIiMA0G # CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCtHvQHskNmiqJndyWVCqX4FtYp5FfJ # LO9Sh0BuwXuvBeNYt21xf8h/pLJ/7YzeKcNq9z4zEhecqtD0xhbvSB8ksBAfWBMZ # O0NLfOT0j7WyNuD7rv+ZFza+mxIQ79s1dCiwUMwGonaoDK7mqZfDpKEExR6UyKBh # 3aatT73U2Imx/x+fYTmQFq+N8FrLs6Fh6YEGWJTgsxyw1fAChCfgtEcZkdtcgK7q # uqskHtW6PJ9l5VNJ7T3WXpznsOOxrz3qx0CzWjwK8+3Kv2X6piWvd8YRfAOycSrT # 4/PM0cHLFc5xs/4m/ek4FCnYSem43doFftBxZBQkHKoPW3Bt6VIrhVIwvO7hrUjh # chJJZYdSld3bANDviJ5/ToP7ENv97U9MtKFvmC5dzd1p4HxFR0p5wWmYQbW+y3RF # m0np6H9m57MUMNp0ysmdJjb0f7+dVLX3OEBUb6H+r1LRLZT/xEOTuwOxGg2S4w25 # KGL9SCBUW4nkBljPHeJToU+THt0P8ZQf4B9IFlGxtLK0g3uOAnwSFgKtmNjhkTl8 # caLAQwbgEINCqrhc0b6k2Z8+QwgVAL0nIuzM9ckKP8xtIcWg85L3/l0cTkHQde+j # KGDG2CdxBHtflLIUtwqD7JA2uCxWlIzRNgwT0kH2en0+QV8KziSGaqO2r06kwboq # 2/xy4e98CEfSYwIDAQABo4IBWTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV # HQ4EFgQUyfwQ71DIy2t/vQhE7zpik+1bXpowHwYDVR0jBBgwFoAU7NfjgtJxXWRM # 3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMD # MHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl # cnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v # RGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAc # BgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATANBgkqhkiG9w0BAQsFAAOCAgEA # C9sK17IdmKTCUatEs7+yewhJnJ4tyrLwNEnfl6HrG8Pm7HZ0b+5Jc+GGqJT8kRc7 # mihuVrdsYNHdicueDL9imhtCusI/rUmjwhtflp+XgLkmgLGrmsEho1b+lGiRp7LC # /10di8SAOilDkHj5Zx142xRvBrrWj9eOdSGHwYubAsEd6CDojwcaVz9pfXMzYO3k # c0O6PXg1TkcgkYlCUAuDHuk/sZx68W0FVj1P2iMh+VUq9lL1puroAydoeWVUh/+c # MXeqfgpBqlAW+r8ma5F6yKL0stVQH8vYb1ES0mJSIPyIfkIjC1V0pbZS3p0QWsKa # afEor8fLfLNfSxntVI/ugut0+6ekluPWRpEXH+JAiNdRjbLbZchCREe3/Xl0Ylwk # A+eQVJfM0A7XiuFtY/mOpK2AN+E25t5mQYFhpdxZX5LTDKWgDnb+A6QnEt4iNyuk # cLaJuS8IPgPz0E2ALZLt3Rqs+lXifK/GwnNIWQNbf7FmLDB9ph8i8dvsR1hsjc2K # PEW4bAsbvLcz8hN1zE1/QbOV92vDGoFjwZOi2koQ+UyEh0e8jDFHAKJeTI+p8EPE # /mqvojLFAnt31yXIA2tjt0ERtsjkhBNmZY6SEOfnIoOwvyqavLPya1Ut3/2cOFLu # NQ8Ql6HaZsNQErnnzn+ZEAaUTkPZaeVyoHIkODECLzkwgga0MIIEnKADAgECAhAN # x6xXBf8hmS5AQyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUw # EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x # ITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAw # MDBaFw0zODAxMTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp # Q2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3Rh # bXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC0eDHTCphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMs # VO1DahGPNRcybEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4 # kftn5B1IpYzTqpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8 # BLuxBG5AvftBdsOECS1UkxBvMgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2 # Ws3IfDReb6e3mmdglTcaarps0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwF # t+cVFBURJg6zMUjZa/zbCclF83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9o # HRaQT/aofEnS5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq # 6gbylsXQskBBBnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+r # x3rKWDEJlIqLXvJWnY0v5ydPpOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvU # BDx6z1ev+7psNOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl # 9VnePs6BaaeEWvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwID # AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunk # Bnx6yuKQVvYv1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w # DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB # BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG # AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz # dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4H # PRF2cTC9vgvItTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qE # JPe36zwbSI/mS83afsl3YTj+IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy # 9lMDPjTLxLgXf9r5nWMQwr8Myb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe # 9Vj2AIMD8liyrukZ2iA/wdG2th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1U # H410ANVko43+Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6 # A47OvgRaPs+2ykgcGV00TYr2Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjs # Yg39OlV8cipDoq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0 # vw9vODRzW6AxnJll38F0cuJG7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/D # Jbg3s6KCLPAlZ66RzIg9sC+NJpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHb # xtl5TPau1j/1MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAP # vIXKUjPSxyZsq8WhbaM2tszWkPZPubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC # 0cR2p5V0aDANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO # RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt # ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAw # MFoXDTM2MDkwMzIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD # ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1l # c3RhbXAgUmVzcG9uZGVyIDIwMjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC # AgoCggIBANBGrC0Sxp7Q6q5gVrMrV7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA # 69HFTBdwbHwBSOeLpvPnZ8ZN+vo8dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6w # W2R6kSu9RJt/4QhguSssp3qome7MrxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00 # Cll8pjrUcCV3K3E0zz09ldQ//nBZZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOM # A3CoB/iUSROUINDT98oksouTMYFOnHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmot # uQhcg9tw2YD3w6ySSSu+3qU8DD+nigNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1O # pbybpMe46YceNA0LfNsnqcnpJeItK/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeH # VZlc4seAO+6d2sC26/PQPdP51ho1zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1r # oSrgHjSHlq8xymLnjCbSLZ49kPmk8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSURO # wnu7zER6EaJ+AliL7ojTdS5PWPsWeupWs7NpChUk555K096V1hE0yZIXe+giAwW0 # 0aHzrDchIc2bQhpp0IoKRR7YufAkprxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGV # MIIBkTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM # 6DAfBgNVHSMEGDAWgBTvb1NK6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMC # B4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQG # CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKG # UWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRp # bWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSg # UqBQhk5odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRU # aW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAI # BgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcE # ua5gQezRCESeY0ByIfjk9iJP2zWLpQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/Ym # RDfxT7C0k8FUFqNh+tshgb4O6Lgjg8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8 # AQ/UdKFOtj7YMTmqPO9mzskgiC3QYIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/E # ABgfZXLWU0ziTN6R3ygQBHMUBaB5bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQ # VTeLni2nHkX/QqvXnNb+YkDFkxUGtMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gV # utDojBIFeRlqAcuEVT0cKsb+zJNEsuEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85 # EE8LUkqRhoS3Y50OHgaY7T/lwd6UArb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hg # gt8l2Yv7roancJIFcbojBcxlRcGG0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJ # gKf47CdxVRd/ndUlQ05oxYy2zRWVFjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLv # UxxVZE/rptb7IRE2lskKPIJgbaP5t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7P # OGT75qaL6vdCvHlshtjdNXOCIUjsarfNZzCCBxswggUDoAMCAQICEAYFIuuX3jJX # cLz8AeYyZmYwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCTFYxGTAXBgNVBAoT # EEVuVmVycyBHcm91cCBTSUExMDAuBgNVBAMTJ0dvR2V0U1NMIEc0IENTIFJTQTQw # OTYgU0hBMjU2IDIwMjIgQ0EtMTAeFw0yNTEyMjkwMDAwMDBaFw0yNjEyMjgyMzU5 # NTlaMGExCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xETAPBgNVBAcTCEZh # cmNoYW50MRYwFAYDVQQKEw1NYW51ZWwgVGFuemVyMRYwFAYDVQQDEw1NYW51ZWwg # VGFuemVyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuxv/b0+nhaEE # 94ewtCEHJFhCdgrwn6iF1lZ41Y40alX0LnSGBniZxw480yw+F9o6qhhprIpKvEoW # WW1q+KNMxjdbLgKPlMcudU8DTfUVxKRxlVuqSMdizawGlQgwtwrj5RDsWEE2k0nq # guNejIRWrWDn6JblBaj/WIx8DZ9YuYl6egi/KtJF5lYC6StOgymjFdZQ6WKs5v9Q # IZMCvMw0BqpthVkFUXEQ07J49/h50bkl1dfNAnT2K8V2QeVGuJ5YOSs3GFMXiAxZ # g6LJTHT0poTL5I5XD62X9xQ56LMRa9IDmFx6x4sMDrkn5oNVSGw7Vmx7cnI/5u1C # 1pEymuN8vTa3DeMcVOngt7k9wRLyA+OTzdlobO+o+Hfr2S9zFVh+7PVDC0wUzrTd # W7u1c63IK89HPHnTc37lnGFQUGPXYKXIooN6UhIbHRDTUFVO/sH2LysKLRyFWEs8 # qdOsszmx2zL+WNKmjrBmQBvPzrV7IimT6rpmpCYxEnoY/bFvXsmK5avv/Osj+efn # GkCc9hm7oLxy494MFy3u5S1XqkB0jweBCJo750sGG3N8QapKAicVYobSXBdeLxsm # H82yzsczRNPRAdyAGbFIe5vVpl43OSwclH9gRpREbdE63Bb8Uvyn+8FqECSb1f7N # uLXsMwue6nHTf7Lc/u48srSd6yRnY70CAwEAAaOCAdQwggHQMB8GA1UdIwQYMBaA # FMn8EO9QyMtrf70IRO86YpPtW16aMB0GA1UdDgQWBBREAaQBaa2AQTUPKUUkMbf9 # S5f5sDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v # d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoG # CCsGAQUFBwMDMIGXBgNVHR8EgY8wgYwwRKBCoECGPmh0dHA6Ly9jcmwzLmRpZ2lj # ZXJ0LmNvbS9Hb0dldFNTTEc0Q1NSU0E0MDk2U0hBMjU2MjAyMkNBLTEuY3JsMESg # QqBAhj5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vR29HZXRTU0xHNENTUlNBNDA5 # NlNIQTI1NjIwMjJDQS0xLmNybDCBgwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzAB # hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9j # YWNlcnRzLmRpZ2ljZXJ0LmNvbS9Hb0dldFNTTEc0Q1NSU0E0MDk2U0hBMjU2MjAy # MkNBLTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBABqpRiImY/Bk # WSYmqNEZsmjcqPNRBEp9bYFMylajgTFR7dOLqF9sCStkO+cs/X64RKHkZtlaCrQa # ecZp6j/Dpq1fnkp2NfwuAaX2Osp/h6tMKnjaun3gvTdmI/j2iyJv6YJRxZ7daee7 # q9bkPzCTINwNc7AqWHbZ3Whlg+MmhLXaFHpoasR5JO9Vh+A8z8Y593G1bc7/Wjp2 # JWBNrCLjSUuz83YcDtf7yaURHuoJ96NDrHpbggaYU1s75sMhfBwAMTuYN2HmQe6/ # ShmDwGPtNzja0OtUdL0siHUp3Gouuqiux+ii7sjK0BDqvW3cbIQhCY41HkrJt4YF # e+KAUzZXeger2mTb9StmWLTLuqTKvUnCpzsVlqEO1I6NwsXgV2u46/0EYqk42vBT # e1vwXXj2Eawp5g4sSHQqbcxTAr/H5wZDIMp32tSyDMqV7zXhT6UWvxy5xua9Zkvf # j7bn7CzUWgX/+GMyP8KlgXEDG5rCY1uSxleFBvn0ACZjWRp+kWl17WbdrIL22Kkl # 2s1px/g9dfRbhHwNVAX1Mx2S7uCreeRs5qAA1cEjct2ulpNIbuPAEDDKenUHDTfN # k0osUL9uaOjSx6HiVkcwPHgFzyMyu+SCVOUTpBhwBXIH+/r77s6XVnQWmjUHcZUY # Y6KuwZiQ+E7joeAaZ0JGyW+LWx8WPfg7MYIGSjCCBkYCAQEwbjBaMQswCQYDVQQG # EwJMVjEZMBcGA1UEChMQRW5WZXJzIEdyb3VwIFNJQTEwMC4GA1UEAxMnR29HZXRT # U0wgRzQgQ1MgUlNBNDA5NiBTSEEyNTYgMjAyMiBDQS0xAhAGBSLrl94yV3C8/AHm # MmZmMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAw # GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG # AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIMV+n4lDMYbFlwZq75TXnftq8DR17Fce # 42ShoN4g2EpkMA0GCSqGSIb3DQEBAQUABIICAD19OtLrRDKpWvkQljDP6Tw/R3GS # aij819UnKkL86Mw+ZKxlOv3Z2friEf06awvkwWr7QCk62PniwA40j7654Fn4Cf6J # Sv/6Jy9nXedjuGk5K4L29Vk6VQQVYxCA/qnGO/FeU751+M0z+NRGMIeJjq0CaItq # TQ/dbM7/h3AfwjSY/B+Kcfrx1SrnIWfLnIOhOTcgnXs/zAA7hgCvjxR/sG+fzL5o # JJjv6O4jmfdxsDpP8ofhBsg1IoWkqiEFNt9d1augHpTuNSWZXeqM4hdx4gFj8JJD # eOUiKFYFFsW1h9aSrnoxgmPsNmLYE4OY0Cvp5919JE1BKdzI6w+Awanf3T/TMRm5 # vuamy9N1wIfH+KhPAuzS+AWM9x8GoHdBMw0AzkAUJjgD0fVOY9LpMkf3/ad2zmv4 # g5kIv8kpLJQBkAeqalo8RwJ/FSCf8wjrQ2wIJX9HIq6qthii9qUNN3+9j0+2vk8h # Kbje5uan81IvA/zJh/QU9TMmaHcVJHt08Oa4mh+WLur8KKpdebtFELDaTZKqvQlz # jNsOJoqw0wYVaVLV49OcsXXVmC9mvVG9ltBTLQodiFCK0/0PIVZk9B8ZUIMuz5mF # fGyfaJfPaIK34WGtmAYpjY1V1vzttCdtimlr3rfDX4Tv4VtWWjj6n9DrVCwuQ+TB # G4wv6wi2QuCKRdXhoYIDJjCCAyIGCSqGSIb3DQEJBjGCAxMwggMPAgEBMH0waTEL # MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhE # aWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAy # MDI1IENBMQIQCoDvGEuN8QWC0cR2p5V0aDANBglghkgBZQMEAgEFAKBpMBgGCSqG # SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI2MDUwNjEyMzAz # MFowLwYJKoZIhvcNAQkEMSIEIHNK5/MG2sxo5PYtgIifV2F3rNVquHZUbQUC/E98 # 7ohvMA0GCSqGSIb3DQEBAQUABIICAANbzcqj1YArrmsozYBcMuwsaF1wig2AXbGt # hwWsPwEEqAW8A2TVRtXZOyGE0r/kh1DFH9DoXAyAYlhr4zgIiWNvEe+9SdkorIQK # wmF91vFYgVvV91SYBC7qLjtqr2EyR+6+rT3fxO+SHk0qfkgrFK/evd5UJoG/KE/m # Qp6kLSnsyg88iPD8BesuV76591OL4GIStMYKyILZ+nSE/K3ayVftoiguadP9kuOB # EAIy8oMVx4tZNYwe48Le5osjj6rl+Q0wa8vzPpzQ78U6sHHZCCsX+8T7G6GMUW2T # U5tlS1HIeuT2Vk6p28mg5PHEW1L3p7gtIJHhWp3XxUWSvchw32Vor7x7HUXRYnAF # phyh/M0W7uyy9zTQL8tuUQZv+HLK7TyXsHo8b4Wxj6QHd++woWbkMpdLLIHYLa3b # 1foTezscC/6Nnq/klZUrpfoNtzmXKGuNF8mRU00tYEJY2ymi6ksXrkFgU7+7pQwW # XkvVnNA0KcvnoD09wEMKw77PVtL6AN8TIeUj6Y9ezjkD+A1YNm0LNNG6qrPZsYie # iAneP7Dk0G7j3zHIapHG1Io5BOXhAZSx80WqpXvfd1TDtBXik1dKjqSdI7xgN6YI # 0XW/ZDG0VhxI++JLLysM5x3xQ4roTC1H9rQ8QHW37ao0HYR9n7VKxZ/JQoN68Zjp # PEI8AF5l # SIG # End signature block |