├── uninstall
├── remove-chrome-policy.reg
├── remove-edge-policy.reg
└── remove-brave-policy.reg
├── pyproject.toml
├── generated
├── linux
│ ├── chrome.json
│ ├── brave.json
│ └── edge.json
├── windows
│ ├── chrome.reg
│ ├── brave.reg
│ └── edge.reg
└── macos
│ ├── chrome.mobileconfig
│ ├── brave.mobileconfig
│ └── edge.mobileconfig
├── README.md
├── .gitignore
├── policies.yaml
├── main.py
├── LICENSE
└── uv.lock
/uninstall/remove-chrome-policy.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
4 | [-HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome]
--------------------------------------------------------------------------------
/uninstall/remove-edge-policy.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
4 | [-HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Edge]
--------------------------------------------------------------------------------
/uninstall/remove-brave-policy.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave]
4 |
5 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave\ExtensionInstallForcelist]
6 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "chrome-debloat"
3 | version = "0.1.0"
4 | description = "Browser policies to debloat Chrome/Chromium browsers"
5 | readme = "README.md"
6 | requires-python = ">=3.9"
7 | license = { file = "LICENSE" }
8 | dependencies = ["ruamel-yaml>=0.18.6"]
9 |
10 |
11 | [tool.ruff.lint]
12 | select = ["I"]
13 |
--------------------------------------------------------------------------------
/generated/linux/chrome.json:
--------------------------------------------------------------------------------
1 | {
2 | "DefaultGeolocationSetting": 2,
3 | "DefaultNotificationsSetting": 2,
4 | "DefaultLocalFontsSetting": 2,
5 | "DefaultSensorsSetting": 2,
6 | "DefaultSerialGuardSetting": 2,
7 | "CloudReportingEnabled": false,
8 | "DriveDisabled": true,
9 | "PasswordManagerEnabled": false,
10 | "PasswordSharingEnabled": false,
11 | "PasswordLeakDetectionEnabled": false,
12 | "QuickAnswersEnabled": false,
13 | "SafeBrowsingExtendedReportingEnabled": false,
14 | "SafeBrowsingSurveysEnabled": false,
15 | "SafeBrowsingDeepScanningEnabled": false,
16 | "DeviceActivityHeartbeatEnabled": false,
17 | "DeviceMetricsReportingEnabled": false,
18 | "HeartbeatEnabled": false,
19 | "LogUploadEnabled": false,
20 | "ReportAppInventory": [
21 | ""
22 | ],
23 | "ReportDeviceActivityTimes": false,
24 | "ReportDeviceAppInfo": false,
25 | "ReportDeviceSystemInfo": false,
26 | "ReportDeviceUsers": false,
27 | "ReportWebsiteTelemetry": [
28 | ""
29 | ],
30 | "AlternateErrorPagesEnabled": false,
31 | "AutofillCreditCardEnabled": false,
32 | "BackgroundModeEnabled": false,
33 | "BrowserGuestModeEnabled": false,
34 | "BrowserSignin": 0,
35 | "BuiltInDnsClientEnabled": false,
36 | "DefaultBrowserSettingEnabled": false,
37 | "MetricsReportingEnabled": false,
38 | "ParcelTrackingEnabled": false,
39 | "RelatedWebsiteSetsEnabled": false,
40 | "ShoppingListEnabled": false,
41 | "ExtensionManifestV2Availability": 2
42 | }
--------------------------------------------------------------------------------
/generated/linux/brave.json:
--------------------------------------------------------------------------------
1 | {
2 | "TorDisabled": true,
3 | "BraveRewardsDisabled": true,
4 | "BraveWalletDisabled": true,
5 | "BraveVPNDisabled": true,
6 | "BraveAIChatEnabled": false,
7 | "DefaultGeolocationSetting": 2,
8 | "DefaultNotificationsSetting": 2,
9 | "DefaultLocalFontsSetting": 2,
10 | "DefaultSensorsSetting": 2,
11 | "DefaultSerialGuardSetting": 2,
12 | "CloudReportingEnabled": false,
13 | "DriveDisabled": true,
14 | "PasswordManagerEnabled": false,
15 | "PasswordSharingEnabled": false,
16 | "PasswordLeakDetectionEnabled": false,
17 | "QuickAnswersEnabled": false,
18 | "SafeBrowsingExtendedReportingEnabled": false,
19 | "SafeBrowsingSurveysEnabled": false,
20 | "SafeBrowsingDeepScanningEnabled": false,
21 | "DeviceActivityHeartbeatEnabled": false,
22 | "DeviceMetricsReportingEnabled": false,
23 | "HeartbeatEnabled": false,
24 | "LogUploadEnabled": false,
25 | "ReportAppInventory": [
26 | ""
27 | ],
28 | "ReportDeviceActivityTimes": false,
29 | "ReportDeviceAppInfo": false,
30 | "ReportDeviceSystemInfo": false,
31 | "ReportDeviceUsers": false,
32 | "ReportWebsiteTelemetry": [
33 | ""
34 | ],
35 | "AlternateErrorPagesEnabled": false,
36 | "AutofillCreditCardEnabled": false,
37 | "BackgroundModeEnabled": false,
38 | "BrowserGuestModeEnabled": false,
39 | "BrowserSignin": 0,
40 | "BuiltInDnsClientEnabled": false,
41 | "DefaultBrowserSettingEnabled": false,
42 | "MetricsReportingEnabled": false,
43 | "ParcelTrackingEnabled": false,
44 | "RelatedWebsiteSetsEnabled": false,
45 | "ShoppingListEnabled": false,
46 | "ExtensionManifestV2Availability": 2
47 | }
--------------------------------------------------------------------------------
/generated/windows/chrome.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
4 | "DefaultGeolocationSetting"=dword:00000002
5 | "DefaultNotificationsSetting"=dword:00000002
6 | "DefaultLocalFontsSetting"=dword:00000002
7 | "DefaultSensorsSetting"=dword:00000002
8 | "DefaultSerialGuardSetting"=dword:00000002
9 | "CloudReportingEnabled"=dword:00000000
10 | "DriveDisabled"=dword:00000001
11 | "PasswordManagerEnabled"=dword:00000000
12 | "PasswordSharingEnabled"=dword:00000000
13 | "PasswordLeakDetectionEnabled"=dword:00000000
14 | "QuickAnswersEnabled"=dword:00000000
15 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000
16 | "SafeBrowsingSurveysEnabled"=dword:00000000
17 | "SafeBrowsingDeepScanningEnabled"=dword:00000000
18 | "DeviceActivityHeartbeatEnabled"=dword:00000000
19 | "DeviceMetricsReportingEnabled"=dword:00000000
20 | "HeartbeatEnabled"=dword:00000000
21 | "LogUploadEnabled"=dword:00000000
22 | "ReportAppInventory"=""
23 | "ReportDeviceActivityTimes"=dword:00000000
24 | "ReportDeviceAppInfo"=dword:00000000
25 | "ReportDeviceSystemInfo"=dword:00000000
26 | "ReportDeviceUsers"=dword:00000000
27 | "ReportWebsiteTelemetry"=""
28 | "AlternateErrorPagesEnabled"=dword:00000000
29 | "AutofillCreditCardEnabled"=dword:00000000
30 | "BackgroundModeEnabled"=dword:00000000
31 | "BrowserGuestModeEnabled"=dword:00000000
32 | "BrowserSignin"=dword:00000000
33 | "BuiltInDnsClientEnabled"=dword:00000000
34 | "DefaultBrowserSettingEnabled"=dword:00000000
35 | "MetricsReportingEnabled"=dword:00000000
36 | "ParcelTrackingEnabled"=dword:00000000
37 | "RelatedWebsiteSetsEnabled"=dword:00000000
38 | "ShoppingListEnabled"=dword:00000000
39 | "ExtensionManifestV2Availability"=dword:00000002
--------------------------------------------------------------------------------
/generated/windows/brave.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave]
4 | "TorDisabled"=dword:00000001
5 | "BraveRewardsDisabled"=dword:00000001
6 | "BraveWalletDisabled"=dword:00000001
7 | "BraveVPNDisabled"=dword:00000001
8 | "BraveAIChatEnabled"=dword:00000000
9 | "DefaultGeolocationSetting"=dword:00000002
10 | "DefaultNotificationsSetting"=dword:00000002
11 | "DefaultLocalFontsSetting"=dword:00000002
12 | "DefaultSensorsSetting"=dword:00000002
13 | "DefaultSerialGuardSetting"=dword:00000002
14 | "CloudReportingEnabled"=dword:00000000
15 | "DriveDisabled"=dword:00000001
16 | "PasswordManagerEnabled"=dword:00000000
17 | "PasswordSharingEnabled"=dword:00000000
18 | "PasswordLeakDetectionEnabled"=dword:00000000
19 | "QuickAnswersEnabled"=dword:00000000
20 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000
21 | "SafeBrowsingSurveysEnabled"=dword:00000000
22 | "SafeBrowsingDeepScanningEnabled"=dword:00000000
23 | "DeviceActivityHeartbeatEnabled"=dword:00000000
24 | "DeviceMetricsReportingEnabled"=dword:00000000
25 | "HeartbeatEnabled"=dword:00000000
26 | "LogUploadEnabled"=dword:00000000
27 | "ReportAppInventory"=""
28 | "ReportDeviceActivityTimes"=dword:00000000
29 | "ReportDeviceAppInfo"=dword:00000000
30 | "ReportDeviceSystemInfo"=dword:00000000
31 | "ReportDeviceUsers"=dword:00000000
32 | "ReportWebsiteTelemetry"=""
33 | "AlternateErrorPagesEnabled"=dword:00000000
34 | "AutofillCreditCardEnabled"=dword:00000000
35 | "BackgroundModeEnabled"=dword:00000000
36 | "BrowserGuestModeEnabled"=dword:00000000
37 | "BrowserSignin"=dword:00000000
38 | "BuiltInDnsClientEnabled"=dword:00000000
39 | "DefaultBrowserSettingEnabled"=dword:00000000
40 | "MetricsReportingEnabled"=dword:00000000
41 | "ParcelTrackingEnabled"=dword:00000000
42 | "RelatedWebsiteSetsEnabled"=dword:00000000
43 | "ShoppingListEnabled"=dword:00000000
44 | "ExtensionManifestV2Availability"=dword:00000002
--------------------------------------------------------------------------------
/generated/macos/chrome.mobileconfig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PayloadVersion
6 | 1
7 | PayloadScope
8 | System
9 | PayloadType
10 | Configuration
11 | PayloadRemovalDisallowed
12 |
13 | PayloadUUID
14 | 8568e67e-21ba-4bdc-a944-a30fb301ba02
15 | PayloadDisplayName
16 | Google Chrome Policies
17 | PayloadDescription
18 | Google Chrome Browser system-level policies
19 | PayloadIdentifier
20 | com.google.Chrome
21 | PayloadContent
22 |
23 |
24 | PayloadIdentifier
25 | com.google.Chrome
26 | PayloadType
27 | com.google.Chrome
28 | PayloadUUID
29 | 3eb9eb1f-412c-4f8b-b425-f95f1a67072d
30 | PayloadVersion
31 | 1
32 | PayloadEnabled
33 |
34 | DefaultGeolocationSetting
35 | 2
36 | DefaultNotificationsSetting
37 | 2
38 | DefaultLocalFontsSetting
39 | 2
40 | DefaultSensorsSetting
41 | 2
42 | DefaultSerialGuardSetting
43 | 2
44 | CloudReportingEnabled
45 |
46 | DriveDisabled
47 |
48 | PasswordManagerEnabled
49 |
50 | PasswordSharingEnabled
51 |
52 | PasswordLeakDetectionEnabled
53 |
54 | QuickAnswersEnabled
55 |
56 | SafeBrowsingExtendedReportingEnabled
57 |
58 | SafeBrowsingSurveysEnabled
59 |
60 | SafeBrowsingDeepScanningEnabled
61 |
62 | DeviceActivityHeartbeatEnabled
63 |
64 | DeviceMetricsReportingEnabled
65 |
66 | HeartbeatEnabled
67 |
68 | LogUploadEnabled
69 |
70 | ReportAppInventory
71 |
72 |
73 |
74 | ReportDeviceActivityTimes
75 |
76 | ReportDeviceAppInfo
77 |
78 | ReportDeviceSystemInfo
79 |
80 | ReportDeviceUsers
81 |
82 | ReportWebsiteTelemetry
83 |
84 |
85 |
86 | AlternateErrorPagesEnabled
87 |
88 | AutofillCreditCardEnabled
89 |
90 | BackgroundModeEnabled
91 |
92 | BrowserGuestModeEnabled
93 |
94 | BrowserSignin
95 | 0
96 | BuiltInDnsClientEnabled
97 |
98 | DefaultBrowserSettingEnabled
99 |
100 | MetricsReportingEnabled
101 |
102 | ParcelTrackingEnabled
103 |
104 | RelatedWebsiteSetsEnabled
105 |
106 | ShoppingListEnabled
107 |
108 | ExtensionManifestV2Availability
109 | 2
110 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/generated/macos/brave.mobileconfig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PayloadVersion
6 | 1
7 | PayloadScope
8 | System
9 | PayloadType
10 | Configuration
11 | PayloadRemovalDisallowed
12 |
13 | PayloadUUID
14 | e143b891-3398-48f9-bee1-54d3b6db44b3
15 | PayloadDisplayName
16 | Brave Policies
17 | PayloadDescription
18 | Brave Browser system-level policies
19 | PayloadIdentifier
20 | com.brave.Browser
21 | PayloadContent
22 |
23 |
24 | PayloadIdentifier
25 | com.brave.Browser
26 | PayloadType
27 | com.brave.Browser
28 | PayloadUUID
29 | 88032831-5301-41ad-8231-10efa9d67ab3
30 | PayloadVersion
31 | 1
32 | PayloadEnabled
33 |
34 | TorDisabled
35 |
36 | BraveRewardsDisabled
37 |
38 | BraveWalletDisabled
39 |
40 | BraveVPNDisabled
41 |
42 | BraveAIChatEnabled
43 |
44 | DefaultGeolocationSetting
45 | 2
46 | DefaultNotificationsSetting
47 | 2
48 | DefaultLocalFontsSetting
49 | 2
50 | DefaultSensorsSetting
51 | 2
52 | DefaultSerialGuardSetting
53 | 2
54 | CloudReportingEnabled
55 |
56 | DriveDisabled
57 |
58 | PasswordManagerEnabled
59 |
60 | PasswordSharingEnabled
61 |
62 | PasswordLeakDetectionEnabled
63 |
64 | QuickAnswersEnabled
65 |
66 | SafeBrowsingExtendedReportingEnabled
67 |
68 | SafeBrowsingSurveysEnabled
69 |
70 | SafeBrowsingDeepScanningEnabled
71 |
72 | DeviceActivityHeartbeatEnabled
73 |
74 | DeviceMetricsReportingEnabled
75 |
76 | HeartbeatEnabled
77 |
78 | LogUploadEnabled
79 |
80 | ReportAppInventory
81 |
82 |
83 |
84 | ReportDeviceActivityTimes
85 |
86 | ReportDeviceAppInfo
87 |
88 | ReportDeviceSystemInfo
89 |
90 | ReportDeviceUsers
91 |
92 | ReportWebsiteTelemetry
93 |
94 |
95 |
96 | AlternateErrorPagesEnabled
97 |
98 | AutofillCreditCardEnabled
99 |
100 | BackgroundModeEnabled
101 |
102 | BrowserGuestModeEnabled
103 |
104 | BrowserSignin
105 | 0
106 | BuiltInDnsClientEnabled
107 |
108 | DefaultBrowserSettingEnabled
109 |
110 | MetricsReportingEnabled
111 |
112 | ParcelTrackingEnabled
113 |
114 | RelatedWebsiteSetsEnabled
115 |
116 | ShoppingListEnabled
117 |
118 | ExtensionManifestV2Availability
119 | 2
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Chrome Debloat
2 |
3 | A tool to generate policies for Chromium-based browsers (Chrome, Brave, and Edge) that disable unnecessary features, telemetry, and bloatware while enabling some quality-of-life improvements.
4 |
5 | ## Features
6 |
7 | - Attempts to disable telemetry and usage reporting
8 | - Removes unnecessary features and pre-installed bloatware
9 | - Blocks promotional content and unnecessary UI elements
10 | - Maintains browser functionality while reducing resource usage
11 | - Pre-configures essential extensions:
12 | - uBlock Origin
13 | - Cookie AutoDelete
14 | - Don't f*** with paste
15 | - I still don't care about cookies
16 | - SponsorBlock
17 | - BlockTube
18 | - BlankTab
19 | - Decentraleyes
20 |
21 | ### Supported Browsers
22 |
23 | | Browser | Windows | macOS | Linux |
24 | |---------|---------|-------|-------|
25 | | Google Chrome | ✅ | ✅ | ✅ |
26 | | Microsoft Edge | ✅ | ✅ | ✅ |
27 | | Brave | ✅ | ✅ | ✅ |
28 |
29 | ## Quick Start
30 |
31 | ### Windows
32 | 1. Download the `.reg` file for your browser from [`generated/windows/`](./generated/windows/).
33 | 2. Open the downloaded `.reg` file to add the settings to the Windows Registry.
34 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
35 |
36 | ### macOS
37 | 1. Download the `.mobileconfig` file for your browser from [`generated/macos/`](./generated/macos/).
38 | 2. Open the downloaded `.mobileconfig` file to start the profile installation.
39 | 3. Go to `System Settings` > `Privacy & Security` > `Profiles` and approve the new profile.
40 | 4. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
41 |
42 | ### Linux
43 | 1. Download the `.json` file for your browser from [`generated/linux/`](./generated/linux/).
44 | 2. Move the downloaded file to the correct policy directory (create it if needed):
45 | * **Chrome:** `/etc/opt/chrome/policies/managed/chrome.json`
46 | * **Edge:** `/etc/opt/edge/policies/managed/edge.json`
47 | * **Brave:** `/etc/brave/policies/managed/brave.json`
48 | * *Note: You might need `sudo` rights to do this.*
49 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
50 |
51 | ## Custom Configuration
52 |
53 | If you want to customize the policies:
54 |
55 | 1. Clone this repository
56 | 2. Install dependencies:
57 | ```bash
58 | uv sync
59 | ```
60 | 3. Modify `policies.yaml` according to your needs
61 | 4. Generate new configuration files:
62 | ```bash
63 | uv run main.py
64 | ```
65 | 5. Find the generated files in `generated/` directory
66 |
67 |
68 | ### Uninstalling Policies
69 |
70 | **Windows:**
71 | 1. Navigate to the [`uninstall/windows/`](./uninstall/) directory in this repository.
72 | 2. Run the `.reg` file corresponding to your browser (e.g., `uninstall_chrome.reg`). This will remove the registry keys added during installation.
73 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
74 |
75 | **macOS:**
76 | 1. Go to `System Settings` > `Privacy & Security` > `Profiles`.
77 | 2. Select the profile associated with your browser (e.g., "Chrome Debloat Policies").
78 | 3. Click the '-' (minus) button to remove the profile.
79 | 4. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
80 |
81 | **Linux:**
82 | 1. Remove the policy JSON file from the browser-specific directory (you might need `sudo` rights):
83 | * **Chrome:** `sudo rm /etc/opt/chrome/policies/managed/chrome.json`
84 | * **Edge:** `sudo rm /etc/opt/edge/policies/managed/edge.json`
85 | * **Brave:** `sudo rm /etc/brave/policies/managed/brave.json`
86 | 2. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies".
87 |
88 | ## Policy Documentation
89 |
90 | - [Chrome Enterprise Policies](https://chromeenterprise.google/policies/)
91 | - [Brave Policies](https://support.brave.com/hc/en-us/articles/360039248271-Group-Policy)
92 | - [Microsoft Edge Policies](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies)
93 |
94 | ## License
95 |
96 | [Apache 2.0](./LICENSE)
97 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | custom.policy.yaml
2 |
3 | # Byte-compiled / optimized / DLL files
4 | __pycache__/
5 | *.py[cod]
6 | *$py.class
7 |
8 | # C extensions
9 | *.so
10 |
11 | # Distribution / packaging
12 | .Python
13 | build/
14 | develop-eggs/
15 | dist/
16 | downloads/
17 | eggs/
18 | .eggs/
19 | lib/
20 | lib64/
21 | parts/
22 | sdist/
23 | var/
24 | wheels/
25 | share/python-wheels/
26 | *.egg-info/
27 | .installed.cfg
28 | *.egg
29 | MANIFEST
30 |
31 | # PyInstaller
32 | # Usually these files are written by a python script from a template
33 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
34 | *.manifest
35 | *.spec
36 |
37 | # Installer logs
38 | pip-log.txt
39 | pip-delete-this-directory.txt
40 |
41 | # Unit test / coverage reports
42 | htmlcov/
43 | .tox/
44 | .nox/
45 | .coverage
46 | .coverage.*
47 | .cache
48 | nosetests.xml
49 | coverage.xml
50 | *.cover
51 | *.py,cover
52 | .hypothesis/
53 | .pytest_cache/
54 | cover/
55 |
56 | # Translations
57 | *.mo
58 | *.pot
59 |
60 | # Django stuff:
61 | *.log
62 | local_settings.py
63 | db.sqlite3
64 | db.sqlite3-journal
65 |
66 | # Flask stuff:
67 | instance/
68 | .webassets-cache
69 |
70 | # Scrapy stuff:
71 | .scrapy
72 |
73 | # Sphinx documentation
74 | docs/_build/
75 |
76 | # PyBuilder
77 | .pybuilder/
78 | target/
79 |
80 | # Jupyter Notebook
81 | .ipynb_checkpoints
82 |
83 | # IPython
84 | profile_default/
85 | ipython_config.py
86 |
87 | # pyenv
88 | # For a library or package, you might want to ignore these files since the code is
89 | # intended to run in multiple environments; otherwise, check them in:
90 | # .python-version
91 |
92 | # pipenv
93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
96 | # install all needed dependencies.
97 | #Pipfile.lock
98 |
99 | # UV
100 | # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
101 | # This is especially recommended for binary packages to ensure reproducibility, and is more
102 | # commonly ignored for libraries.
103 | #uv.lock
104 |
105 | # poetry
106 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
107 | # This is especially recommended for binary packages to ensure reproducibility, and is more
108 | # commonly ignored for libraries.
109 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
110 | #poetry.lock
111 |
112 | # pdm
113 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114 | #pdm.lock
115 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
116 | # in version control.
117 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
118 | .pdm.toml
119 | .pdm-python
120 | .pdm-build/
121 |
122 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
123 | __pypackages__/
124 |
125 | # Celery stuff
126 | celerybeat-schedule
127 | celerybeat.pid
128 |
129 | # SageMath parsed files
130 | *.sage.py
131 |
132 | # Environments
133 | .env
134 | .venv
135 | env/
136 | venv/
137 | ENV/
138 | env.bak/
139 | venv.bak/
140 |
141 | # Spyder project settings
142 | .spyderproject
143 | .spyproject
144 |
145 | # Rope project settings
146 | .ropeproject
147 |
148 | # mkdocs documentation
149 | /site
150 |
151 | # mypy
152 | .mypy_cache/
153 | .dmypy.json
154 | dmypy.json
155 |
156 | # Pyre type checker
157 | .pyre/
158 |
159 | # pytype static type analyzer
160 | .pytype/
161 |
162 | # Cython debug symbols
163 | cython_debug/
164 |
165 | # PyCharm
166 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
167 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
168 | # and can be added to the global gitignore or merged into this file. For a more nuclear
169 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
170 | #.idea/
171 |
172 | # Ruff stuff:
173 | .ruff_cache/
174 |
175 | # PyPI configuration file
176 | .pypirc
177 |
178 | # OS Garbage
179 | .DS_Store
180 | Thumbs.db
181 |
182 | # Project
183 | .vscode
184 | out
185 |
--------------------------------------------------------------------------------
/generated/linux/edge.json:
--------------------------------------------------------------------------------
1 | {
2 | "ApplicationGuardFavoritesSyncEnabled": false,
3 | "ApplicationGuardPassiveModeEnabled": false,
4 | "ApplicationGuardUploadBlockingEnabled": false,
5 | "TyposquattingCheckerEnabled": false,
6 | "EdgeWorkspacesEnabled": false,
7 | "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled": true,
8 | "BlockExternalExtensions": false,
9 | "ExtensionInstallForcelist": [
10 | "odfafepnkmbhccpbejgmiehpchacaeak",
11 | "djkjpnciiommncecmdefpdllknjdmmmo",
12 | "kkacdgacpkediooahopgcbdahlpipheh",
13 | "ihknoknoahjhldmpdoajjdkfjhddgpcd"
14 | ],
15 | "GenAILocalFoundationalModelSettings": 1,
16 | "ImplicitSignInEnabled": false,
17 | "LinkedAccountEnabled": false,
18 | "ProactiveAuthWorkflowEnabled": false,
19 | "WebToBrowserSignInEnabled": false,
20 | "EdgeManagementEnabled": false,
21 | "EdgeManagementExtensionsFeedbackEnabled": false,
22 | "MAMEnabled": false,
23 | "PasswordGeneratorEnabled": false,
24 | "PasswordRevealEnabled": false,
25 | "PasswordMonitorAllowed": false,
26 | "RelatedWebsiteSetsEnabled": false,
27 | "ScarewareBlockerProtectionEnabled": false,
28 | "SmartScreenEnabled": false,
29 | "SmartScreenPuaEnabled": false,
30 | "SmartScreenForTrustedDownloadsEnabled": false,
31 | "SmartScreenDnsRequestsEnabled": false,
32 | "NewTabPageAppLauncherEnabled": false,
33 | "NewTabPageBingChatEnabled": false,
34 | "NewTabPageContentEnabled": false,
35 | "NewTabPageHideDefaultTopSites": true,
36 | "NewTabPagePrerenderEnabled": false,
37 | "NewTabPageQuickLinksEnabled": false,
38 | "AADWebSiteSSOUsingThisProfileEnabled": false,
39 | "AccessibilityImageLabelsEnabled": false,
40 | "AddressBarMicrosoftSearchInBingProviderEnabled": false,
41 | "AIGenThemesEnabled": false,
42 | "AllowGamesMenu": false,
43 | "AlternateErrorPagesEnabled": false,
44 | "AmbientAuthenticationInPrivateModesEnabled": false,
45 | "AutomaticHttpsDefault": true,
46 | "BingAdsSuppression": true,
47 | "ComposeInlineEnabled": false,
48 | "ConfigureDoNotTrack": false,
49 | "CryptoWalletEnabled": false,
50 | "DiagnosticData": 0,
51 | "Edge3PSerpTelemetryEnabled": false,
52 | "EdgeAssetDeliveryServiceEnabled": false,
53 | "EdgeCollectionsEnabled": false,
54 | "EdgeDiscoverEnabled": false,
55 | "EdgeEDropEnabled": false,
56 | "EdgeEnhanceImagesEnabled": false,
57 | "EdgeFollowEnabled": false,
58 | "EdgeShoppingAssistantEnabled": false,
59 | "EdgeWalletCheckoutEnabled": false,
60 | "EdgeWalletEtreeEnabled": false,
61 | "ExperimentationAndConfigurationServiceControl": 0,
62 | "ForceSync": false,
63 | "HubsSidebarEnabled": false,
64 | "ImageEditorServiceEnabled": false,
65 | "InAppSupportEnabled": false,
66 | "InternetExplorerIntegrationLevel": 0,
67 | "LiveCaptionsAllowed": false,
68 | "LiveTranslationAllowed": false,
69 | "MathSolverEnabled": false,
70 | "MicrosoftEdgeInsiderPromotionEnabled": false,
71 | "MicrosoftEditorProofingEnabled": false,
72 | "MicrosoftEditorSynonymsEnabled": false,
73 | "MicrosoftOfficeMenuEnabled": false,
74 | "OutlookHubMenuEnabled": false,
75 | "PaymentMethodQueryEnabled": false,
76 | "PersonalizationReportingEnabled": false,
77 | "PersonalizeTopSitesInCustomizeSidebarEnabled": false,
78 | "PictureInPictureOverlayEnabled": false,
79 | "PromotionalTabsEnabled": false,
80 | "PromptForDownloadLocation": false,
81 | "ResolveNavigationErrorsUseWebService": false,
82 | "ShowMicrosoftRewards": false,
83 | "ShowRecommendationsEnabled": false,
84 | "SpeechRecognitionEnabled": false,
85 | "StandaloneHubsSidebarEnabled": false,
86 | "TextPredictionEnabled": false,
87 | "TranslateEnabled": true,
88 | "TravelAssistanceEnabled": false,
89 | "UploadFromPhoneEnabled": false,
90 | "UrlDiagnosticDataEnabled": false,
91 | "UserFeedbackAllowed": false,
92 | "VisualSearchEnabled": false,
93 | "WalletDonationEnabled": false,
94 | "WebWidgetAllowed": false,
95 | "DefaultGeolocationSetting": 2,
96 | "DefaultNotificationsSetting": 2,
97 | "DefaultLocalFontsSetting": 2,
98 | "DefaultSensorsSetting": 2,
99 | "DefaultSerialGuardSetting": 2,
100 | "CloudReportingEnabled": false,
101 | "DriveDisabled": true,
102 | "PasswordManagerEnabled": false,
103 | "PasswordSharingEnabled": false,
104 | "PasswordLeakDetectionEnabled": false,
105 | "QuickAnswersEnabled": false,
106 | "SafeBrowsingExtendedReportingEnabled": false,
107 | "SafeBrowsingSurveysEnabled": false,
108 | "SafeBrowsingDeepScanningEnabled": false,
109 | "DeviceActivityHeartbeatEnabled": false,
110 | "DeviceMetricsReportingEnabled": false,
111 | "HeartbeatEnabled": false,
112 | "LogUploadEnabled": false,
113 | "ReportAppInventory": [
114 | ""
115 | ],
116 | "ReportDeviceActivityTimes": false,
117 | "ReportDeviceAppInfo": false,
118 | "ReportDeviceSystemInfo": false,
119 | "ReportDeviceUsers": false,
120 | "ReportWebsiteTelemetry": [
121 | ""
122 | ],
123 | "AutofillCreditCardEnabled": false,
124 | "BackgroundModeEnabled": false,
125 | "BrowserGuestModeEnabled": false,
126 | "BrowserSignin": 0,
127 | "BuiltInDnsClientEnabled": false,
128 | "DefaultBrowserSettingEnabled": false,
129 | "MetricsReportingEnabled": false,
130 | "ParcelTrackingEnabled": false,
131 | "ShoppingListEnabled": false,
132 | "ExtensionManifestV2Availability": 2
133 | }
--------------------------------------------------------------------------------
/generated/windows/edge.reg:
--------------------------------------------------------------------------------
1 | Windows Registry Editor Version 5.00
2 |
3 | [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge]
4 | "ApplicationGuardFavoritesSyncEnabled"=dword:00000000
5 | "ApplicationGuardPassiveModeEnabled"=dword:00000000
6 | "ApplicationGuardUploadBlockingEnabled"=dword:00000000
7 | "TyposquattingCheckerEnabled"=dword:00000000
8 | "EdgeWorkspacesEnabled"=dword:00000000
9 | "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled"=dword:00000001
10 | "BlockExternalExtensions"=dword:00000000
11 | "GenAILocalFoundationalModelSettings"=dword:00000001
12 | "ImplicitSignInEnabled"=dword:00000000
13 | "LinkedAccountEnabled"=dword:00000000
14 | "ProactiveAuthWorkflowEnabled"=dword:00000000
15 | "WebToBrowserSignInEnabled"=dword:00000000
16 | "EdgeManagementEnabled"=dword:00000000
17 | "EdgeManagementExtensionsFeedbackEnabled"=dword:00000000
18 | "MAMEnabled"=dword:00000000
19 | "PasswordGeneratorEnabled"=dword:00000000
20 | "PasswordRevealEnabled"=dword:00000000
21 | "PasswordMonitorAllowed"=dword:00000000
22 | "RelatedWebsiteSetsEnabled"=dword:00000000
23 | "ScarewareBlockerProtectionEnabled"=dword:00000000
24 | "SmartScreenEnabled"=dword:00000000
25 | "SmartScreenPuaEnabled"=dword:00000000
26 | "SmartScreenForTrustedDownloadsEnabled"=dword:00000000
27 | "SmartScreenDnsRequestsEnabled"=dword:00000000
28 | "NewTabPageAppLauncherEnabled"=dword:00000000
29 | "NewTabPageBingChatEnabled"=dword:00000000
30 | "NewTabPageContentEnabled"=dword:00000000
31 | "NewTabPageHideDefaultTopSites"=dword:00000001
32 | "NewTabPagePrerenderEnabled"=dword:00000000
33 | "NewTabPageQuickLinksEnabled"=dword:00000000
34 | "AADWebSiteSSOUsingThisProfileEnabled"=dword:00000000
35 | "AccessibilityImageLabelsEnabled"=dword:00000000
36 | "AddressBarMicrosoftSearchInBingProviderEnabled"=dword:00000000
37 | "AIGenThemesEnabled"=dword:00000000
38 | "AllowGamesMenu"=dword:00000000
39 | "AlternateErrorPagesEnabled"=dword:00000000
40 | "AmbientAuthenticationInPrivateModesEnabled"=dword:00000000
41 | "AutomaticHttpsDefault"=dword:00000001
42 | "BingAdsSuppression"=dword:00000001
43 | "ComposeInlineEnabled"=dword:00000000
44 | "ConfigureDoNotTrack"=dword:00000000
45 | "CryptoWalletEnabled"=dword:00000000
46 | "DiagnosticData"=dword:00000000
47 | "Edge3PSerpTelemetryEnabled"=dword:00000000
48 | "EdgeAssetDeliveryServiceEnabled"=dword:00000000
49 | "EdgeCollectionsEnabled"=dword:00000000
50 | "EdgeDiscoverEnabled"=dword:00000000
51 | "EdgeEDropEnabled"=dword:00000000
52 | "EdgeEnhanceImagesEnabled"=dword:00000000
53 | "EdgeFollowEnabled"=dword:00000000
54 | "EdgeShoppingAssistantEnabled"=dword:00000000
55 | "EdgeWalletCheckoutEnabled"=dword:00000000
56 | "EdgeWalletEtreeEnabled"=dword:00000000
57 | "ExperimentationAndConfigurationServiceControl"=dword:00000000
58 | "ForceSync"=dword:00000000
59 | "HubsSidebarEnabled"=dword:00000000
60 | "ImageEditorServiceEnabled"=dword:00000000
61 | "InAppSupportEnabled"=dword:00000000
62 | "InternetExplorerIntegrationLevel"=dword:00000000
63 | "LiveCaptionsAllowed"=dword:00000000
64 | "LiveTranslationAllowed"=dword:00000000
65 | "MathSolverEnabled"=dword:00000000
66 | "MicrosoftEdgeInsiderPromotionEnabled"=dword:00000000
67 | "MicrosoftEditorProofingEnabled"=dword:00000000
68 | "MicrosoftEditorSynonymsEnabled"=dword:00000000
69 | "MicrosoftOfficeMenuEnabled"=dword:00000000
70 | "OutlookHubMenuEnabled"=dword:00000000
71 | "PaymentMethodQueryEnabled"=dword:00000000
72 | "PersonalizationReportingEnabled"=dword:00000000
73 | "PersonalizeTopSitesInCustomizeSidebarEnabled"=dword:00000000
74 | "PictureInPictureOverlayEnabled"=dword:00000000
75 | "PromotionalTabsEnabled"=dword:00000000
76 | "PromptForDownloadLocation"=dword:00000000
77 | "ResolveNavigationErrorsUseWebService"=dword:00000000
78 | "ShowMicrosoftRewards"=dword:00000000
79 | "ShowRecommendationsEnabled"=dword:00000000
80 | "SpeechRecognitionEnabled"=dword:00000000
81 | "StandaloneHubsSidebarEnabled"=dword:00000000
82 | "TextPredictionEnabled"=dword:00000000
83 | "TranslateEnabled"=dword:00000001
84 | "TravelAssistanceEnabled"=dword:00000000
85 | "UploadFromPhoneEnabled"=dword:00000000
86 | "UrlDiagnosticDataEnabled"=dword:00000000
87 | "UserFeedbackAllowed"=dword:00000000
88 | "VisualSearchEnabled"=dword:00000000
89 | "WalletDonationEnabled"=dword:00000000
90 | "WebWidgetAllowed"=dword:00000000
91 | "DefaultGeolocationSetting"=dword:00000002
92 | "DefaultNotificationsSetting"=dword:00000002
93 | "DefaultLocalFontsSetting"=dword:00000002
94 | "DefaultSensorsSetting"=dword:00000002
95 | "DefaultSerialGuardSetting"=dword:00000002
96 | "CloudReportingEnabled"=dword:00000000
97 | "DriveDisabled"=dword:00000001
98 | "PasswordManagerEnabled"=dword:00000000
99 | "PasswordSharingEnabled"=dword:00000000
100 | "PasswordLeakDetectionEnabled"=dword:00000000
101 | "QuickAnswersEnabled"=dword:00000000
102 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000
103 | "SafeBrowsingSurveysEnabled"=dword:00000000
104 | "SafeBrowsingDeepScanningEnabled"=dword:00000000
105 | "DeviceActivityHeartbeatEnabled"=dword:00000000
106 | "DeviceMetricsReportingEnabled"=dword:00000000
107 | "HeartbeatEnabled"=dword:00000000
108 | "LogUploadEnabled"=dword:00000000
109 | "ReportAppInventory"=""
110 | "ReportDeviceActivityTimes"=dword:00000000
111 | "ReportDeviceAppInfo"=dword:00000000
112 | "ReportDeviceSystemInfo"=dword:00000000
113 | "ReportDeviceUsers"=dword:00000000
114 | "ReportWebsiteTelemetry"=""
115 | "AutofillCreditCardEnabled"=dword:00000000
116 | "BackgroundModeEnabled"=dword:00000000
117 | "BrowserGuestModeEnabled"=dword:00000000
118 | "BrowserSignin"=dword:00000000
119 | "BuiltInDnsClientEnabled"=dword:00000000
120 | "DefaultBrowserSettingEnabled"=dword:00000000
121 | "MetricsReportingEnabled"=dword:00000000
122 | "ParcelTrackingEnabled"=dword:00000000
123 | "ShoppingListEnabled"=dword:00000000
124 | "ExtensionManifestV2Availability"=dword:00000002
125 |
126 | [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge\ExtensionInstallForcelist]
127 | "1"="odfafepnkmbhccpbejgmiehpchacaeak"
128 | "2"="djkjpnciiommncecmdefpdllknjdmmmo"
129 | "3"="kkacdgacpkediooahopgcbdahlpipheh"
130 | "4"="ihknoknoahjhldmpdoajjdkfjhddgpcd"
--------------------------------------------------------------------------------
/policies.yaml:
--------------------------------------------------------------------------------
1 | chromeExtensions: &chromeExtensions
2 | ExtensionManifestV2Availability: 2
3 |
4 | # https://chromeenterprise.google/policies/
5 | chrome: &chrome
6 | <<: *chromeExtensions
7 | # Content Settings
8 | DefaultGeolocationSetting: 2
9 | DefaultNotificationsSetting: 2
10 | DefaultLocalFontsSetting: 2
11 | DefaultSensorsSetting: 2
12 | DefaultSerialGuardSetting: 2
13 | # Cloud Reporting
14 | CloudReportingEnabled: false
15 | # Drive
16 | DriveDisabled: true
17 | # Password
18 | PasswordManagerEnabled: false
19 | PasswordSharingEnabled: false
20 | PasswordLeakDetectionEnabled: false
21 | # Quick Answers
22 | QuickAnswersEnabled: false
23 | # Safe Browsing
24 | SafeBrowsingExtendedReportingEnabled: false
25 | SafeBrowsingSurveysEnabled: false
26 | SafeBrowsingDeepScanningEnabled: false
27 | # User and device reporting
28 | DeviceActivityHeartbeatEnabled: false
29 | DeviceMetricsReportingEnabled: false
30 | HeartbeatEnabled: false
31 | LogUploadEnabled: false
32 | ReportAppInventory:
33 | - ""
34 | ReportDeviceActivityTimes: false
35 | ReportDeviceAppInfo: false
36 | ReportDeviceSystemInfo: false
37 | ReportDeviceUsers: false
38 | ReportWebsiteTelemetry:
39 | - ""
40 | # Miscellaneous
41 | AlternateErrorPagesEnabled: false
42 | AutofillCreditCardEnabled: false
43 | BackgroundModeEnabled: false
44 | BrowserGuestModeEnabled: false
45 | BrowserSignin: 0
46 | BuiltInDnsClientEnabled: false
47 | DefaultBrowserSettingEnabled: false
48 | MetricsReportingEnabled: false
49 | ParcelTrackingEnabled: false
50 | RelatedWebsiteSetsEnabled: false
51 | ShoppingListEnabled: false
52 |
53 | # https://support.brave.com/hc/en-us/articles/360039248271-Group-Policy
54 | brave: &brave
55 | <<: *chrome
56 | TorDisabled: true
57 | BraveRewardsDisabled: true
58 | BraveWalletDisabled: true
59 | BraveVPNDisabled: true
60 | BraveAIChatEnabled: false
61 |
62 | # https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies
63 | edge: &edge
64 | <<: *chrome
65 | # Application Guard
66 | ApplicationGuardFavoritesSyncEnabled: false
67 | ApplicationGuardPassiveModeEnabled: false
68 | ApplicationGuardUploadBlockingEnabled: false
69 | # Edge Typo Protection settings
70 | TyposquattingCheckerEnabled: false
71 | # Edge Workspaces
72 | EdgeWorkspacesEnabled: false
73 | # Extensions
74 | ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled: true
75 | BlockExternalExtensions: false
76 | ExtensionInstallForcelist:
77 | - odfafepnkmbhccpbejgmiehpchacaeak # uBlock Origin; Edge Web Store
78 | - djkjpnciiommncecmdefpdllknjdmmmo # Cookie AutoDelete; Edge Web Store
79 | - kkacdgacpkediooahopgcbdahlpipheh # I still don't care about cookies; Edge Web Store
80 | - ihknoknoahjhldmpdoajjdkfjhddgpcd # Blank Tab; Edge Web Store
81 | # Generative AI
82 | GenAILocalFoundationalModelSettings: 1
83 | # Identity & SignIn
84 | ImplicitSignInEnabled: false
85 | LinkedAccountEnabled: false
86 | ProactiveAuthWorkflowEnabled: false
87 | WebToBrowserSignInEnabled: false
88 | # Manageability
89 | EdgeManagementEnabled: false
90 | EdgeManagementExtensionsFeedbackEnabled: false
91 | MAMEnabled: false
92 | # Password Manager
93 | PasswordGeneratorEnabled: false
94 | PasswordRevealEnabled: false
95 | PasswordMonitorAllowed: false
96 | # Related Website Sets
97 | RelatedWebsiteSetsEnabled: false
98 | # Scareware Blocker
99 | ScarewareBlockerProtectionEnabled: false
100 | # SmartScreen settings
101 | SmartScreenEnabled: false
102 | SmartScreenPuaEnabled: false
103 | SmartScreenForTrustedDownloadsEnabled: false
104 | SmartScreenDnsRequestsEnabled: false
105 | # Startup, home page and new tab page
106 | NewTabPageAppLauncherEnabled: false
107 | NewTabPageBingChatEnabled: false
108 | NewTabPageContentEnabled: false
109 | NewTabPageHideDefaultTopSites: true
110 | NewTabPagePrerenderEnabled: false
111 | NewTabPageQuickLinksEnabled: false
112 | # Additional
113 | AADWebSiteSSOUsingThisProfileEnabled: false
114 | AccessibilityImageLabelsEnabled: false
115 | AddressBarMicrosoftSearchInBingProviderEnabled: false
116 | AIGenThemesEnabled: false
117 | AllowGamesMenu: false
118 | AlternateErrorPagesEnabled: false
119 | AmbientAuthenticationInPrivateModesEnabled: false
120 | AutomaticHttpsDefault: true # improved QoL
121 | BingAdsSuppression: true
122 | ComposeInlineEnabled: false
123 | ConfigureDoNotTrack: false
124 | CryptoWalletEnabled: false
125 | DiagnosticData: 0
126 | Edge3PSerpTelemetryEnabled: false
127 | EdgeAssetDeliveryServiceEnabled: false
128 | EdgeCollectionsEnabled: false
129 | EdgeDiscoverEnabled: false
130 | EdgeEDropEnabled: false
131 | EdgeEnhanceImagesEnabled: false
132 | EdgeFollowEnabled: false
133 | EdgeShoppingAssistantEnabled: false
134 | EdgeWalletCheckoutEnabled: false
135 | EdgeWalletEtreeEnabled: false
136 | ExperimentationAndConfigurationServiceControl: 0
137 | ForceSync: false
138 | HubsSidebarEnabled: false
139 | ImageEditorServiceEnabled: false
140 | InAppSupportEnabled: false
141 | InternetExplorerIntegrationLevel: 0
142 | LiveCaptionsAllowed: false
143 | LiveTranslationAllowed: false
144 | MathSolverEnabled: false
145 | MicrosoftEdgeInsiderPromotionEnabled: false
146 | MicrosoftEditorProofingEnabled: false
147 | MicrosoftEditorSynonymsEnabled: false
148 | MicrosoftOfficeMenuEnabled: false
149 | OutlookHubMenuEnabled: false
150 | PaymentMethodQueryEnabled: false
151 | PersonalizationReportingEnabled: false
152 | PersonalizeTopSitesInCustomizeSidebarEnabled: false
153 | PictureInPictureOverlayEnabled: false
154 | PromotionalTabsEnabled: false
155 | PromptForDownloadLocation: false # improved QoL
156 | ResolveNavigationErrorsUseWebService: false
157 | ShowMicrosoftRewards: false
158 | ShowRecommendationsEnabled: false
159 | SpeechRecognitionEnabled: false
160 | StandaloneHubsSidebarEnabled: false
161 | TextPredictionEnabled: false
162 | TranslateEnabled: true # improved QoL
163 | TravelAssistanceEnabled: false
164 | UploadFromPhoneEnabled: false
165 | UrlDiagnosticDataEnabled: false
166 | UserFeedbackAllowed: false
167 | VisualSearchEnabled: false
168 | WalletDonationEnabled: false
169 | WebWidgetAllowed: false
170 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import json
2 | import plistlib
3 | from pathlib import Path
4 |
5 | from ruamel.yaml import YAML
6 |
7 | yaml = YAML()
8 |
9 | POLICY_CHROME = "chrome"
10 | POLICY_BRAVE = "brave"
11 | POLICY_EDGE = "edge"
12 |
13 |
14 | METADATA = {
15 | POLICY_CHROME: {
16 | "mobileconfig": {
17 | "PayloadDisplayName": "Google Chrome Policies",
18 | "PayloadDescription": "Google Chrome Browser system-level policies",
19 | "PayloadIdentifier": "com.google.Chrome",
20 | "PayloadType": "com.google.Chrome",
21 | "PayloadUUID": "8568e67e-21ba-4bdc-a944-a30fb301ba02",
22 | "PayloadContentUUID": "3eb9eb1f-412c-4f8b-b425-f95f1a67072d",
23 | },
24 | "registry": {
25 | "key": r"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome",
26 | },
27 | },
28 | POLICY_BRAVE: {
29 | "mobileconfig": {
30 | "PayloadDisplayName": "Brave Policies",
31 | "PayloadDescription": "Brave Browser system-level policies",
32 | "PayloadIdentifier": "com.brave.Browser",
33 | "PayloadType": "com.brave.Browser",
34 | "PayloadUUID": "e143b891-3398-48f9-bee1-54d3b6db44b3",
35 | "PayloadContentUUID": "88032831-5301-41ad-8231-10efa9d67ab3",
36 | },
37 | "registry": {
38 | "key": r"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave",
39 | },
40 | },
41 | POLICY_EDGE: {
42 | "mobileconfig": {
43 | "PayloadDisplayName": "Microsoft Edge Policies",
44 | "PayloadDescription": "Microsoft Edge Browser system-level policies",
45 | "PayloadIdentifier": "com.microsoft.Edge",
46 | "PayloadUUID": "778fb3c3-2e58-4337-86dc-1a8044793d2d",
47 | "PayloadContentUUID": "65ffbe44-b556-4c33-88ea-ab684dab69bc",
48 | },
49 | "registry": {
50 | "key": r"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge",
51 | },
52 | },
53 | }
54 |
55 |
56 | def format_reg_value(value) -> str:
57 | if isinstance(value, bool):
58 | return f"dword:{'00000001' if value else '00000000'}"
59 | elif isinstance(value, int):
60 | return f"dword:{value:08x}"
61 | elif isinstance(value, list):
62 | return f'"{";".join(str(item) for item in value)}"'
63 | elif isinstance(value, str):
64 | return f'"{value}"'
65 | else:
66 | return f'"{str(value)}"'
67 |
68 |
69 | def load_policies(path: str) -> dict:
70 | with open(path, "r") as fp:
71 | return yaml.load(fp.read())
72 |
73 |
74 | def make_registry_config(policies: dict, metadata: dict) -> str:
75 | policies = policies.copy()
76 | content = ["Windows Registry Editor Version 5.00", ""]
77 | base_key = metadata["key"]
78 | extension_policies = {
79 | key: policies.pop(key)
80 | for key in [
81 | "ExtensionInstallForcelist",
82 | "ExtensionInstallAllowlist",
83 | "ExtensionInstallBlocklist",
84 | ]
85 | if key in policies
86 | }
87 |
88 | # Add the main key and regular policies
89 | content.append(f"[{base_key}]")
90 | for policy_name, policy_value in policies.items():
91 | if isinstance(policy_value, dict):
92 | # Handle nested policies by creating subkeys
93 | content.append("")
94 | content.append(f"[{base_key}\\{policy_name}]")
95 | for sub_name, sub_value in policy_value.items():
96 | content.append(f'"{sub_name}"={format_reg_value(sub_value)}')
97 | else:
98 | # Handle direct policy values
99 | content.append(f'"{policy_name}"={format_reg_value(policy_value)}')
100 |
101 | # Add extension policies at the end
102 | for policy_name, extensions in extension_policies.items():
103 | if extensions: # Only create key if there are extensions
104 | content.append("")
105 | content.append(f"[{base_key}\\{policy_name}]")
106 | for i, ext in enumerate(extensions, 1):
107 | content.append(f'"{i}"="{ext}"')
108 |
109 | # Join all lines with Windows-style line endings
110 | return "\r\n".join(content)
111 |
112 |
113 | def make_mobileconfig(policies: dict, metadata: dict) -> str:
114 | config = {
115 | "PayloadVersion": 1,
116 | "PayloadScope": "System",
117 | "PayloadType": "Configuration",
118 | "PayloadRemovalDisallowed": False,
119 | "PayloadUUID": metadata["PayloadUUID"],
120 | "PayloadDisplayName": metadata["PayloadDisplayName"],
121 | "PayloadDescription": metadata["PayloadDescription"],
122 | "PayloadIdentifier": metadata["PayloadIdentifier"],
123 | "PayloadContent": [
124 | {
125 | "PayloadIdentifier": metadata["PayloadIdentifier"],
126 | "PayloadType": metadata["PayloadIdentifier"],
127 | "PayloadUUID": metadata["PayloadContentUUID"],
128 | "PayloadVersion": 1,
129 | "PayloadEnabled": True,
130 | **policies,
131 | }
132 | ],
133 | }
134 | return plistlib.dumps(config, sort_keys=False)
135 |
136 |
137 | def write_mobile_config(path: str, policy_content: dict, metadata: dict):
138 | try:
139 | mc_path = Path(path)
140 | mc_path.parent.mkdir(parents=True, exist_ok=True)
141 | conf = make_mobileconfig(policy_content, metadata)
142 | with mc_path.open("wb") as fp:
143 | fp.write(conf)
144 | except Exception as e:
145 | print(f"Error: {e}")
146 |
147 |
148 | def write_reg_config(path: str, policy_content: dict, metadata: dict):
149 | try:
150 | reg_path = Path(path)
151 | reg_path.parent.mkdir(parents=True, exist_ok=True)
152 | conf = make_registry_config(policy_content, metadata)
153 | with reg_path.open("w") as fp:
154 | fp.write(conf)
155 | except Exception as e:
156 | print(f"Error: {e}")
157 |
158 |
159 | def write_json_config(path: str, policy_content: dict, metadata: dict):
160 | try:
161 | json_path = Path(path)
162 | json_path.parent.mkdir(parents=True, exist_ok=True)
163 | with json_path.open("w") as fp:
164 | json.dump(policy_content, fp, indent=2)
165 | except Exception as e:
166 | print(f"Error: {e}")
167 |
168 |
169 | def main():
170 | """Generate OS-specific browser policies from policy spec"""
171 |
172 | policies = load_policies("policies.yaml")
173 | for pname in [POLICY_CHROME, POLICY_BRAVE, POLICY_EDGE]:
174 | print(f"Generating policies for '{pname}' ({len(policies[pname])} rules)")
175 | write_mobile_config(
176 | f"./generated/macos/{pname}.mobileconfig",
177 | policies[pname],
178 | METADATA[pname]["mobileconfig"],
179 | )
180 | write_reg_config(
181 | f"./generated/windows/{pname}.reg",
182 | policies[pname],
183 | METADATA[pname]["registry"],
184 | )
185 | write_json_config(
186 | f"./generated/linux/{pname}.json",
187 | policies[pname],
188 | {},
189 | )
190 |
191 |
192 | if __name__ == "__main__":
193 | main()
194 |
--------------------------------------------------------------------------------
/generated/macos/edge.mobileconfig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PayloadVersion
6 | 1
7 | PayloadScope
8 | System
9 | PayloadType
10 | Configuration
11 | PayloadRemovalDisallowed
12 |
13 | PayloadUUID
14 | 778fb3c3-2e58-4337-86dc-1a8044793d2d
15 | PayloadDisplayName
16 | Microsoft Edge Policies
17 | PayloadDescription
18 | Microsoft Edge Browser system-level policies
19 | PayloadIdentifier
20 | com.microsoft.Edge
21 | PayloadContent
22 |
23 |
24 | PayloadIdentifier
25 | com.microsoft.Edge
26 | PayloadType
27 | com.microsoft.Edge
28 | PayloadUUID
29 | 65ffbe44-b556-4c33-88ea-ab684dab69bc
30 | PayloadVersion
31 | 1
32 | PayloadEnabled
33 |
34 | ApplicationGuardFavoritesSyncEnabled
35 |
36 | ApplicationGuardPassiveModeEnabled
37 |
38 | ApplicationGuardUploadBlockingEnabled
39 |
40 | TyposquattingCheckerEnabled
41 |
42 | EdgeWorkspacesEnabled
43 |
44 | ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled
45 |
46 | BlockExternalExtensions
47 |
48 | ExtensionInstallForcelist
49 |
50 | odfafepnkmbhccpbejgmiehpchacaeak
51 | djkjpnciiommncecmdefpdllknjdmmmo
52 | kkacdgacpkediooahopgcbdahlpipheh
53 | ihknoknoahjhldmpdoajjdkfjhddgpcd
54 |
55 | GenAILocalFoundationalModelSettings
56 | 1
57 | ImplicitSignInEnabled
58 |
59 | LinkedAccountEnabled
60 |
61 | ProactiveAuthWorkflowEnabled
62 |
63 | WebToBrowserSignInEnabled
64 |
65 | EdgeManagementEnabled
66 |
67 | EdgeManagementExtensionsFeedbackEnabled
68 |
69 | MAMEnabled
70 |
71 | PasswordGeneratorEnabled
72 |
73 | PasswordRevealEnabled
74 |
75 | PasswordMonitorAllowed
76 |
77 | RelatedWebsiteSetsEnabled
78 |
79 | ScarewareBlockerProtectionEnabled
80 |
81 | SmartScreenEnabled
82 |
83 | SmartScreenPuaEnabled
84 |
85 | SmartScreenForTrustedDownloadsEnabled
86 |
87 | SmartScreenDnsRequestsEnabled
88 |
89 | NewTabPageAppLauncherEnabled
90 |
91 | NewTabPageBingChatEnabled
92 |
93 | NewTabPageContentEnabled
94 |
95 | NewTabPageHideDefaultTopSites
96 |
97 | NewTabPagePrerenderEnabled
98 |
99 | NewTabPageQuickLinksEnabled
100 |
101 | AADWebSiteSSOUsingThisProfileEnabled
102 |
103 | AccessibilityImageLabelsEnabled
104 |
105 | AddressBarMicrosoftSearchInBingProviderEnabled
106 |
107 | AIGenThemesEnabled
108 |
109 | AllowGamesMenu
110 |
111 | AlternateErrorPagesEnabled
112 |
113 | AmbientAuthenticationInPrivateModesEnabled
114 |
115 | AutomaticHttpsDefault
116 |
117 | BingAdsSuppression
118 |
119 | ComposeInlineEnabled
120 |
121 | ConfigureDoNotTrack
122 |
123 | CryptoWalletEnabled
124 |
125 | DiagnosticData
126 | 0
127 | Edge3PSerpTelemetryEnabled
128 |
129 | EdgeAssetDeliveryServiceEnabled
130 |
131 | EdgeCollectionsEnabled
132 |
133 | EdgeDiscoverEnabled
134 |
135 | EdgeEDropEnabled
136 |
137 | EdgeEnhanceImagesEnabled
138 |
139 | EdgeFollowEnabled
140 |
141 | EdgeShoppingAssistantEnabled
142 |
143 | EdgeWalletCheckoutEnabled
144 |
145 | EdgeWalletEtreeEnabled
146 |
147 | ExperimentationAndConfigurationServiceControl
148 | 0
149 | ForceSync
150 |
151 | HubsSidebarEnabled
152 |
153 | ImageEditorServiceEnabled
154 |
155 | InAppSupportEnabled
156 |
157 | InternetExplorerIntegrationLevel
158 | 0
159 | LiveCaptionsAllowed
160 |
161 | LiveTranslationAllowed
162 |
163 | MathSolverEnabled
164 |
165 | MicrosoftEdgeInsiderPromotionEnabled
166 |
167 | MicrosoftEditorProofingEnabled
168 |
169 | MicrosoftEditorSynonymsEnabled
170 |
171 | MicrosoftOfficeMenuEnabled
172 |
173 | OutlookHubMenuEnabled
174 |
175 | PaymentMethodQueryEnabled
176 |
177 | PersonalizationReportingEnabled
178 |
179 | PersonalizeTopSitesInCustomizeSidebarEnabled
180 |
181 | PictureInPictureOverlayEnabled
182 |
183 | PromotionalTabsEnabled
184 |
185 | PromptForDownloadLocation
186 |
187 | ResolveNavigationErrorsUseWebService
188 |
189 | ShowMicrosoftRewards
190 |
191 | ShowRecommendationsEnabled
192 |
193 | SpeechRecognitionEnabled
194 |
195 | StandaloneHubsSidebarEnabled
196 |
197 | TextPredictionEnabled
198 |
199 | TranslateEnabled
200 |
201 | TravelAssistanceEnabled
202 |
203 | UploadFromPhoneEnabled
204 |
205 | UrlDiagnosticDataEnabled
206 |
207 | UserFeedbackAllowed
208 |
209 | VisualSearchEnabled
210 |
211 | WalletDonationEnabled
212 |
213 | WebWidgetAllowed
214 |
215 | DefaultGeolocationSetting
216 | 2
217 | DefaultNotificationsSetting
218 | 2
219 | DefaultLocalFontsSetting
220 | 2
221 | DefaultSensorsSetting
222 | 2
223 | DefaultSerialGuardSetting
224 | 2
225 | CloudReportingEnabled
226 |
227 | DriveDisabled
228 |
229 | PasswordManagerEnabled
230 |
231 | PasswordSharingEnabled
232 |
233 | PasswordLeakDetectionEnabled
234 |
235 | QuickAnswersEnabled
236 |
237 | SafeBrowsingExtendedReportingEnabled
238 |
239 | SafeBrowsingSurveysEnabled
240 |
241 | SafeBrowsingDeepScanningEnabled
242 |
243 | DeviceActivityHeartbeatEnabled
244 |
245 | DeviceMetricsReportingEnabled
246 |
247 | HeartbeatEnabled
248 |
249 | LogUploadEnabled
250 |
251 | ReportAppInventory
252 |
253 |
254 |
255 | ReportDeviceActivityTimes
256 |
257 | ReportDeviceAppInfo
258 |
259 | ReportDeviceSystemInfo
260 |
261 | ReportDeviceUsers
262 |
263 | ReportWebsiteTelemetry
264 |
265 |
266 |
267 | AutofillCreditCardEnabled
268 |
269 | BackgroundModeEnabled
270 |
271 | BrowserGuestModeEnabled
272 |
273 | BrowserSignin
274 | 0
275 | BuiltInDnsClientEnabled
276 |
277 | DefaultBrowserSettingEnabled
278 |
279 | MetricsReportingEnabled
280 |
281 | ParcelTrackingEnabled
282 |
283 | ShoppingListEnabled
284 |
285 | ExtensionManifestV2Availability
286 | 2
287 |
288 |
289 |
290 |
291 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/uv.lock:
--------------------------------------------------------------------------------
1 | version = 1
2 | revision = 2
3 | requires-python = ">=3.9"
4 |
5 | [[package]]
6 | name = "chrome-debloat"
7 | version = "0.1.0"
8 | source = { virtual = "." }
9 | dependencies = [
10 | { name = "ruamel-yaml" },
11 | ]
12 |
13 | [package.metadata]
14 | requires-dist = [{ name = "ruamel-yaml", specifier = ">=0.18.6" }]
15 |
16 | [[package]]
17 | name = "ruamel-yaml"
18 | version = "0.18.14"
19 | source = { registry = "https://pypi.org/simple" }
20 | dependencies = [
21 | { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" },
22 | ]
23 | sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload-time = "2025-06-09T08:51:09.828Z" }
24 | wheels = [
25 | { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload-time = "2025-06-09T08:51:06.348Z" },
26 | ]
27 |
28 | [[package]]
29 | name = "ruamel-yaml-clib"
30 | version = "0.2.12"
31 | source = { registry = "https://pypi.org/simple" }
32 | sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" }
33 | wheels = [
34 | { url = "https://files.pythonhosted.org/packages/70/57/40a958e863e299f0c74ef32a3bde9f2d1ea8d69669368c0c502a0997f57f/ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5", size = 131301, upload-time = "2024-10-20T10:12:35.876Z" },
35 | { url = "https://files.pythonhosted.org/packages/98/a8/29a3eb437b12b95f50a6bcc3d7d7214301c6c529d8fdc227247fa84162b5/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969", size = 633728, upload-time = "2024-10-20T10:12:37.858Z" },
36 | { url = "https://files.pythonhosted.org/packages/35/6d/ae05a87a3ad540259c3ad88d71275cbd1c0f2d30ae04c65dcbfb6dcd4b9f/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df", size = 722230, upload-time = "2024-10-20T10:12:39.457Z" },
37 | { url = "https://files.pythonhosted.org/packages/7f/b7/20c6f3c0b656fe609675d69bc135c03aac9e3865912444be6339207b6648/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76", size = 686712, upload-time = "2024-10-20T10:12:41.119Z" },
38 | { url = "https://files.pythonhosted.org/packages/cd/11/d12dbf683471f888d354dac59593873c2b45feb193c5e3e0f2ebf85e68b9/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6", size = 663936, upload-time = "2024-10-21T11:26:37.419Z" },
39 | { url = "https://files.pythonhosted.org/packages/72/14/4c268f5077db5c83f743ee1daeb236269fa8577133a5cfa49f8b382baf13/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd", size = 696580, upload-time = "2024-10-21T11:26:39.503Z" },
40 | { url = "https://files.pythonhosted.org/packages/30/fc/8cd12f189c6405a4c1cf37bd633aa740a9538c8e40497c231072d0fef5cf/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a", size = 663393, upload-time = "2024-12-11T19:58:13.873Z" },
41 | { url = "https://files.pythonhosted.org/packages/80/29/c0a017b704aaf3cbf704989785cd9c5d5b8ccec2dae6ac0c53833c84e677/ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da", size = 100326, upload-time = "2024-10-20T10:12:42.967Z" },
42 | { url = "https://files.pythonhosted.org/packages/3a/65/fa39d74db4e2d0cd252355732d966a460a41cd01c6353b820a0952432839/ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28", size = 118079, upload-time = "2024-10-20T10:12:44.117Z" },
43 | { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload-time = "2024-10-20T10:12:45.162Z" },
44 | { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload-time = "2024-10-20T10:12:46.758Z" },
45 | { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload-time = "2024-10-20T10:12:48.605Z" },
46 | { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload-time = "2024-10-20T10:12:51.124Z" },
47 | { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload-time = "2024-10-21T11:26:41.438Z" },
48 | { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload-time = "2024-10-21T11:26:43.62Z" },
49 | { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload-time = "2024-12-11T19:58:15.592Z" },
50 | { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload-time = "2024-10-20T10:12:52.865Z" },
51 | { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload-time = "2024-10-20T10:12:54.652Z" },
52 | { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" },
53 | { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" },
54 | { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" },
55 | { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" },
56 | { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" },
57 | { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" },
58 | { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" },
59 | { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" },
60 | { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" },
61 | { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" },
62 | { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" },
63 | { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" },
64 | { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" },
65 | { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" },
66 | { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" },
67 | { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" },
68 | { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" },
69 | { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" },
70 | { url = "https://files.pythonhosted.org/packages/e5/46/ccdef7a84ad745c37cb3d9a81790f28fbc9adf9c237dba682017b123294e/ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987", size = 131834, upload-time = "2024-10-20T10:13:11.72Z" },
71 | { url = "https://files.pythonhosted.org/packages/29/09/932360f30ad1b7b79f08757e0a6fb8c5392a52cdcc182779158fe66d25ac/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45", size = 636120, upload-time = "2024-10-20T10:13:12.84Z" },
72 | { url = "https://files.pythonhosted.org/packages/a2/2a/5b27602e7a4344c1334e26bf4739746206b7a60a8acdba33a61473468b73/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519", size = 724914, upload-time = "2024-10-20T10:13:14.605Z" },
73 | { url = "https://files.pythonhosted.org/packages/da/1c/23497017c554fc06ff5701b29355522cff850f626337fff35d9ab352cb18/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7", size = 689072, upload-time = "2024-10-20T10:13:15.939Z" },
74 | { url = "https://files.pythonhosted.org/packages/68/e6/f3d4ff3223f9ea49c3b7169ec0268e42bd49f87c70c0e3e853895e4a7ae2/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285", size = 667091, upload-time = "2024-10-21T11:26:52.274Z" },
75 | { url = "https://files.pythonhosted.org/packages/84/62/ead07043527642491e5011b143f44b81ef80f1025a96069b7210e0f2f0f3/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed", size = 699111, upload-time = "2024-10-21T11:26:54.294Z" },
76 | { url = "https://files.pythonhosted.org/packages/52/b3/fe4d84446f7e4887e3bea7ceff0a7df23790b5ed625f830e79ace88ebefb/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7", size = 666365, upload-time = "2024-12-11T19:58:20.444Z" },
77 | { url = "https://files.pythonhosted.org/packages/6e/b3/7feb99a00bfaa5c6868617bb7651308afde85e5a0b23cd187fe5de65feeb/ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12", size = 100863, upload-time = "2024-10-20T10:13:17.244Z" },
78 | { url = "https://files.pythonhosted.org/packages/93/07/de635108684b7a5bb06e432b0930c5a04b6c59efe73bd966d8db3cc208f2/ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b", size = 118653, upload-time = "2024-10-20T10:13:18.289Z" },
79 | ]
80 |
--------------------------------------------------------------------------------