Disable Windows Security Health UDK
- Windows onlyThis script improves your privacy on Windows
- Single actionThis page belongs to a script, containing basic changes to achieve a task.
- Impact: High
System Functionality / Data Loss Risk: High
This action improves privacy with high impact when you run the recommended script.
- Batch (batchfile)These changes use Windows system commands to update your settings.
- Administrator rights requiredThis script requires privilege access to do the system changes
- Fully reversible
You can fully restore this action (revert back to the original behavior) using this website.
The restore/revert methods provided here can help you fix issues.
Overview
This script disables the Windows Security Health UDK component.
The Windows Security Health UDK is a core library that manages key aspects of Windows Security 1 2. UDK stands for Undocked Developer Kit 3, Undocked Dev Kit 4, Windows UDK 3 4. It's also referred to as Undocked Shell 5. It coordinates shell experiences (user interfaces) 6 and adds new features to the Windows desktop independently of full system updates 5.
This component's key functions include:
- Providing security-related services 1
- Managing security policies 1 2
- Gathering system information 1 2
- Handling event logging 1 2
- Performing cryptographic operations 1
- Managing user accounts and sessions 1 2
- Supporting Windows Defender features 1 2
- Managing containerization and virtualization 1 2
- Configuring firewall settings 2
This script may enhance privacy by limiting the system's ability to collect and process security-related data. It may also increase system performance by reducing background processes related to security monitoring.
However, disabling this component may significantly weaken your system's security. According to community reports, it may disable the Windows Security background service and interface 7. This may leave your system more vulnerable to threats.
This action may expose your system to additional security threats, especially if you're unfamiliar with security management.
Technical Details
The library is located at %SYSTEMROOT%\System32\SecurityHealthUdk.dll
1 2 8.
- Not Advised
This script should only be used by advanced users.
This script is not recommended for daily use as it breaks important functionality.
Consider creating a system restore point before doing any changes.
- Security Trade-off
This action prioritizes privacy over certain security features. It's not recommended and should only be used by advanced users after understanding its implications.
Increased Privacy
Enhanced privacy through reduced data collection and trackingDecreased Security
Some security features will be disabled or limitedThis script can be reversed, this action allows you to can restore the system security.
Sources
- 10_0_22622_601/C/Windows/System32/SecurityHealthUdk.dll.coff at c598035e1a6627384d646140fe9e4d234b36b11d · privacysexy-forks/10_0_22622_601. github.com. (2024).
Original: https://github.com/privacysexy-forks/10_0_22622_601/blob/c598035e1a6627384d646140fe9e4d234b36b11d/C/Windows/System32/SecurityHealthUdk.dll.coff
Archived: https://web.archive.org/web/20240919114317/https://github.com/privacysexy-forks/10_0_22622_601/blob/c598035e1a6627384d646140fe9e4d234b36b11d/C/Windows/System32/SecurityHealthUdk.dll.coff - 10_0_22622_601/C/Windows/System32/SecurityHealthUdk.dll.strings at c598035e1a6627384d646140fe9e4d234b36b11d · privacysexy-forks/10_0_22622_601. github.com. (2024).
Original: https://github.com/privacysexy-forks/10_0_22622_601/blob/c598035e1a6627384d646140fe9e4d234b36b11d/C/Windows/System32/SecurityHealthUdk.dll.strings
Archived: https://web.archive.org/web/20240919114426/https://github.com/privacysexy-forks/10_0_22622_601/blob/c598035e1a6627384d646140fe9e4d234b36b11d/C/Windows/System32/SecurityHealthUdk.dll.strings - windowsudk.shellcommon.dll : Free .DLL download. - DLLme.com. www.dllme.com. (2024).
Original: https://www.dllme.com/dll/files/windowsudk_shellcommon
Archived: https://web.archive.org/web/20240321102101/https://www.dllme.com/dll/files/windowsudk_shellcommon - windowsudk.shellcommon.dll. Windows Undocked Dev Kit Shellcommon DLL. STRONTIC. strontic.github.io. (2024).
Original: https://strontic.github.io/xcyclopedia/library/windowsudk.shellcommon.dll-AA8B2A24FBC79C2F491B4A527B4A9A42.html
Archived: https://web.archive.org/web/20240321102221/https://strontic.github.io/xcyclopedia/library/windowsudk.shellcommon.dll-AA8B2A24FBC79C2F491B4A527B4A9A42.html - Latest Windows 10 20H1 Preview Build shows Microsoft is making the Windows 10 Shell piecemeal upgradable - MSPoweruser. mspoweruser.com. (2024).
Original: https://mspoweruser.com/latest-windows-10-20h1-preview-build-shows-microsoft-is-making-the-windows-10-shell-piecemeal-upgradable
Archived: https://web.archive.org/web/20240321105425/https://mspoweruser.com/latest-windows-10-20h1-preview-build-shows-microsoft-is-making-the-windows-10-shell-piecemeal-upgradable/ - Per-user services - Windows Application Management. Microsoft Learn. learn.microsoft.com. (2024).
Original: https://learn.microsoft.com/en-us/windows/application-management/per-user-services-in-windows
Archived: https://web.archive.org/web/20240119153912/https://learn.microsoft.com/en-us/windows/application-management/per-user-services-in-windows - Windows Security Service set to manual start, with no option to switch - Microsoft Community. answers.microsoft.com. (2024).
Original: https://answers.microsoft.com/en-us/windows/forum/all/windows-security-service-set-to-manual-start-with/cadb3956-7291-4213-ab32-cb011ee3388e
Archived: https://web.archive.org/web/20240912134346/https://answers.microsoft.com/en-us/windows/forum/all/windows-security-service-set-to-manual-start-with/cadb3956-7291-4213-ab32-cb011ee3388e - nickel-x64/WinSxS/Manifests/amd64_windows-shield-provider_31bf3856ad364e35_10.0.22621.1_none_078b8e81c1191957.manifest at b3f8c9549e49f2a92b401b3809b210d5f78190ba · privacysexy-forks/nickel-x64. github.com. (2024).
Original: https://github.com/privacysexy-forks/nickel-x64/blob/b3f8c9549e49f2a92b401b3809b210d5f78190ba/WinSxS/Manifests/amd64_windows-shield-provider_31bf3856ad364e35_10.0.22621.1_none_078b8e81c1191957.manifest
Archived: https://web.archive.org/web/20240912123628/https://github.com/privacysexy-forks/nickel-x64/blob/b3f8c9549e49f2a92b401b3809b210d5f78190ba/WinSxS/Manifests/amd64_windows-shield-provider_31bf3856ad364e35_10.0.22621.1_none_078b8e81c1191957.manifest
Apply Now
Choose one of three ways to apply:
Download script
Download and run the script directly- No app needed
- Offline usage
- Easy-to-apply
- Free
- Open-source
Help
How to apply or restore "Disable Windows Security Health UDK" using script
- ≈ 2 min to complete
- Tools: Web Browser
- Difficulty: Simple
- ≈ 5 instructions
- 1
Download
Download the script file by clicking on thebutton above.
Use button above to restore changes. - 2
Keep the file
If warned by your browser, keep the file. - 3
Open
Open the downloaded file. - 4
Exit
Once it's done, press any key to exit the window. - 5
Restart
Restart your computer for all changes to take effect.
Apply with privacy.sexy
Guided, automated application with safety checks- Recommended for most users
- Includes safety checks
- Free
- Open-source
- Popular
- Offline/Online usage
Help
How to apply or restore "Disable Windows Security Health UDK" using privacy.sexy
- ≈ 3 min to complete
- Tools: privacy.sexy
- Difficulty: Simple
- ≈ 4 instructions
- 2
Choose script
- Search for the script name: Disable Windows Security Health UDK
- Check the script by clicking on the checkbox.
- 3
Run
Click on ▶️ Run button at the bottom of the page.This button only appears on desktop version (recommended). On browser, use 💾 Save button.
- Apply
- Revert
:: Soft delete files matching pattern: "%SYSTEMROOT%\System32\SecurityHealthUdk.dll" with additional permissions
:: This operation will not run on Windows versions earlier than Windows11-FirstRelease.
PowerShell -ExecutionPolicy Unrestricted -Command "$versionName = 'Windows11-FirstRelease'; $buildNumber = switch ($versionName) { 'Windows11-FirstRelease' { '10.0.22000' }; 'Windows11-22H2' { '10.0.22621' }; 'Windows11-21H2' { '10.0.22000' }; 'Windows10-22H2' { '10.0.19045' }; 'Windows10-21H2' { '10.0.19044' }; 'Windows10-20H2' { '10.0.19042' }; 'Windows10-1909' { '10.0.18363' }; 'Windows10-1607' { '10.0.14393' }; default { throw "^""Internal privacy$([char]0x002E)sexy error: No build for minimum Windows '$versionName'"^""; }; }; $minVersion = [System.Version]::Parse($buildNumber); $ver = [Environment]::OSVersion.Version; $verNoPatch = [System.Version]::new($ver.Major, $ver.Minor, $ver.Build); if ($verNoPatch -lt $minVersion) { Write-Output "^""Skipping: Windows ($verNoPatch) is below minimum $minVersion ($versionName)"^""; Exit 0; }; $pathGlobPattern = "^""%SYSTEMROOT%\System32\SecurityHealthUdk.dll"^""; $expandedPath = [System.Environment]::ExpandEnvironmentVariables($pathGlobPattern); Write-Host "^""Searching for items matching pattern: `"^""$($expandedPath)`"^""."^""; $renamedCount = 0; $skippedCount = 0; $failedCount = 0; Add-Type -TypeDefinition "^""using System;`r`nusing System.Runtime.InteropServices;`r`npublic class Privileges {`r`n [DllImport(`"^""advapi32.dll`"^"", ExactSpelling = true, SetLastError = true)]`r`n internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,`r`n ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);`r`n [DllImport(`"^""advapi32.dll`"^"", ExactSpelling = true, SetLastError = true)]`r`n internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);`r`n [DllImport(`"^""advapi32.dll`"^"", SetLastError = true)]`r`n internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);`r`n [StructLayout(LayoutKind.Sequential, Pack = 1)]`r`n internal struct TokPriv1Luid {`r`n public int Count;`r`n public long Luid;`r`n public int Attr;`r`n }`r`n internal const int SE_PRIVILEGE_ENABLED = 0x00000002;`r`n internal const int TOKEN_QUERY = 0x00000008;`r`n internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;`r`n public static bool AddPrivilege(string privilege) {`r`n try {`r`n bool retVal;`r`n TokPriv1Luid tp;`r`n IntPtr hproc = GetCurrentProcess();`r`n IntPtr htok = IntPtr.Zero;`r`n retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);`r`n tp.Count = 1;`r`n tp.Luid = 0;`r`n tp.Attr = SE_PRIVILEGE_ENABLED;`r`n retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);`r`n retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);`r`n return retVal;`r`n } catch (Exception ex) {`r`n throw new Exception(`"^""Failed to adjust token privileges`"^"", ex);`r`n }`r`n }`r`n public static bool RemovePrivilege(string privilege) {`r`n try {`r`n bool retVal;`r`n TokPriv1Luid tp;`r`n IntPtr hproc = GetCurrentProcess();`r`n IntPtr htok = IntPtr.Zero;`r`n retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);`r`n tp.Count = 1;`r`n tp.Luid = 0;`r`n tp.Attr = 0; // This line is changed to revoke the privilege`r`n retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);`r`n retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);`r`n return retVal;`r`n } catch (Exception ex) {`r`n throw new Exception(`"^""Failed to adjust token privileges`"^"", ex);`r`n }`r`n }`r`n [DllImport(`"^""kernel32.dll`"^"", CharSet = CharSet.Auto)]`r`n public static extern IntPtr GetCurrentProcess();`r`n}"^""; [Privileges]::AddPrivilege('SeRestorePrivilege') | Out-Null; [Privileges]::AddPrivilege('SeTakeOwnershipPrivilege') | Out-Null; $adminSid = New-Object System.Security.Principal.SecurityIdentifier 'S-1-5-32-544'; $adminAccount = $adminSid.Translate([System.Security.Principal.NTAccount]); $adminFullControlAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( $adminAccount, [System.Security.AccessControl.FileSystemRights]::FullControl, [System.Security.AccessControl.AccessControlType]::Allow ); $foundAbsolutePaths = @(); try { $foundAbsolutePaths += @(; Get-Item -Path $expandedPath -ErrorAction Stop | Select-Object -ExpandProperty FullName; ); } catch [System.Management.Automation.ItemNotFoundException] { <# Swallow, do not run `Test-Path` before, it's unreliable for globs requiring extra permissions #>; }; $foundAbsolutePaths = $foundAbsolutePaths | Select-Object -Unique | Sort-Object -Property { $_.Length } -Descending; if (!$foundAbsolutePaths) { Write-Host 'Skipping, no items available.'; exit 0; }; Write-Host "^""Initiating processing of $($foundAbsolutePaths.Count) items from `"^""$expandedPath`"^""."^""; foreach ($path in $foundAbsolutePaths) { if (Test-Path -Path $path -PathType Container) { Write-Host "^""Skipping folder (not its contents): `"^""$path`"^""."^""; $skippedCount++; continue; }; if($revert -eq $true) { if (-not $path.EndsWith('.OLD')) { Write-Host "^""Skipping non-backup file: `"^""$path`"^""."^""; $skippedCount++; continue; }; } else { if ($path.EndsWith('.OLD')) { Write-Host "^""Skipping backup file: `"^""$path`"^""."^""; $skippedCount++; continue; }; }; $originalFilePath = $path; Write-Host "^""Processing file: `"^""$originalFilePath`"^""."^""; if (-Not (Test-Path $originalFilePath)) { Write-Host "^""Skipping, file `"^""$originalFilePath`"^"" not found."^""; $skippedCount++; exit 0; }; $originalAcl = Get-Acl -Path "^""$originalFilePath"^""; $accessGranted = $false; try { $acl = Get-Acl -Path "^""$originalFilePath"^""; $acl.SetOwner($adminAccount) <# Take Ownership (because file is owned by TrustedInstaller) #>; $acl.AddAccessRule($adminFullControlAccessRule) <# Grant rights to be able to move the file #>; Set-Acl -Path $originalFilePath -AclObject $acl -ErrorAction Stop; $accessGranted = $true; } catch { Write-Warning "^""Failed to grant access to `"^""$originalFilePath`"^"": $($_.Exception.Message)"^""; }; if ($revert -eq $true) { $newFilePath = $originalFilePath.Substring(0, $originalFilePath.Length - 4); } else { $newFilePath = "^""$($originalFilePath).OLD"^""; }; try { Move-Item -LiteralPath "^""$($originalFilePath)"^"" -Destination "^""$newFilePath"^"" -Force -ErrorAction Stop; Write-Host "^""Successfully processed `"^""$originalFilePath`"^""."^""; $renamedCount++; if ($accessGranted) { try { Set-Acl -Path $newFilePath -AclObject $originalAcl -ErrorAction Stop; } catch { Write-Warning "^""Failed to restore access on `"^""$newFilePath`"^"": $($_.Exception.Message)"^""; }; }; } catch { Write-Error "^""Failed to rename `"^""$originalFilePath`"^"" to `"^""$newFilePath`"^"": $($_.Exception.Message)"^""; $failedCount++; if ($accessGranted) { try { Set-Acl -Path $originalFilePath -AclObject $originalAcl -ErrorAction Stop; } catch { Write-Warning "^""Failed to restore access on `"^""$originalFilePath`"^"": $($_.Exception.Message)"^""; }; }; }; }; if (($renamedCount -gt 0) -or ($skippedCount -gt 0)) { Write-Host "^""Successfully processed $renamedCount items and skipped $skippedCount items."^""; }; if ($failedCount -gt 0) { Write-Warning "^""Failed to process $($failedCount) items."^""; }; [Privileges]::RemovePrivilege('SeRestorePrivilege') | Out-Null; [Privileges]::RemovePrivilege('SeTakeOwnershipPrivilege') | Out-Null"
Ijo6IFJlc3RvcmUgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybjogXCIlU1lTVEVNUk9PVCVcXFN5c3RlbTMyXFxTZWN1cml0eUhlYWx0aFVkay5kbGxcIiB3aXRoIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgXG46OiBUaGlzIG9wZXJhdGlvbiB3aWxsIG5vdCBydW4gb24gV2luZG93cyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gV2luZG93czExLUZpcnN0UmVsZWFzZS5cblBvd2VyU2hlbGwgLUV4ZWN1dGlvblBvbGljeSBVbnJlc3RyaWN0ZWQgLUNvbW1hbmQgXCIkdmVyc2lvbk5hbWUgPSAnV2luZG93czExLUZpcnN0UmVsZWFzZSc7ICRidWlsZE51bWJlciA9IHN3aXRjaCAoJHZlcnNpb25OYW1lKSB7ICdXaW5kb3dzMTEtRmlyc3RSZWxlYXNlJyB7ICcxMC4wLjIyMDAwJyB9OyAnV2luZG93czExLTIySDInIHsgJzEwLjAuMjI2MjEnIH07ICdXaW5kb3dzMTEtMjFIMicgeyAnMTAuMC4yMjAwMCcgfTsgJ1dpbmRvd3MxMC0yMkgyJyB7ICcxMC4wLjE5MDQ1JyB9OyAnV2luZG93czEwLTIxSDInIHsgJzEwLjAuMTkwNDQnIH07ICdXaW5kb3dzMTAtMjBIMicgeyAnMTAuMC4xOTA0MicgfTsgJ1dpbmRvd3MxMC0xOTA5JyB7ICcxMC4wLjE4MzYzJyB9OyAnV2luZG93czEwLTE2MDcnIHsgJzEwLjAuMTQzOTMnIH07IGRlZmF1bHQgeyB0aHJvdyBcIl5cIlwiSW50ZXJuYWwgcHJpdmFjeSQoW2NoYXJdMHgwMDJFKXNleHkgZXJyb3I6IE5vIGJ1aWxkIGZvciBtaW5pbXVtIFdpbmRvd3MgJyR2ZXJzaW9uTmFtZSdcIl5cIlwiOyB9OyB9OyAkbWluVmVyc2lvbiA9IFtTeXN0ZW0uVmVyc2lvbl06OlBhcnNlKCRidWlsZE51bWJlcik7ICR2ZXIgPSBbRW52aXJvbm1lbnRdOjpPU1ZlcnNpb24uVmVyc2lvbjsgJHZlck5vUGF0Y2ggPSBbU3lzdGVtLlZlcnNpb25dOjpuZXcoJHZlci5NYWpvciwgJHZlci5NaW5vciwgJHZlci5CdWlsZCk7IGlmICgkdmVyTm9QYXRjaCAtbHQgJG1pblZlcnNpb24pIHsgV3JpdGUtT3V0cHV0IFwiXlwiXCJTa2lwcGluZzogV2luZG93cyAoJHZlck5vUGF0Y2gpIGlzIGJlbG93IG1pbmltdW0gJG1pblZlcnNpb24gKCR2ZXJzaW9uTmFtZSlcIl5cIlwiOyBFeGl0IDA7IH07ICRyZXZlcnQgPSAkdHJ1ZTsgJHBhdGhHbG9iUGF0dGVybiA9IFwiXlwiXCIlU1lTVEVNUk9PVCVcXFN5c3RlbTMyXFxTZWN1cml0eUhlYWx0aFVkay5kbGwuT0xEXCJeXCJcIjsgJGV4cGFuZGVkUGF0aCA9IFtTeXN0ZW0uRW52aXJvbm1lbnRdOjpFeHBhbmRFbnZpcm9ubWVudFZhcmlhYmxlcygkcGF0aEdsb2JQYXR0ZXJuKTsgV3JpdGUtSG9zdCBcIl5cIlwiU2VhcmNoaW5nIGZvciBpdGVtcyBtYXRjaGluZyBwYXR0ZXJuOiBgXCJeXCJcIiQoJGV4cGFuZGVkUGF0aClgXCJeXCJcIi5cIl5cIlwiOyAkcmVuYW1lZENvdW50ICAgPSAwOyAkc2tpcHBlZENvdW50ICAgPSAwOyAkZmFpbGVkQ291bnQgICAgPSAwOyBBZGQtVHlwZSAtVHlwZURlZmluaXRpb24gXCJeXCJcInVzaW5nIFN5c3RlbTtgcmBudXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzO2ByYG5wdWJsaWMgY2xhc3MgUHJpdmlsZWdlcyB7YHJgbiAgICBbRGxsSW1wb3J0KGBcIl5cIlwiYWR2YXBpMzIuZGxsYFwiXlwiXCIsIEV4YWN0U3BlbGxpbmcgPSB0cnVlLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV1gcmBuICAgIGludGVybmFsIHN0YXRpYyBleHRlcm4gYm9vbCBBZGp1c3RUb2tlblByaXZpbGVnZXMoSW50UHRyIGh0b2ssIGJvb2wgZGlzYWxsLGByYG4gICAgICAgIHJlZiBUb2tQcml2MUx1aWQgbmV3c3QsIGludCBsZW4sIEludFB0ciBwcmV2LCBJbnRQdHIgcmVsZW4pO2ByYG4gICAgW0RsbEltcG9ydChgXCJeXCJcImFkdmFwaTMyLmRsbGBcIl5cIlwiLCBFeGFjdFNwZWxsaW5nID0gdHJ1ZSwgU2V0TGFzdEVycm9yID0gdHJ1ZSldYHJgbiAgICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGJvb2wgT3BlblByb2Nlc3NUb2tlbihJbnRQdHIgaCwgaW50IGFjYywgcmVmIEludFB0ciBwaHRvayk7YHJgbiAgICBbRGxsSW1wb3J0KGBcIl5cIlwiYWR2YXBpMzIuZGxsYFwiXlwiXCIsIFNldExhc3RFcnJvciA9IHRydWUpXWByYG4gICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiBib29sIExvb2t1cFByaXZpbGVnZVZhbHVlKHN0cmluZyBob3N0LCBzdHJpbmcgbmFtZSwgcmVmIGxvbmcgcGx1aWQpO2ByYG4gICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwsIFBhY2sgPSAxKV1gcmBuICAgIGludGVybmFsIHN0cnVjdCBUb2tQcml2MUx1aWQge2ByYG4gICAgICAgIHB1YmxpYyBpbnQgQ291bnQ7YHJgbiAgICAgICAgcHVibGljIGxvbmcgTHVpZDtgcmBuICAgICAgICBwdWJsaWMgaW50IEF0dHI7YHJgbiAgICB9YHJgbiAgICBpbnRlcm5hbCBjb25zdCBpbnQgU0VfUFJJVklMRUdFX0VOQUJMRUQgPSAweDAwMDAwMDAyO2ByYG4gICAgaW50ZXJuYWwgY29uc3QgaW50IFRPS0VOX1FVRVJZID0gMHgwMDAwMDAwODtgcmBuICAgIGludGVybmFsIGNvbnN0IGludCBUT0tFTl9BREpVU1RfUFJJVklMRUdFUyA9IDB4MDAwMDAwMjA7YHJgbiAgICBwdWJsaWMgc3RhdGljIGJvb2wgQWRkUHJpdmlsZWdlKHN0cmluZyBwcml2aWxlZ2UpIHtgcmBuICAgICAgICB0cnkge2ByYG4gICAgICAgICAgICBib29sIHJldFZhbDtgcmBuICAgICAgICAgICAgVG9rUHJpdjFMdWlkIHRwO2ByYG4gICAgICAgICAgICBJbnRQdHIgaHByb2MgPSBHZXRDdXJyZW50UHJvY2VzcygpO2ByYG4gICAgICAgICAgICBJbnRQdHIgaHRvayA9IEludFB0ci5aZXJvO2ByYG4gICAgICAgICAgICByZXRWYWwgPSBPcGVuUHJvY2Vzc1Rva2VuKGhwcm9jLCBUT0tFTl9BREpVU1RfUFJJVklMRUdFUyB8IFRPS0VOX1FVRVJZLCByZWYgaHRvayk7YHJgbiAgICAgICAgICAgIHRwLkNvdW50ID0gMTtgcmBuICAgICAgICAgICAgdHAuTHVpZCA9IDA7YHJgbiAgICAgICAgICAgIHRwLkF0dHIgPSBTRV9QUklWSUxFR0VfRU5BQkxFRDtgcmBuICAgICAgICAgICAgcmV0VmFsID0gTG9va3VwUHJpdmlsZWdlVmFsdWUobnVsbCwgcHJpdmlsZWdlLCByZWYgdHAuTHVpZCk7YHJgbiAgICAgICAgICAgIHJldFZhbCA9IEFkanVzdFRva2VuUHJpdmlsZWdlcyhodG9rLCBmYWxzZSwgcmVmIHRwLCAwLCBJbnRQdHIuWmVybywgSW50UHRyLlplcm8pO2ByYG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO2ByYG4gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge2ByYG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGBcIl5cIlwiRmFpbGVkIHRvIGFkanVzdCB0b2tlbiBwcml2aWxlZ2VzYFwiXlwiXCIsIGV4KTtgcmBuICAgICAgICB9YHJgbiAgICB9YHJgbiAgICBwdWJsaWMgc3RhdGljIGJvb2wgUmVtb3ZlUHJpdmlsZWdlKHN0cmluZyBwcml2aWxlZ2UpIHtgcmBuICAgICAgICB0cnkge2ByYG4gICAgICAgICAgICBib29sIHJldFZhbDtgcmBuICAgICAgICAgICAgVG9rUHJpdjFMdWlkIHRwO2ByYG4gICAgICAgICAgICBJbnRQdHIgaHByb2MgPSBHZXRDdXJyZW50UHJvY2VzcygpO2ByYG4gICAgICAgICAgICBJbnRQdHIgaHRvayA9IEludFB0ci5aZXJvO2ByYG4gICAgICAgICAgICByZXRWYWwgPSBPcGVuUHJvY2Vzc1Rva2VuKGhwcm9jLCBUT0tFTl9BREpVU1RfUFJJVklMRUdFUyB8IFRPS0VOX1FVRVJZLCByZWYgaHRvayk7YHJgbiAgICAgICAgICAgIHRwLkNvdW50ID0gMTtgcmBuICAgICAgICAgICAgdHAuTHVpZCA9IDA7YHJgbiAgICAgICAgICAgIHRwLkF0dHIgPSAwOyAgLy8gVGhpcyBsaW5lIGlzIGNoYW5nZWQgdG8gcmV2b2tlIHRoZSBwcml2aWxlZ2VgcmBuICAgICAgICAgICAgcmV0VmFsID0gTG9va3VwUHJpdmlsZWdlVmFsdWUobnVsbCwgcHJpdmlsZWdlLCByZWYgdHAuTHVpZCk7YHJgbiAgICAgICAgICAgIHJldFZhbCA9IEFkanVzdFRva2VuUHJpdmlsZWdlcyhodG9rLCBmYWxzZSwgcmVmIHRwLCAwLCBJbnRQdHIuWmVybywgSW50UHRyLlplcm8pO2ByYG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO2ByYG4gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkge2ByYG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGBcIl5cIlwiRmFpbGVkIHRvIGFkanVzdCB0b2tlbiBwcml2aWxlZ2VzYFwiXlwiXCIsIGV4KTtgcmBuICAgICAgICB9YHJgbiAgICB9YHJgbiAgICBbRGxsSW1wb3J0KGBcIl5cIlwia2VybmVsMzIuZGxsYFwiXlwiXCIsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8pXWByYG4gICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIEdldEN1cnJlbnRQcm9jZXNzKCk7YHJgbn1cIl5cIlwiOyBbUHJpdmlsZWdlc106OkFkZFByaXZpbGVnZSgnU2VSZXN0b3JlUHJpdmlsZWdlJykgfCBPdXQtTnVsbDsgW1ByaXZpbGVnZXNdOjpBZGRQcml2aWxlZ2UoJ1NlVGFrZU93bmVyc2hpcFByaXZpbGVnZScpIHwgT3V0LU51bGw7ICRhZG1pblNpZCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIgJ1MtMS01LTMyLTU0NCc7ICRhZG1pbkFjY291bnQgPSAkYWRtaW5TaWQuVHJhbnNsYXRlKFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLk5UQWNjb3VudF0pOyAkYWRtaW5GdWxsQ29udHJvbEFjY2Vzc1J1bGUgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKCAkYWRtaW5BY2NvdW50LCBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbVJpZ2h0c106OkZ1bGxDb250cm9sLCBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGVdOjpBbGxvdyApOyAkZm91bmRBYnNvbHV0ZVBhdGhzID0gQCgpOyB0cnkgeyAkZm91bmRBYnNvbHV0ZVBhdGhzICs9IEAoOyBHZXQtSXRlbSAtUGF0aCAkZXhwYW5kZWRQYXRoIC1FcnJvckFjdGlvbiBTdG9wIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgRnVsbE5hbWU7ICk7IH0gY2F0Y2ggW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uSXRlbU5vdEZvdW5kRXhjZXB0aW9uXSB7IDwjIFN3YWxsb3csIGRvIG5vdCBydW4gYFRlc3QtUGF0aGAgYmVmb3JlLCBpdCdzIHVucmVsaWFibGUgZm9yIGdsb2JzIHJlcXVpcmluZyBleHRyYSBwZXJtaXNzaW9ucyAjPjsgfTsgJGZvdW5kQWJzb2x1dGVQYXRocyA9ICRmb3VuZEFic29sdXRlUGF0aHMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUgfCBTb3J0LU9iamVjdCAtUHJvcGVydHkgeyAkXy5MZW5ndGggfSAtRGVzY2VuZGluZzsgaWYgKCEkZm91bmRBYnNvbHV0ZVBhdGhzKSB7IFdyaXRlLUhvc3QgJ1NraXBwaW5nLCBubyBpdGVtcyBhdmFpbGFibGUuJzsgZXhpdCAwOyB9OyBXcml0ZS1Ib3N0IFwiXlwiXCJJbml0aWF0aW5nIHByb2Nlc3Npbmcgb2YgJCgkZm91bmRBYnNvbHV0ZVBhdGhzLkNvdW50KSBpdGVtcyBmcm9tIGBcIl5cIlwiJGV4cGFuZGVkUGF0aGBcIl5cIlwiLlwiXlwiXCI7IGZvcmVhY2ggKCRwYXRoIGluICRmb3VuZEFic29sdXRlUGF0aHMpIHsgaWYgKFRlc3QtUGF0aCAtUGF0aCAkcGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyKSB7IFdyaXRlLUhvc3QgXCJeXCJcIlNraXBwaW5nIGZvbGRlciAobm90IGl0cyBjb250ZW50cyk6IGBcIl5cIlwiJHBhdGhgXCJeXCJcIi5cIl5cIlwiOyAkc2tpcHBlZENvdW50Kys7IGNvbnRpbnVlOyB9OyBpZigkcmV2ZXJ0IC1lcSAkdHJ1ZSkgeyBpZiAoLW5vdCAkcGF0aC5FbmRzV2l0aCgnLk9MRCcpKSB7IFdyaXRlLUhvc3QgXCJeXCJcIlNraXBwaW5nIG5vbi1iYWNrdXAgZmlsZTogYFwiXlwiXCIkcGF0aGBcIl5cIlwiLlwiXlwiXCI7ICRza2lwcGVkQ291bnQrKzsgY29udGludWU7IH07IH0gZWxzZSB7IGlmICgkcGF0aC5FbmRzV2l0aCgnLk9MRCcpKSB7IFdyaXRlLUhvc3QgXCJeXCJcIlNraXBwaW5nIGJhY2t1cCBmaWxlOiBgXCJeXCJcIiRwYXRoYFwiXlwiXCIuXCJeXCJcIjsgJHNraXBwZWRDb3VudCsrOyBjb250aW51ZTsgfTsgfTsgJG9yaWdpbmFsRmlsZVBhdGggPSAkcGF0aDsgV3JpdGUtSG9zdCBcIl5cIlwiUHJvY2Vzc2luZyBmaWxlOiBgXCJeXCJcIiRvcmlnaW5hbEZpbGVQYXRoYFwiXlwiXCIuXCJeXCJcIjsgaWYgKC1Ob3QgKFRlc3QtUGF0aCAkb3JpZ2luYWxGaWxlUGF0aCkpIHsgV3JpdGUtSG9zdCBcIl5cIlwiU2tpcHBpbmcsIGZpbGUgYFwiXlwiXCIkb3JpZ2luYWxGaWxlUGF0aGBcIl5cIlwiIG5vdCBmb3VuZC5cIl5cIlwiOyAkc2tpcHBlZENvdW50Kys7IGV4aXQgMDsgfTsgJG9yaWdpbmFsQWNsID0gR2V0LUFjbCAtUGF0aCBcIl5cIlwiJG9yaWdpbmFsRmlsZVBhdGhcIl5cIlwiOyAkYWNjZXNzR3JhbnRlZCA9ICRmYWxzZTsgdHJ5IHsgJGFjbCA9IEdldC1BY2wgLVBhdGggXCJeXCJcIiRvcmlnaW5hbEZpbGVQYXRoXCJeXCJcIjsgJGFjbC5TZXRPd25lcigkYWRtaW5BY2NvdW50KSA8IyBUYWtlIE93bmVyc2hpcCAoYmVjYXVzZSBmaWxlIGlzIG93bmVkIGJ5IFRydXN0ZWRJbnN0YWxsZXIpICM+OyAkYWNsLkFkZEFjY2Vzc1J1bGUoJGFkbWluRnVsbENvbnRyb2xBY2Nlc3NSdWxlKSA8IyBHcmFudCByaWdodHMgdG8gYmUgYWJsZSB0byBtb3ZlIHRoZSBmaWxlICM+OyBTZXQtQWNsIC1QYXRoICRvcmlnaW5hbEZpbGVQYXRoIC1BY2xPYmplY3QgJGFjbCAtRXJyb3JBY3Rpb24gU3RvcDsgJGFjY2Vzc0dyYW50ZWQgPSAkdHJ1ZTsgfSBjYXRjaCB7IFdyaXRlLVdhcm5pbmcgXCJeXCJcIkZhaWxlZCB0byBncmFudCBhY2Nlc3MgdG8gYFwiXlwiXCIkb3JpZ2luYWxGaWxlUGF0aGBcIl5cIlwiOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKVwiXlwiXCI7IH07IGlmICgkcmV2ZXJ0IC1lcSAkdHJ1ZSkgeyAkbmV3RmlsZVBhdGggPSAkb3JpZ2luYWxGaWxlUGF0aC5TdWJzdHJpbmcoMCwgJG9yaWdpbmFsRmlsZVBhdGguTGVuZ3RoIC0gNCk7IH0gZWxzZSB7ICRuZXdGaWxlUGF0aCA9IFwiXlwiXCIkKCRvcmlnaW5hbEZpbGVQYXRoKS5PTERcIl5cIlwiOyB9OyB0cnkgeyBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoIFwiXlwiXCIkKCRvcmlnaW5hbEZpbGVQYXRoKVwiXlwiXCIgLURlc3RpbmF0aW9uIFwiXlwiXCIkbmV3RmlsZVBhdGhcIl5cIlwiIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU3RvcDsgV3JpdGUtSG9zdCBcIl5cIlwiU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBgXCJeXCJcIiRvcmlnaW5hbEZpbGVQYXRoYFwiXlwiXCIuXCJeXCJcIjsgJHJlbmFtZWRDb3VudCsrOyBpZiAoJGFjY2Vzc0dyYW50ZWQpIHsgdHJ5IHsgU2V0LUFjbCAtUGF0aCAkbmV3RmlsZVBhdGggLUFjbE9iamVjdCAkb3JpZ2luYWxBY2wgLUVycm9yQWN0aW9uIFN0b3A7IH0gY2F0Y2ggeyBXcml0ZS1XYXJuaW5nIFwiXlwiXCJGYWlsZWQgdG8gcmVzdG9yZSBhY2Nlc3Mgb24gYFwiXlwiXCIkbmV3RmlsZVBhdGhgXCJeXCJcIjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSlcIl5cIlwiOyB9OyB9OyB9IGNhdGNoIHsgV3JpdGUtRXJyb3IgXCJeXCJcIkZhaWxlZCB0byByZW5hbWUgYFwiXlwiXCIkb3JpZ2luYWxGaWxlUGF0aGBcIl5cIlwiIHRvIGBcIl5cIlwiJG5ld0ZpbGVQYXRoYFwiXlwiXCI6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpXCJeXCJcIjsgJGZhaWxlZENvdW50Kys7IGlmICgkYWNjZXNzR3JhbnRlZCkgeyB0cnkgeyBTZXQtQWNsIC1QYXRoICRvcmlnaW5hbEZpbGVQYXRoIC1BY2xPYmplY3QgJG9yaWdpbmFsQWNsIC1FcnJvckFjdGlvbiBTdG9wOyB9IGNhdGNoIHsgV3JpdGUtV2FybmluZyBcIl5cIlwiRmFpbGVkIHRvIHJlc3RvcmUgYWNjZXNzIG9uIGBcIl5cIlwiJG9yaWdpbmFsRmlsZVBhdGhgXCJeXCJcIjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSlcIl5cIlwiOyB9OyB9OyB9OyB9OyBpZiAoKCRyZW5hbWVkQ291bnQgLWd0IDApIC1vciAoJHNraXBwZWRDb3VudCAtZ3QgMCkpIHsgV3JpdGUtSG9zdCBcIl5cIlwiU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCAkcmVuYW1lZENvdW50IGl0ZW1zIGFuZCBza2lwcGVkICRza2lwcGVkQ291bnQgaXRlbXMuXCJeXCJcIjsgfTsgaWYgKCRmYWlsZWRDb3VudCAtZ3QgMCkgeyBXcml0ZS1XYXJuaW5nIFwiXlwiXCJGYWlsZWQgdG8gcHJvY2VzcyAkKCRmYWlsZWRDb3VudCkgaXRlbXMuXCJeXCJcIjsgfTsgW1ByaXZpbGVnZXNdOjpSZW1vdmVQcml2aWxlZ2UoJ1NlUmVzdG9yZVByaXZpbGVnZScpIHwgT3V0LU51bGw7IFtQcml2aWxlZ2VzXTo6UmVtb3ZlUHJpdmlsZWdlKCdTZVRha2VPd25lcnNoaXBQcml2aWxlZ2UnKSB8IE91dC1OdWxsXCIi