We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Useless Request of a streetlist from muellmax.de
### I Have A Problem With:

A specific source

### What's Your Problem

We are the developers of müllmax. We can accept automated daily ical-requests, currently more than 500 a day. But it is annoying, when useless dataload is produced. To select a street name, an empty formfield mm_frm_str_name is sent, which is the request for a complete list of streetnames. This can cause a dataload of 100.000 kb or more and is comletely useless. Instead of an empty field the requested streetname should be submitted. The second call with the requested streetname in formfield mm_frm_str_sel is unnecessary and should be omitted.

### Source (if relevant)

muellmax_de.py 

### Logs

```Shell
if self._mm_frm_str_sel is not None:
            # show street selection page
            args = {
                "mm_ses": mm_ses.value,
                "xxx": 1,
                "mm_frm_str_name": "",
                "mm_aus_str_txt_submit": "suchen",
            }
            r = requests.post(url, data=args)
            mm_ses.feed(r.text)

            # select street
            args = {
                "mm_ses": mm_ses.value,
                "xxx": 1,
                "mm_frm_str_sel": self._mm_frm_str_sel,
                "mm_aus_str_sel_submit": "weiter",
            }
            r = requests.post(url, data=args)
            mm_ses.feed(r.text)
```


### Relevant Configuration

```YAML
We do not have hacs_waste_collection_schedule installed.
```


### Checklist Source Error

- [X] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)
- [X] Checked that the website of your service provider is still working
- [X] Tested my attributes on the service provider website (if possible)
- [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on "Redownload" and choose master as version)

### Checklist Sensor Error

- [X] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)

### Required

