spArgValidatorPy 1.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of spArgValidatorPy might be problematic. Click here for more details.

@@ -0,0 +1,77 @@
1
+ # development files & folder
2
+ dev/
3
+
4
+ # script files & folder
5
+ script/
6
+
7
+ # private stuff temporarily stored in temp folder
8
+ temp/
9
+
10
+ # using .hatch folder for local virtual env for VS Code to find it
11
+ .hatch/
12
+
13
+ # Byte-compiled / optimized / DLL files
14
+ __pycache__/
15
+ *.py[codz]
16
+ *$py.class
17
+
18
+ # C extensions
19
+ *.so
20
+
21
+ # Distribution / packaging
22
+ .Python
23
+ build/
24
+ develop-eggs/
25
+ dist/
26
+ downloads/
27
+ eggs/
28
+ .eggs/
29
+ lib/
30
+ lib64/
31
+ parts/
32
+ sdist/
33
+ var/
34
+ wheels/
35
+ share/python-wheels/
36
+ *.egg-info/
37
+ .installed.cfg
38
+ *.egg
39
+ MANIFEST
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
+ .mypy_cache
56
+
57
+ # Translations
58
+ *.mo
59
+ *.pot
60
+
61
+ # Environments
62
+ .env
63
+ .envrc
64
+ .venv
65
+ env/
66
+ venv/
67
+ ENV/
68
+ env.bak/
69
+ venv.bak/
70
+
71
+
72
+ # Visual Studio Code
73
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
74
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
75
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
76
+ # you could uncomment the following to ignore the entire vscode folder
77
+ # .vscode/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 krokoreit (krokoreit@gmail.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.4
2
+ Name: spArgValidatorPy
3
+ Version: 1.0.5
4
+ Summary: A Python package for validating function arguments and either raising an exception or returning the validated value.
5
+ Project-URL: Homepage, https://github.com/krokoreit/spArgValidatorPy
6
+ Project-URL: Source Code, https://github.com/krokoreit/spArgValidatorPy
7
+ Author-email: krokoreit <krokoreit@gmail.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: argument validation,function arguments,valid float,valid integer,valid string,validator
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: >=3.10
14
+ Description-Content-Type: text/markdown
15
+
16
+ # spArgValidatorPy
17
+
18
+ [![PyPI - Version](https://img.shields.io/pypi/v/spArgValidatorPy.svg)](https://pypi.org/project/spArgValidatorPy)
19
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/spArgValidatorPy.svg)](https://pypi.org/project/spArgValidatorPy)
20
+
21
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
22
+
23
+
24
+ This package provides a Python module for validating function arguments. Depending on the outcome, it either raises an exception or returns the validated value.
25
+
26
+ If a numeric argument is provided as a string representation (e.g. "100" or "3.24"), it will be converted and returned as a valid int or float, unless validation is performed in strict mode. Numeric arguments can also be checked against minimum and/or maximum limits.
27
+
28
+ String arguments are considered valid if they can be converted to a string (e.g. 123 becomes "123"), unless validation is done in strict mode, which only accepts values of type str. By default, empty strings cause an exception, but this can be disabled by allowing a minimum length of 0.
29
+
30
+ All validation functions support an optional default argument. If provided, this value is returned instead of raising an exception when validation fails. This simplifies code by removing the need for a separate try–except block to set fallback values. The default must be passed as a keyword argument (default=value) and must match the expected type (str, int, or float).
31
+
32
+ For numeric validations, you can also enable the return_limits=True option to return the defined minimum or maximum value instead of raising an exception.
33
+
34
+ For more details, see the API reference below and the examples in examples/example01.py, which includes over 20 usage demonstrations.
35
+
36
+ Enjoy
37
+
38
+ &emsp;krokoreit
39
+ &emsp;&emsp;&emsp;<img src="https://github.com/krokoreit/spArgValidatorPy/blob/main/assets/krokoreit-01.svg?raw=true" width="140"/>
40
+
41
+
42
+ ## Installation
43
+
44
+ ```console
45
+ pip install spArgValidatorPy
46
+ ```
47
+
48
+
49
+ ## Usage & API
50
+
51
+ ### ArgValidator Class
52
+ Import module and instantiate an ArgValidator object:
53
+ ```py
54
+ from spArgValidatorPy import ArgValidator
55
+
56
+ av = ArgValidator()
57
+ ```
58
+
59
+ Argument validation is then as simple as
60
+ ```py
61
+ def my_function(str_arg, int_arg, float_arg):
62
+ str_arg = av.get_validated_str("str_arg")
63
+ int_arg = av.get_validated_int("int_arg")
64
+ float_arg = av.get_validated_float("float_arg")
65
+ ....
66
+ ```
67
+ Note that the name of the argument is passed to the validation function and not the value.
68
+ After successful validation (no exception raised), these variables can be safely used as str, int and float. For more complex validation with the use of strict mode, minimum or maximum values allowed or defaults, see the validation functions below.
69
+
70
+
71
+ </br>
72
+
73
+ ### API
74
+
75
+ #### </a>Methods<a id="methods">
76
+ * [get_validated_int()](#get_validated_int-method)
77
+ * [get_validated_float()](#get_validated_float-method)
78
+ * [get_validated_str()](#get_validated_str-method)
79
+ </br>
80
+ </br>
81
+
82
+
83
+ #### get_validated_int() Method<a id="get_validated_int-method"></a>
84
+ ```py
85
+ get_validated_int(var_name, min_value, max_value, strict, default=int_value, return_limits=boolean_value)
86
+ ```
87
+ Arguments:
88
+ - var_name
89
+ The name of the argument being validated.
90
+ - min_value
91
+ Optional lower limit to validate var_name's value against.
92
+ - max_value
93
+ Optional upper limit to validate var_name's value against.
94
+ - strict
95
+ Optional boolean argument to allow only integers as var_name's value, when set to True. The default is validation in non-strict mode, which allows string representations of an integer (e.g. "220").
96
+ - default=int_value
97
+ Optional keyword argument for an integer default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
98
+ - return_limits=boolean_value
99
+ Optional keyword argument to avoid an exception being raised for values outside the limits.
100
+ When set to True and with either min_value or max_value being exceeded, this limit value is returned as validated value.
101
+
102
+ Returns the validated integer value or with the default or return_limits option used, one of these values instead of an exception raised.
103
+
104
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
105
+
106
+ </br>
107
+
108
+ #### get_validated_float() Method<a id="get_validated_float-method"></a>
109
+ ```py
110
+ get_validated_float(var_name, min_value, max_value, strict, default=float_value, return_limits=boolean_value)
111
+ ```
112
+ Arguments:
113
+ - var_name
114
+ The name of the argument being validated.
115
+ - min_value
116
+ Optional lower limit to validate var_name's value against.
117
+ - max_value
118
+ Optional upper limit to validate var_name's value against.
119
+ - strict
120
+ Optional boolean argument to allow only a float as var_name's value, when set to True. The default is validation in non-strict mode, which allows string representations of a float (e.g. "1.99").
121
+ - default=float_value
122
+ Optional keyword argument for a float default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
123
+ - return_limits=boolean_value
124
+ Optional keyword argument to avoid an exception being raised for values outside the limits.
125
+ When set to True and with either min_value or max_value being exceeded, this limit value is returned as validated value.
126
+
127
+ Returns the validated float value or with the default or return_limits option used, one of these values instead of an exception raised.
128
+
129
+
130
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
131
+
132
+ </br>
133
+
134
+ #### get_validated_str() Method<a id="get_validated_str-method"></a>
135
+ ```py
136
+ get_validated_str(var_name, min_length, strict, default=str_value)
137
+ ```
138
+ - var_name
139
+ The name of the argument being validated.
140
+ - min_length
141
+ The minimum length required for a valid string. By default thi sis set to 1, meaning that empty strings will throw an exception. This can be set to 0 to allow empty strings or to any other length, against which you want to validate.
142
+ - strict
143
+ Optional boolean argument to allow only a string as var_name's value, when set to True. The default is validation in non-strict mode, which allows any value, which can be converted into a string.
144
+ - default=str_value
145
+ Optional keyword argument for a string default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
146
+
147
+ Returns the validated string value or with the default option used, this value instead of an exception raised.
148
+
149
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
150
+
151
+ </br>
152
+
153
+ ## License
154
+ MIT license
155
+ Copyright &copy; 2025 by krokoreit
@@ -0,0 +1,140 @@
1
+ # spArgValidatorPy
2
+
3
+ [![PyPI - Version](https://img.shields.io/pypi/v/spArgValidatorPy.svg)](https://pypi.org/project/spArgValidatorPy)
4
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/spArgValidatorPy.svg)](https://pypi.org/project/spArgValidatorPy)
5
+
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+
9
+ This package provides a Python module for validating function arguments. Depending on the outcome, it either raises an exception or returns the validated value.
10
+
11
+ If a numeric argument is provided as a string representation (e.g. "100" or "3.24"), it will be converted and returned as a valid int or float, unless validation is performed in strict mode. Numeric arguments can also be checked against minimum and/or maximum limits.
12
+
13
+ String arguments are considered valid if they can be converted to a string (e.g. 123 becomes "123"), unless validation is done in strict mode, which only accepts values of type str. By default, empty strings cause an exception, but this can be disabled by allowing a minimum length of 0.
14
+
15
+ All validation functions support an optional default argument. If provided, this value is returned instead of raising an exception when validation fails. This simplifies code by removing the need for a separate try–except block to set fallback values. The default must be passed as a keyword argument (default=value) and must match the expected type (str, int, or float).
16
+
17
+ For numeric validations, you can also enable the return_limits=True option to return the defined minimum or maximum value instead of raising an exception.
18
+
19
+ For more details, see the API reference below and the examples in examples/example01.py, which includes over 20 usage demonstrations.
20
+
21
+ Enjoy
22
+
23
+ &emsp;krokoreit
24
+ &emsp;&emsp;&emsp;<img src="https://github.com/krokoreit/spArgValidatorPy/blob/main/assets/krokoreit-01.svg?raw=true" width="140"/>
25
+
26
+
27
+ ## Installation
28
+
29
+ ```console
30
+ pip install spArgValidatorPy
31
+ ```
32
+
33
+
34
+ ## Usage & API
35
+
36
+ ### ArgValidator Class
37
+ Import module and instantiate an ArgValidator object:
38
+ ```py
39
+ from spArgValidatorPy import ArgValidator
40
+
41
+ av = ArgValidator()
42
+ ```
43
+
44
+ Argument validation is then as simple as
45
+ ```py
46
+ def my_function(str_arg, int_arg, float_arg):
47
+ str_arg = av.get_validated_str("str_arg")
48
+ int_arg = av.get_validated_int("int_arg")
49
+ float_arg = av.get_validated_float("float_arg")
50
+ ....
51
+ ```
52
+ Note that the name of the argument is passed to the validation function and not the value.
53
+ After successful validation (no exception raised), these variables can be safely used as str, int and float. For more complex validation with the use of strict mode, minimum or maximum values allowed or defaults, see the validation functions below.
54
+
55
+
56
+ </br>
57
+
58
+ ### API
59
+
60
+ #### </a>Methods<a id="methods">
61
+ * [get_validated_int()](#get_validated_int-method)
62
+ * [get_validated_float()](#get_validated_float-method)
63
+ * [get_validated_str()](#get_validated_str-method)
64
+ </br>
65
+ </br>
66
+
67
+
68
+ #### get_validated_int() Method<a id="get_validated_int-method"></a>
69
+ ```py
70
+ get_validated_int(var_name, min_value, max_value, strict, default=int_value, return_limits=boolean_value)
71
+ ```
72
+ Arguments:
73
+ - var_name
74
+ The name of the argument being validated.
75
+ - min_value
76
+ Optional lower limit to validate var_name's value against.
77
+ - max_value
78
+ Optional upper limit to validate var_name's value against.
79
+ - strict
80
+ Optional boolean argument to allow only integers as var_name's value, when set to True. The default is validation in non-strict mode, which allows string representations of an integer (e.g. "220").
81
+ - default=int_value
82
+ Optional keyword argument for an integer default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
83
+ - return_limits=boolean_value
84
+ Optional keyword argument to avoid an exception being raised for values outside the limits.
85
+ When set to True and with either min_value or max_value being exceeded, this limit value is returned as validated value.
86
+
87
+ Returns the validated integer value or with the default or return_limits option used, one of these values instead of an exception raised.
88
+
89
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
90
+
91
+ </br>
92
+
93
+ #### get_validated_float() Method<a id="get_validated_float-method"></a>
94
+ ```py
95
+ get_validated_float(var_name, min_value, max_value, strict, default=float_value, return_limits=boolean_value)
96
+ ```
97
+ Arguments:
98
+ - var_name
99
+ The name of the argument being validated.
100
+ - min_value
101
+ Optional lower limit to validate var_name's value against.
102
+ - max_value
103
+ Optional upper limit to validate var_name's value against.
104
+ - strict
105
+ Optional boolean argument to allow only a float as var_name's value, when set to True. The default is validation in non-strict mode, which allows string representations of a float (e.g. "1.99").
106
+ - default=float_value
107
+ Optional keyword argument for a float default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
108
+ - return_limits=boolean_value
109
+ Optional keyword argument to avoid an exception being raised for values outside the limits.
110
+ When set to True and with either min_value or max_value being exceeded, this limit value is returned as validated value.
111
+
112
+ Returns the validated float value or with the default or return_limits option used, one of these values instead of an exception raised.
113
+
114
+
115
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
116
+
117
+ </br>
118
+
119
+ #### get_validated_str() Method<a id="get_validated_str-method"></a>
120
+ ```py
121
+ get_validated_str(var_name, min_length, strict, default=str_value)
122
+ ```
123
+ - var_name
124
+ The name of the argument being validated.
125
+ - min_length
126
+ The minimum length required for a valid string. By default thi sis set to 1, meaning that empty strings will throw an exception. This can be set to 0 to allow empty strings or to any other length, against which you want to validate.
127
+ - strict
128
+ Optional boolean argument to allow only a string as var_name's value, when set to True. The default is validation in non-strict mode, which allows any value, which can be converted into a string.
129
+ - default=str_value
130
+ Optional keyword argument for a string default value. When set, it avoids an exception being raised in case var_name's value fails validation and this default value is returned instead.
131
+
132
+ Returns the validated string value or with the default option used, this value instead of an exception raised.
133
+
134
+ <div style="text-align: right"><a href="#methods">&#8679; back up to list of methods</a></div>
135
+
136
+ </br>
137
+
138
+ ## License
139
+ MIT license
140
+ Copyright &copy; 2025 by krokoreit
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ width="6.94444in"
4
+ height="6.94444in"
5
+ viewBox="0 0 500 500"
6
+ version="1.1"
7
+ id="svg3"
8
+ sodipodi:docname="krokoreit-01.svg"
9
+ inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
10
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ xmlns:svg="http://www.w3.org/2000/svg">
14
+ <defs
15
+ id="defs7" />
16
+ <sodipodi:namedview
17
+ id="namedview5"
18
+ pagecolor="#ffffff"
19
+ bordercolor="#000000"
20
+ borderopacity="0.25"
21
+ inkscape:showpageshadow="2"
22
+ inkscape:pageopacity="0.0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#d1d1d1"
25
+ inkscape:document-units="in"
26
+ showgrid="false"
27
+ inkscape:zoom="1.2435008"
28
+ inkscape:cx="475.2711"
29
+ inkscape:cy="333.73521"
30
+ inkscape:window-width="1920"
31
+ inkscape:window-height="1009"
32
+ inkscape:window-x="-8"
33
+ inkscape:window-y="-8"
34
+ inkscape:window-maximized="1"
35
+ inkscape:current-layer="svg3" />
36
+ <path
37
+ id="Auswahl"
38
+ fill="#555555"
39
+ stroke="black"
40
+ stroke-width="1"
41
+ d="M 257.00,102.00 C 259.45,91.95 271.60,80.29 281.00,76.48 284.00,75.26 286.00,75.18 289.00,74.50 300.87,71.80 309.07,71.35 317.30,82.30 320.47,86.51 325.24,100.37 327.59,106.17 328.38,108.12 330.49,112.29 328.96,114.11 327.38,116.23 323.05,114.51 321.00,114.11 320.07,107.00 319.32,103.76 317.28,97.00 316.04,92.89 314.98,89.65 312.61,86.00 306.71,76.89 301.65,76.43 292.00,77.87 285.35,78.86 278.95,81.04 273.51,85.17 273.51,85.17 257.00,102.00 257.00,102.00 Z M 268.00,110.00 C 267.72,106.03 270.02,100.88 274.79,103.23 277.38,104.51 278.25,107.47 279.00,110.00 289.18,103.86 303.65,99.18 308.13,114.83 308.73,116.93 308.80,119.14 308.65,121.30 307.89,132.12 303.61,135.06 297.80,143.00 294.05,148.14 293.03,151.43 287.00,154.60 268.49,164.33 261.29,143.64 262.10,129.00 262.45,122.56 262.38,113.91 268.00,110.00 Z M 271.00,118.00 C 272.37,116.15 275.66,112.89 276.05,110.95 276.63,108.08 274.19,106.31 272.14,106.82 268.98,107.61 269.10,114.25 268.50,117.00 266.80,124.86 266.79,135.33 269.55,143.00 271.18,147.54 273.48,151.79 279.00,150.99 290.29,149.36 301.25,131.71 301.91,121.00 302.08,118.14 301.93,113.07 299.47,111.16 298.36,110.31 296.36,109.87 295.00,109.63 287.60,108.37 285.42,111.67 279.70,114.26 279.70,114.26 271.00,118.00 271.00,118.00 Z M 242.00,117.00 C 244.84,121.31 241.73,125.48 240.23,130.00 240.23,130.00 238.51,138.00 238.51,138.00 238.51,138.00 235.00,147.00 235.00,147.00 235.00,147.00 233.75,156.00 233.75,156.00 233.11,159.02 231.94,166.17 228.77,167.23 226.80,167.89 224.92,166.66 220.00,167.75 220.00,167.75 180.00,173.83 180.00,173.83 180.00,173.83 162.00,175.29 162.00,175.29 147.14,177.14 133.09,183.11 119.00,187.80 106.03,192.11 92.37,196.59 80.09,202.64 80.09,202.64 70.00,208.62 70.00,208.62 65.59,210.99 57.84,214.43 54.22,217.60 51.56,219.94 45.39,229.62 43.06,232.91 43.06,232.91 35.95,241.09 35.95,241.09 33.73,244.63 32.85,249.11 31.34,253.00 27.62,262.63 24.72,269.28 24.09,280.00 23.18,295.62 32.28,307.27 45.09,315.05 45.09,315.05 51.91,318.51 51.91,318.51 51.91,318.51 58.32,323.64 58.32,323.64 58.32,323.64 66.00,327.89 66.00,327.89 79.50,335.38 93.06,343.38 108.00,347.79 108.00,347.79 123.00,350.32 123.00,350.32 133.49,352.14 134.20,353.19 146.00,353.39 146.00,353.39 176.01,355.14 176.01,355.14 176.01,355.14 188.00,356.01 188.00,356.01 188.00,356.01 217.00,356.01 217.00,356.01 223.84,355.93 232.73,355.39 239.00,358.00 242.46,354.12 249.32,356.10 254.00,355.75 254.00,355.75 260.00,355.75 260.00,355.75 260.00,355.75 269.00,355.75 269.00,355.75 269.00,355.75 275.00,354.65 275.00,354.65 275.00,354.65 287.01,353.31 287.01,353.31 287.01,353.31 339.58,348.34 339.58,348.34 339.58,348.34 351.58,347.16 351.58,347.16 358.85,346.05 363.34,344.24 367.00,353.00 367.00,353.00 364.00,354.00 364.00,354.00 364.00,354.00 367.86,375.42 367.86,375.42 370.13,383.99 376.76,396.55 381.64,404.00 384.63,408.55 391.10,416.10 395.00,419.99 398.67,423.65 402.69,426.33 405.00,431.00 405.00,431.00 414.27,436.58 414.27,436.58 414.27,436.58 432.00,447.76 432.00,447.76 429.41,448.00 423.50,448.21 421.28,447.76 415.65,445.79 407.52,438.04 402.68,434.54 383.30,420.53 371.06,402.38 362.95,380.00 360.70,373.77 357.00,359.30 358.00,353.00 348.32,350.43 343.17,353.49 334.00,354.22 334.00,354.22 311.42,355.74 311.42,355.74 311.42,355.74 300.00,357.55 300.00,357.55 300.00,357.55 279.00,358.86 279.00,358.86 279.00,358.86 243.08,360.81 243.08,360.81 243.08,360.81 184.00,361.49 184.00,361.49 175.86,361.29 154.94,359.53 148.00,357.00 145.65,359.40 143.17,358.23 140.00,358.01 132.74,357.55 130.50,356.18 123.00,358.01 123.00,358.01 117.00,357.00 117.00,357.00 112.86,353.12 96.92,347.82 91.00,345.28 91.00,345.28 64.00,331.24 64.00,331.24 64.00,331.24 57.04,327.88 57.04,327.88 57.04,327.88 49.91,322.59 49.91,322.59 49.91,322.59 44.00,319.62 44.00,319.62 32.59,312.76 21.18,302.21 21.00,288.00 21.00,288.00 21.00,279.00 21.00,279.00 21.16,265.26 23.67,262.00 28.24,250.00 29.63,246.35 30.01,242.80 32.18,239.29 32.18,239.29 39.72,229.96 39.72,229.96 41.72,226.98 48.43,216.70 50.63,214.72 50.63,214.72 65.00,207.00 65.00,207.00 82.80,196.88 98.69,190.94 118.00,184.49 118.00,184.49 156.91,171.57 156.91,171.57 156.91,171.57 176.00,169.83 176.00,169.83 176.00,169.83 205.00,165.21 205.00,165.21 208.84,164.35 219.96,161.69 222.89,159.87 226.82,157.42 228.12,151.23 229.68,147.00 229.68,147.00 236.20,131.00 236.20,131.00 238.67,124.40 237.20,124.02 242.00,117.00 Z M 321.00,121.00 C 329.85,123.08 337.72,129.78 346.00,134.11 355.04,138.84 365.00,141.65 374.72,144.57 374.72,144.57 387.72,148.92 387.72,148.92 392.66,149.66 395.44,145.21 401.00,143.55 401.00,143.55 409.00,141.96 409.00,141.96 421.96,138.85 417.80,138.84 432.00,139.00 435.96,139.05 441.36,139.43 444.71,141.70 450.68,145.73 452.82,152.28 454.08,159.00 455.15,164.68 456.45,168.05 456.21,174.00 456.40,178.12 456.57,178.76 456.21,183.00 450.36,180.96 452.59,176.38 451.49,171.00 450.20,164.75 445.29,151.21 439.98,147.73 431.43,142.14 420.80,146.04 412.00,148.26 406.03,149.76 404.85,148.93 399.00,152.38 393.36,155.70 390.00,157.30 384.00,159.82 382.42,160.48 380.07,161.81 378.32,161.26 377.54,161.01 376.98,160.48 376.74,159.69 375.60,155.84 381.40,153.29 384.00,152.00 375.42,148.39 378.29,150.12 371.00,148.30 371.00,148.30 363.00,145.70 363.00,145.70 363.00,145.70 354.00,143.64 354.00,143.64 348.61,141.84 343.98,138.79 339.00,136.17 332.16,132.57 324.81,127.99 321.00,121.00 Z M 408.00,165.00 C 412.88,158.13 422.45,156.07 428.79,162.22 435.01,168.26 441.77,185.30 439.87,194.00 436.96,207.33 428.62,210.01 417.00,212.37 417.00,212.37 410.00,213.90 410.00,213.90 395.75,215.15 385.23,206.80 386.09,192.00 386.56,183.99 391.87,165.21 401.00,163.66 403.64,163.21 405.60,164.12 408.00,165.00 Z M 402.00,169.00 C 399.20,170.33 397.40,171.33 395.59,174.02 393.60,177.00 393.81,180.11 393.08,183.42 391.53,190.47 388.66,197.52 394.28,203.90 400.06,210.46 405.52,208.92 413.00,208.17 417.26,207.74 419.80,208.14 424.00,206.25 438.40,199.78 435.90,186.88 430.70,175.00 428.63,170.26 424.73,163.52 419.00,162.90 416.08,162.58 412.59,164.73 410.00,166.00 411.72,175.31 408.89,175.02 401.00,173.00 401.00,173.00 402.00,169.00 402.00,169.00 Z M 500.00,253.00 C 489.18,246.13 472.39,226.74 464.91,216.00 462.94,213.18 453.47,204.68 458.58,201.08 462.34,198.44 469.31,209.58 470.93,212.00 474.05,216.69 485.03,229.63 489.09,234.00 499.41,245.09 499.99,241.58 500.00,253.00 Z M 137.00,314.00 C 136.09,316.50 135.60,318.13 132.89,319.26 130.47,320.26 112.34,317.90 109.00,317.10 89.35,312.40 66.46,301.11 52.00,287.01 49.38,284.45 41.44,276.94 40.14,273.90 36.95,266.39 40.15,256.95 43.24,250.00 46.93,241.69 53.08,234.78 59.00,228.00 62.15,224.40 64.87,220.66 70.00,220.15 80.08,219.14 85.54,230.54 91.21,237.01 94.11,240.33 98.23,244.12 100.21,248.00 102.16,251.32 102.24,255.57 100.21,258.79 96.99,263.34 93.02,261.92 90.58,262.21 86.35,262.71 85.79,264.63 74.99,263.81 71.46,263.54 60.53,262.96 60.82,257.99 60.94,255.98 62.64,254.41 64.19,253.36 65.58,252.42 67.45,251.68 69.00,251.00 69.00,251.00 66.00,256.81 66.00,256.81 72.08,258.48 81.02,258.56 87.00,256.81 89.29,255.87 92.80,254.36 93.64,251.87 94.63,248.89 91.76,246.00 89.96,244.00 86.22,239.84 77.26,226.96 72.00,226.91 67.14,226.87 62.73,230.48 59.88,234.02 54.45,240.76 44.44,253.93 44.88,263.00 45.09,267.44 50.87,275.38 53.63,279.00 59.04,286.07 70.21,293.52 78.00,297.86 98.11,309.08 113.92,314.00 137.00,314.00 Z M 108.00,284.00 C 99.17,285.86 100.70,275.11 102.85,272.43 104.49,270.39 107.65,269.68 110.00,268.67 110.00,268.67 122.00,263.04 122.00,263.04 134.34,258.36 146.34,262.06 153.64,273.00 157.27,278.45 158.42,281.05 156.78,287.42 156.31,289.24 155.94,291.08 154.48,292.41 152.53,294.17 145.78,294.64 143.00,294.95 143.00,294.95 126.00,297.92 126.00,297.92 122.96,298.72 118.08,300.65 115.02,300.49 111.13,300.28 109.74,297.64 110.36,294.02 110.93,290.70 112.08,290.00 115.00,289.00 114.82,290.80 114.16,293.69 116.35,294.59 117.95,295.25 122.12,293.54 124.00,293.12 124.00,293.12 144.00,288.40 144.00,288.40 146.93,287.42 151.02,285.54 151.16,281.96 151.25,279.59 149.11,276.25 147.70,274.43 142.57,267.78 134.18,264.44 126.00,267.06 122.24,268.26 121.59,269.33 118.72,270.68 111.37,274.11 105.20,273.88 108.00,284.00 Z M 371.00,273.00 C 368.37,276.76 360.07,277.78 355.58,278.75 355.58,278.75 318.00,287.45 318.00,287.45 318.00,287.45 277.00,296.41 277.00,296.41 277.00,296.41 268.00,297.92 268.00,297.92 268.00,297.92 198.00,316.21 198.00,316.21 198.00,316.21 172.83,319.76 172.83,319.76 172.83,319.76 167.00,319.21 167.00,319.21 163.58,319.04 158.97,320.68 156.64,318.26 156.04,317.64 155.72,316.89 155.74,316.03 155.86,312.38 161.58,313.00 164.00,313.00 164.00,313.00 173.00,313.00 173.00,313.00 191.59,312.78 224.88,303.18 244.00,298.65 244.00,298.65 272.00,292.58 272.00,292.58 272.00,292.58 282.00,290.09 282.00,290.09 282.00,290.09 316.00,284.11 316.00,284.11 326.60,281.49 361.91,273.20 371.00,273.00 Z M 364.00,353.00 C 364.00,353.00 363.00,353.00 363.00,353.00 363.00,353.00 364.00,354.00 364.00,354.00 364.00,354.00 364.00,353.00 364.00,353.00 Z" />
42
+ </svg>