- [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.
- [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py`
Content:
```
1 from html.parser import HTMLParser
2 
3 import requests
4 from waste_collection_schedule import Collection  # type: ignore[attr-defined]
5 from waste_collection_schedule.service.ICS import ICS
6 from waste_collection_schedule.service.MuellmaxDe import SERVICE_MAP
7 
8 TITLE = "Müllmax"
9 DESCRIPTION = "Source for Müllmax waste collection."
10 URL = "https://www.muellmax.de"
11 
12 
13 def EXTRA_INFO():
14     return [{"title": s["title"], "url": s["url"]} for s in SERVICE_MAP]
15 
16 
17 TEST_CASES = {
18     "Rhein-Sieg-Kreis, Alfter": {
19         "service": "Rsa",
20         "mm_frm_ort_sel": "Alfter",
21         "mm_frm_str_sel": "Ahrweg (105-Ende/94-Ende)",
22     },
23     "Münster, Achatiusweg": {"service": "Awm", "mm_frm_str_sel": "Achatiusweg"},
24 }
25 
26 
27 # Parser for HTML checkbox
28 class InputCheckboxParser(HTMLParser):
29     def __init__(self, startswith):
30         super().__init__()
31         self._startswith = startswith
32         self._value = {}
33 
34     @property
35     def value(self):
36         return self._value
37 
38     def handle_starttag(self, tag, attrs):
39         if tag == "input":
40             d = dict(attrs)
41             if d.get("name", "").startswith(self._startswith):
42                 self._value[d["name"]] = d.get("value")
43 
44 
45 # Parser for HTML input (hidden) text
46 class InputTextParser(HTMLParser):
47     def __init__(self, **identifiers):
48         super().__init__()
49         self._identifiers = identifiers
50         self._value = None
51 
52     @property
53     def value(self):
54         return self._value
55 
56     def handle_starttag(self, tag, attrs):
57         if tag == "input":
58             d = dict(attrs)
59             for key, value in self._identifiers.items():
60                 if key not in d or d[key] != value:
61                     return
62             self._value = d.get("value")
63 
64 
65 class Source:
66     def __init__(
67         self, service, mm_frm_ort_sel=None, mm_frm_str_sel=None, mm_frm_hnr_sel=None
68     ):
69         self._service = service
70         self._mm_frm_ort_sel = mm_frm_ort_sel
71         self._mm_frm_str_sel = mm_frm_str_sel
72         self._mm_frm_hnr_sel = mm_frm_hnr_sel
73         self._ics = ICS()
74 
75     def fetch(self):
76         mm_ses = InputTextParser(name="mm_ses")
77 
78         url = f"https://www.muellmax.de/abfallkalender/{self._service.lower()}/res/{self._service}Start.php"
79         r = requests.get(url)
80         mm_ses.feed(r.text)
81 
82         # select "Abfuhrtermine", returns ort or an empty street search field
83         args = {"mm_ses": mm_ses.value, "mm_aus_ort.x": 0, "mm_aus_ort.x": 0}
84         r = requests.post(url, data=args)
85         mm_ses.feed(r.text)
86 
87         if self._mm_frm_ort_sel is not None:
88             # select city
89             args = {
90                 "mm_ses": mm_ses.value,
91                 "xxx": 1,
92                 "mm_frm_ort_sel": self._mm_frm_ort_sel,
93                 "mm_aus_ort_submit": "weiter",
94             }
95             r = requests.post(url, data=args)
96             mm_ses.feed(r.text)
97 
98         if self._mm_frm_str_sel is not None:
99             # show street selection page
100             args = {
101                 "mm_ses": mm_ses.value,
102                 "xxx": 1,
103                 "mm_frm_str_name": "",
104                 "mm_aus_str_txt_submit": "suchen",
105             }
106             r = requests.post(url, data=args)
107             mm_ses.feed(r.text)
108 
109             # select street
110             args = {
111                 "mm_ses": mm_ses.value,
112                 "xxx": 1,
113                 "mm_frm_str_sel": self._mm_frm_str_sel,
114                 "mm_aus_str_sel_submit": "weiter",
115             }
116             r = requests.post(url, data=args)
117             mm_ses.feed(r.text)
118 
119         if self._mm_frm_hnr_sel is not None:
120             # select house number
121             args = {
122                 "mm_ses": mm_ses.value,
123                 "xxx": 1,
124                 "mm_frm_hnr_sel": self._mm_frm_hnr_sel,
125                 "mm_aus_hnr_sel_submit": "weiter",
126             }
127             r = requests.post(url, data=args)
128             mm_ses.feed(r.text)
129 
130         # select to get ical
131         args = {"mm_ses": mm_ses.value, "xxx": 1, "mm_ica_auswahl": "iCalendar-Datei"}
132         r = requests.post(url, data=args)
133         mm_ses.feed(r.text)
134 
135         mm_frm_fra = InputCheckboxParser(startswith="mm_frm_fra")
136         mm_frm_fra.feed(r.text)
137 
138         # get ics file
139         args = {"mm_ses": mm_ses.value, "xxx": 1, "mm_frm_type": "termine"}
140         args.update(mm_frm_fra.value)
141         args.update({"mm_ica_gen": "iCalendar-Datei laden"})
142         r = requests.post(url, data=args)
143         mm_ses.feed(r.text)
144 
145         entries = []
146 
147         # parse ics file
148         dates = self._ics.convert(r.text)
149 
150         entries = []
151         for d in dates:
152             entries.append(Collection(d[0], d[1]))
153         return entries
154
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py
--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py
+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py
@@ -96,22 +96,12 @@
             mm_ses.feed(r.text)
 
         if self._mm_frm_str_sel is not None:
-            # show street selection page
-            args = {
-                "mm_ses": mm_ses.value,
-                "xxx": 1,
-                "mm_frm_str_name": "",
-                "mm_aus_str_txt_submit": "suchen",
-            }
-            r = requests.post(url, data=args)
-            mm_ses.feed(r.text)
-
             # select street
             args = {
                 "mm_ses": mm_ses.value,
                 "xxx": 1,
                 "mm_frm_str_sel": self._mm_frm_str_sel,
-                "mm_aus_str_sel_submit": "weiter",
+                "mm_aus_str_sel_submit": "suchen",
             }
             r = requests.post(url, data=args)
             mm_ses.feed(r.text)

{"golden_diff": "diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py\n--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py\n+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py\n@@ -96,22 +96,12 @@\n             mm_ses.feed(r.text)\n \n         if self._mm_frm_str_sel is not None:\n-            # show street selection page\n-            args = {\n-                \"mm_ses\": mm_ses.value,\n-                \"xxx\": 1,\n-                \"mm_frm_str_name\": \"\",\n-                \"mm_aus_str_txt_submit\": \"suchen\",\n-            }\n-            r = requests.post(url, data=args)\n-            mm_ses.feed(r.text)\n-\n             # select street\n             args = {\n                 \"mm_ses\": mm_ses.value,\n                 \"xxx\": 1,\n                 \"mm_frm_str_sel\": self._mm_frm_str_sel,\n-                \"mm_aus_str_sel_submit\": \"weiter\",\n+                \"mm_aus_str_sel_submit\": \"suchen\",\n             }\n             r = requests.post(url, data=args)\n             mm_ses.feed(r.text)\n", "issue": "Useless Request of a streetlist from muellmax.de\n### I Have A Problem With:\n\nA specific source\n\n### What's Your Problem\n\nWe are the developers of m\u00fcllmax. We can accept automated daily ical-requests, currently more than 500 a day. But it is annoying, when useless dataload is produced. To select a street name, an empty formfield mm_frm_str_name is sent, which is the request for a complete list of streetnames. This can cause a dataload of 100.000 kb or more and is comletely useless. Instead of an empty field the requested streetname should be submitted. The second call with the requested streetname in formfield mm_frm_str_sel is unnecessary and should be omitted.\n\n### Source (if relevant)\n\nmuellmax_de.py \n\n### Logs\n\n```Shell\nif self._mm_frm_str_sel is not None:\r\n            # show street selection page\r\n            args = {\r\n                \"mm_ses\": mm_ses.value,\r\n                \"xxx\": 1,\r\n                \"mm_frm_str_name\": \"\",\r\n                \"mm_aus_str_txt_submit\": \"suchen\",\r\n            }\r\n            r = requests.post(url, data=args)\r\n            mm_ses.feed(r.text)\r\n\r\n            # select street\r\n            args = {\r\n                \"mm_ses\": mm_ses.value,\r\n                \"xxx\": 1,\r\n                \"mm_frm_str_sel\": self._mm_frm_str_sel,\r\n                \"mm_aus_str_sel_submit\": \"weiter\",\r\n            }\r\n            r = requests.post(url, data=args)\r\n            mm_ses.feed(r.text)\n```\n\n\n### Relevant Configuration\n\n```YAML\nWe do not have hacs_waste_collection_schedule installed.\n```\n\n\n### Checklist Source Error\n\n- [X] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)\n- [X] Checked that the website of your service provider is still working\n- [X] Tested my attributes on the service provider website (if possible)\n- [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on \"Redownload\" and choose master as version)\n\n### Checklist Sensor Error\n\n- [X] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)\n\n### Required\n\n- [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.\n- [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.\n", "before_files": [{"content": "from html.parser import HTMLParser\n\nimport requests\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\nfrom waste_collection_schedule.service.MuellmaxDe import SERVICE_MAP\n\nTITLE = \"M\u00fcllmax\"\nDESCRIPTION = \"Source for M\u00fcllmax waste collection.\"\nURL = \"https://www.muellmax.de\"\n\n\ndef EXTRA_INFO():\n    return [{\"title\": s[\"title\"], \"url\": s[\"url\"]} for s in SERVICE_MAP]\n\n\nTEST_CASES = {\n    \"Rhein-Sieg-Kreis, Alfter\": {\n        \"service\": \"Rsa\",\n        \"mm_frm_ort_sel\": \"Alfter\",\n        \"mm_frm_str_sel\": \"Ahrweg (105-Ende/94-Ende)\",\n    },\n    \"M\u00fcnster, Achatiusweg\": {\"service\": \"Awm\", \"mm_frm_str_sel\": \"Achatiusweg\"},\n}\n\n\n# Parser for HTML checkbox\nclass InputCheckboxParser(HTMLParser):\n    def __init__(self, startswith):\n        super().__init__()\n        self._startswith = startswith\n        self._value = {}\n\n    @property\n    def value(self):\n        return self._value\n\n    def handle_starttag(self, tag, attrs):\n        if tag == \"input\":\n            d = dict(attrs)\n            if d.get(\"name\", \"\").startswith(self._startswith):\n                self._value[d[\"name\"]] = d.get(\"value\")\n\n\n# Parser for HTML input (hidden) text\nclass InputTextParser(HTMLParser):\n    def __init__(self, **identifiers):\n        super().__init__()\n        self._identifiers = identifiers\n        self._value = None\n\n    @property\n    def value(self):\n        return self._value\n\n    def handle_starttag(self, tag, attrs):\n        if tag == \"input\":\n            d = dict(attrs)\n            for key, value in self._identifiers.items():\n                if key not in d or d[key] != value:\n                    return\n            self._value = d.get(\"value\")\n\n\nclass Source:\n    def __init__(\n        self, service, mm_frm_ort_sel=None, mm_frm_str_sel=None, mm_frm_hnr_sel=None\n    ):\n        self._service = service\n        self._mm_frm_ort_sel = mm_frm_ort_sel\n        self._mm_frm_str_sel = mm_frm_str_sel\n        self._mm_frm_hnr_sel = mm_frm_hnr_sel\n        self._ics = ICS()\n\n    def fetch(self):\n        mm_ses = InputTextParser(name=\"mm_ses\")\n\n        url = f\"https://www.muellmax.de/abfallkalender/{self._service.lower()}/res/{self._service}Start.php\"\n        r = requests.get(url)\n        mm_ses.feed(r.text)\n\n        # select \"Abfuhrtermine\", returns ort or an empty street search field\n        args = {\"mm_ses\": mm_ses.value, \"mm_aus_ort.x\": 0, \"mm_aus_ort.x\": 0}\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        if self._mm_frm_ort_sel is not None:\n            # select city\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_ort_sel\": self._mm_frm_ort_sel,\n                \"mm_aus_ort_submit\": \"weiter\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        if self._mm_frm_str_sel is not None:\n            # show street selection page\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_str_name\": \"\",\n                \"mm_aus_str_txt_submit\": \"suchen\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n            # select street\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_str_sel\": self._mm_frm_str_sel,\n                \"mm_aus_str_sel_submit\": \"weiter\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        if self._mm_frm_hnr_sel is not None:\n            # select house number\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_hnr_sel\": self._mm_frm_hnr_sel,\n                \"mm_aus_hnr_sel_submit\": \"weiter\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        # select to get ical\n        args = {\"mm_ses\": mm_ses.value, \"xxx\": 1, \"mm_ica_auswahl\": \"iCalendar-Datei\"}\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        mm_frm_fra = InputCheckboxParser(startswith=\"mm_frm_fra\")\n        mm_frm_fra.feed(r.text)\n\n        # get ics file\n        args = {\"mm_ses\": mm_ses.value, \"xxx\": 1, \"mm_frm_type\": \"termine\"}\n        args.update(mm_frm_fra.value)\n        args.update({\"mm_ica_gen\": \"iCalendar-Datei laden\"})\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        entries = []\n\n        # parse ics file\n        dates = self._ics.convert(r.text)\n\n        entries = []\n        for d in dates:\n            entries.append(Collection(d[0], d[1]))\n        return entries\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py"}], "after_files": [{"content": "from html.parser import HTMLParser\n\nimport requests\nfrom waste_collection_schedule import Collection  # type: ignore[attr-defined]\nfrom waste_collection_schedule.service.ICS import ICS\nfrom waste_collection_schedule.service.MuellmaxDe import SERVICE_MAP\n\nTITLE = \"M\u00fcllmax\"\nDESCRIPTION = \"Source for M\u00fcllmax waste collection.\"\nURL = \"https://www.muellmax.de\"\n\n\ndef EXTRA_INFO():\n    return [{\"title\": s[\"title\"], \"url\": s[\"url\"]} for s in SERVICE_MAP]\n\n\nTEST_CASES = {\n    \"Rhein-Sieg-Kreis, Alfter\": {\n        \"service\": \"Rsa\",\n        \"mm_frm_ort_sel\": \"Alfter\",\n        \"mm_frm_str_sel\": \"Ahrweg (105-Ende/94-Ende)\",\n    },\n    \"M\u00fcnster, Achatiusweg\": {\"service\": \"Awm\", \"mm_frm_str_sel\": \"Achatiusweg\"},\n}\n\n\n# Parser for HTML checkbox\nclass InputCheckboxParser(HTMLParser):\n    def __init__(self, startswith):\n        super().__init__()\n        self._startswith = startswith\n        self._value = {}\n\n    @property\n    def value(self):\n        return self._value\n\n    def handle_starttag(self, tag, attrs):\n        if tag == \"input\":\n            d = dict(attrs)\n            if d.get(\"name\", \"\").startswith(self._startswith):\n                self._value[d[\"name\"]] = d.get(\"value\")\n\n\n# Parser for HTML input (hidden) text\nclass InputTextParser(HTMLParser):\n    def __init__(self, **identifiers):\n        super().__init__()\n        self._identifiers = identifiers\n        self._value = None\n\n    @property\n    def value(self):\n        return self._value\n\n    def handle_starttag(self, tag, attrs):\n        if tag == \"input\":\n            d = dict(attrs)\n            for key, value in self._identifiers.items():\n                if key not in d or d[key] != value:\n                    return\n            self._value = d.get(\"value\")\n\n\nclass Source:\n    def __init__(\n        self, service, mm_frm_ort_sel=None, mm_frm_str_sel=None, mm_frm_hnr_sel=None\n    ):\n        self._service = service\n        self._mm_frm_ort_sel = mm_frm_ort_sel\n        self._mm_frm_str_sel = mm_frm_str_sel\n        self._mm_frm_hnr_sel = mm_frm_hnr_sel\n        self._ics = ICS()\n\n    def fetch(self):\n        mm_ses = InputTextParser(name=\"mm_ses\")\n\n        url = f\"https://www.muellmax.de/abfallkalender/{self._service.lower()}/res/{self._service}Start.php\"\n        r = requests.get(url)\n        mm_ses.feed(r.text)\n\n        # select \"Abfuhrtermine\", returns ort or an empty street search field\n        args = {\"mm_ses\": mm_ses.value, \"mm_aus_ort.x\": 0, \"mm_aus_ort.x\": 0}\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        if self._mm_frm_ort_sel is not None:\n            # select city\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_ort_sel\": self._mm_frm_ort_sel,\n                \"mm_aus_ort_submit\": \"weiter\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        if self._mm_frm_str_sel is not None:\n            # select street\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_str_sel\": self._mm_frm_str_sel,\n                \"mm_aus_str_sel_submit\": \"suchen\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        if self._mm_frm_hnr_sel is not None:\n            # select house number\n            args = {\n                \"mm_ses\": mm_ses.value,\n                \"xxx\": 1,\n                \"mm_frm_hnr_sel\": self._mm_frm_hnr_sel,\n                \"mm_aus_hnr_sel_submit\": \"weiter\",\n            }\n            r = requests.post(url, data=args)\n            mm_ses.feed(r.text)\n\n        # select to get ical\n        args = {\"mm_ses\": mm_ses.value, \"xxx\": 1, \"mm_ica_auswahl\": \"iCalendar-Datei\"}\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        mm_frm_fra = InputCheckboxParser(startswith=\"mm_frm_fra\")\n        mm_frm_fra.feed(r.text)\n\n        # get ics file\n        args = {\"mm_ses\": mm_ses.value, \"xxx\": 1, \"mm_frm_type\": \"termine\"}\n        args.update(mm_frm_fra.value)\n        args.update({\"mm_ica_gen\": \"iCalendar-Datei laden\"})\n        r = requests.post(url, data=args)\n        mm_ses.feed(r.text)\n\n        entries = []\n\n        # parse ics file\n        dates = self._ics.convert(r.text)\n\n        entries = []\n        for d in dates:\n            entries.append(Collection(d[0], d[1]))\n        return entries\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/muellmax_de.py"}]}