wwvb 5.0.0__tar.gz → 5.0.2__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.
Files changed (77) hide show
  1. {wwvb-5.0.0 → wwvb-5.0.2}/.github/workflows/codeql.yml +2 -1
  2. {wwvb-5.0.0 → wwvb-5.0.2}/.github/workflows/cron.yml +6 -2
  3. {wwvb-5.0.0 → wwvb-5.0.2}/.github/workflows/release.yml +3 -1
  4. {wwvb-5.0.0 → wwvb-5.0.2}/.github/workflows/test.yml +6 -0
  5. {wwvb-5.0.0 → wwvb-5.0.2}/.pre-commit-config.yaml +3 -3
  6. {wwvb-5.0.0/src/wwvb.egg-info → wwvb-5.0.2}/PKG-INFO +2 -2
  7. {wwvb-5.0.0 → wwvb-5.0.2}/pyproject.toml +1 -1
  8. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/__init__.py +1 -2
  9. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/__version__.py +9 -4
  10. wwvb-5.0.2/src/wwvb/iersdata.json +1 -0
  11. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/iersdata.py +1 -1
  12. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/updateiers.py +2 -2
  13. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/wwvbtk.py +22 -13
  14. {wwvb-5.0.0 → wwvb-5.0.2/src/wwvb.egg-info}/PKG-INFO +2 -2
  15. wwvb-5.0.0/src/wwvb/iersdata.json +0 -1
  16. {wwvb-5.0.0 → wwvb-5.0.2}/.coveragerc +0 -0
  17. {wwvb-5.0.0 → wwvb-5.0.2}/.gitignore +0 -0
  18. {wwvb-5.0.0 → wwvb-5.0.2}/LICENSES/Apache-2.0.txt +0 -0
  19. {wwvb-5.0.0 → wwvb-5.0.2}/LICENSES/CC0-1.0.txt +0 -0
  20. {wwvb-5.0.0 → wwvb-5.0.2}/LICENSES/GPL-3.0-only.txt +0 -0
  21. {wwvb-5.0.0 → wwvb-5.0.2}/LICENSES/Unlicense.txt +0 -0
  22. {wwvb-5.0.0 → wwvb-5.0.2}/Makefile +0 -0
  23. {wwvb-5.0.0 → wwvb-5.0.2}/README.md +0 -0
  24. {wwvb-5.0.0 → wwvb-5.0.2}/adafruit_datetime.pyi +0 -0
  25. {wwvb-5.0.0 → wwvb-5.0.2}/codecov.yml +0 -0
  26. {wwvb-5.0.0 → wwvb-5.0.2}/doc/_static/.empty +0 -0
  27. {wwvb-5.0.0 → wwvb-5.0.2}/doc/conf.py +0 -0
  28. {wwvb-5.0.0 → wwvb-5.0.2}/doc/index.rst +0 -0
  29. {wwvb-5.0.0 → wwvb-5.0.2}/requirements-dev.txt +0 -0
  30. {wwvb-5.0.0 → wwvb-5.0.2}/requirements.txt +0 -0
  31. {wwvb-5.0.0 → wwvb-5.0.2}/setup.cfg +0 -0
  32. {wwvb-5.0.0 → wwvb-5.0.2}/src/uwwvb.py +0 -0
  33. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/decode.py +0 -0
  34. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/dut1table.py +0 -0
  35. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/gen.py +0 -0
  36. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/iersdata.json.license +0 -0
  37. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/py.typed +0 -0
  38. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb/tz.py +0 -0
  39. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb.egg-info/SOURCES.txt +0 -0
  40. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb.egg-info/dependency_links.txt +0 -0
  41. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb.egg-info/entry_points.txt +0 -0
  42. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb.egg-info/requires.txt +0 -0
  43. {wwvb-5.0.0 → wwvb-5.0.2}/src/wwvb.egg-info/top_level.txt +0 -0
  44. {wwvb-5.0.0 → wwvb-5.0.2}/test/testcli.py +0 -0
  45. {wwvb-5.0.0 → wwvb-5.0.2}/test/testdaylight.py +0 -0
  46. {wwvb-5.0.0 → wwvb-5.0.2}/test/testls.py +0 -0
  47. {wwvb-5.0.0 → wwvb-5.0.2}/test/testpm.py +0 -0
  48. {wwvb-5.0.0 → wwvb-5.0.2}/test/testuwwvb.py +0 -0
  49. {wwvb-5.0.0 → wwvb-5.0.2}/test/testwwvb.py +0 -0
  50. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/1998leapsecond +0 -0
  51. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/2012leapsecond +0 -0
  52. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/all-headers +0 -0
  53. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/bar +0 -0
  54. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/both +0 -0
  55. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/cradek +0 -0
  56. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/duration +0 -0
  57. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/enddst-phase +0 -0
  58. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/enddst-phase-2 +0 -0
  59. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/endleapyear +0 -0
  60. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/leapday1 +0 -0
  61. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/leapday28 +0 -0
  62. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/leapday29 +0 -0
  63. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/negleapsecond +0 -0
  64. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/nextdst +0 -0
  65. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/nextst +0 -0
  66. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/nonleapday1 +0 -0
  67. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/nonleapday28 +0 -0
  68. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/phase +0 -0
  69. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/startdst +0 -0
  70. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/startdst-phase +0 -0
  71. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/startdst-phase-2 +0 -0
  72. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/startleapyear +0 -0
  73. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/startst +0 -0
  74. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/y2k +0 -0
  75. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/y2k-1 +0 -0
  76. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/y2k1 +0 -0
  77. {wwvb-5.0.0 → wwvb-5.0.2}/test/wwvbgen_testcases/y2k1-1 +0 -0
@@ -29,7 +29,8 @@ jobs:
29
29
  steps:
30
30
  - name: Checkout
31
31
  uses: actions/checkout@v4
32
-
32
+ with:
33
+ persist-credentials: false
33
34
  - name: Install Dependencies (python)
34
35
  run: pip3 install -r requirements-dev.txt
35
36
 
@@ -11,7 +11,7 @@ on:
11
11
 
12
12
  jobs:
13
13
  update-dut1:
14
- runs-on: ubuntu-20.04
14
+ runs-on: ubuntu-24.04
15
15
  if: startswith(github.repository, 'jepler/')
16
16
  steps:
17
17
 
@@ -21,6 +21,8 @@ jobs:
21
21
  run: echo "$GITHUB_CONTEXT"
22
22
 
23
23
  - uses: actions/checkout@v4
24
+ with:
25
+ persist-credentials: false
24
26
 
25
27
  - name: Set up Python 3.10
26
28
  uses: actions/setup-python@v5
@@ -37,8 +39,10 @@ jobs:
37
39
  run: python -munittest
38
40
 
39
41
  - name: Commit updates
42
+ env:
43
+ REPO: ${{ github.repository }}
40
44
  run: |
41
45
  git config user.name "${GITHUB_ACTOR} (github actions cron)"
42
46
  git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
43
- git remote set-url --push origin https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
47
+ git remote set-url --push origin "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/$REPO"
44
48
  if git commit -m"update iersdata" src/wwvb/iersdata.json; then git push origin HEAD:main; fi
@@ -11,7 +11,7 @@ on:
11
11
  jobs:
12
12
  release:
13
13
 
14
- runs-on: ubuntu-20.04
14
+ runs-on: ubuntu-24.04
15
15
  steps:
16
16
  - name: Dump GitHub context
17
17
  env:
@@ -19,6 +19,8 @@ jobs:
19
19
  run: echo "$GITHUB_CONTEXT"
20
20
 
21
21
  - uses: actions/checkout@v4
22
+ with:
23
+ persist-credentials: false
22
24
 
23
25
  - name: Set up Python
24
26
  uses: actions/setup-python@v5
@@ -22,6 +22,8 @@ jobs:
22
22
  python-version: '3.12'
23
23
 
24
24
  - uses: actions/checkout@v4
25
+ with:
26
+ persist-credentials: false
25
27
 
26
28
  - name: Install deps
27
29
  run: python -mpip install -r requirements-dev.txt
@@ -52,6 +54,8 @@ jobs:
52
54
  runs-on: ${{ matrix.os-version }}
53
55
  steps:
54
56
  - uses: actions/checkout@v4
57
+ with:
58
+ persist-credentials: false
55
59
 
56
60
  - name: Set up Python
57
61
  uses: actions/setup-python@v5
@@ -84,6 +88,8 @@ jobs:
84
88
  runs-on: ubuntu-latest
85
89
  steps:
86
90
  - uses: actions/checkout@v4
91
+ with:
92
+ persist-credentials: false
87
93
 
88
94
  - name: Set up Python
89
95
  uses: actions/setup-python@v5
@@ -12,16 +12,16 @@ repos:
12
12
  hooks:
13
13
  - id: check-yaml
14
14
  - id: end-of-file-fixer
15
- exclude: tests
15
+ exclude: src/wwvb/iersdata.json
16
16
  - id: trailing-whitespace
17
17
  exclude: test/wwvbgen_testcases
18
18
  - repo: https://github.com/fsfe/reuse-tool
19
- rev: v4.0.3
19
+ rev: v5.0.2
20
20
  hooks:
21
21
  - id: reuse
22
22
  - repo: https://github.com/astral-sh/ruff-pre-commit
23
23
  # Ruff version.
24
- rev: v0.6.9
24
+ rev: v0.11.5
25
25
  hooks:
26
26
  # Run the linter.
27
27
  - id: ruff
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: wwvb
3
- Version: 5.0.0
3
+ Version: 5.0.2
4
4
  Summary: Generate WWVB timecodes for any desired time
5
5
  Author-email: Jeff Epler <jepler@gmail.com>
6
6
  Project-URL: Source, https://github.com/jepler/wwvbpy
@@ -19,7 +19,7 @@ dependencies = {file = "requirements.txt"}
19
19
  write_to = "src/wwvb/__version__.py"
20
20
  [tool.ruff.lint]
21
21
  select = ["E", "F", "D", "I", "N", "UP", "YTT", "BLE", "B", "FBT", "A", "COM", "C4", "DTZ", "FA", "ISC", "ICN", "PIE", "PYI", "Q", "RET", "SIM", "TID", "TCH", "ARG", "PTH", "C", "R", "W", "FLY", "RUF", "PL"]
22
- ignore = ["D203", "D213", "D400", "D415", "ISC001", "E741", "C901", "PLR0911", "PLR2004", "PLR0913"]
22
+ ignore = ["D203", "D213", "D400", "D415", "ISC001", "E741", "C901", "PLR0911", "PLR2004", "PLR0913", "COM812"]
23
23
  [tool.ruff]
24
24
  line-length = 120
25
25
  [project]
@@ -49,7 +49,6 @@ def _maybe_warn_update(dt: datetime.date, stacklevel: int = 1) -> None:
49
49
  # If the date is less than 300 days after today, there should be (possibly)
50
50
  # prospective available now.
51
51
  today = datetime.datetime.now(tz=datetime.timezone.utc).date()
52
- print(f"_mwu {today=!r} {dt=!r} {iersdata.end=!r}")
53
52
  if _date(dt) < today + datetime.timedelta(days=330):
54
53
  warnings.warn(
55
54
  "Note: Running `updateiers` may provide better DUT1 and LS information",
@@ -727,7 +726,7 @@ class WWVBMinuteIERS(WWVBMinute):
727
726
  @classmethod
728
727
  def _get_dut1_info(cls, year: int, days: int, old_time: WWVBMinute | None = None) -> tuple[int, bool]: # noqa: ARG003
729
728
  d = datetime.datetime(year, 1, 1, tzinfo=datetime.timezone.utc) + datetime.timedelta(days - 1)
730
- return int(round(get_dut1(d) * 10)) * 100, isls(d)
729
+ return round(get_dut1(d) * 10) * 100, isls(d)
731
730
 
732
731
 
733
732
  def _bcd_bits(n: int) -> Generator[bool, None, None]:
@@ -1,8 +1,13 @@
1
- # file generated by setuptools_scm
1
+ # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
3
6
  TYPE_CHECKING = False
4
7
  if TYPE_CHECKING:
5
- from typing import Tuple, Union
8
+ from typing import Tuple
9
+ from typing import Union
10
+
6
11
  VERSION_TUPLE = Tuple[Union[int, str], ...]
7
12
  else:
8
13
  VERSION_TUPLE = object
@@ -12,5 +17,5 @@ __version__: str
12
17
  __version_tuple__: VERSION_TUPLE
13
18
  version_tuple: VERSION_TUPLE
14
19
 
15
- __version__ = version = '5.0.0'
16
- __version_tuple__ = version_tuple = (5, 0, 0)
20
+ __version__ = version = '5.0.2'
21
+ __version_tuple__ = version_tuple = (5, 0, 2)
@@ -0,0 +1 @@
1
+ {"START": "1972-01-01", "OFFSETS_GZ": "H4sIAP8L7WcC/+2aa3LDMAiEL5uHLTuxnN5/pn/aTmfSSiAWhGy+E2SWZQE58zwiH/1YivB/96vMXiIX2Io8CTyIrDSWGqlMRdrpDa6aJFnr0m4wYZkCE2UmSF0V+13vBveStK6JTfQyW3O86HLJf0RvDgy5u4FCI+WVKTsVoUdHzsrRoWRfYHIItZ5EEgu0Beu58EgEpMpO9zf4/s3iNO4y7/hqEwOZIPu3+PuO2T7Ic5E8GxsnZHvUYOtELxW1WP+0yx/caFxpyAooq6lq06UEr+UkLeXOIDPZ6EBrqb5K8Tvu6/B9CdnZqFQL05s2KauWy/IeF/tJGAisjK9MgGyDuUkRq4G1gRE+VjA30uZNPsdantkgMq58QO4fw+sqzj+A2/16mmvnyy9UzDvMktDgKYlnkFeB2rx+wNANG40aA4OgsY03AWoDCVs/XMmkyQ0+0jWaUqPdwA0m/MRuccGjCwirHToWzbcs8P7U1nZZLSYdHapWu5HqVg1YjK2fPEwvPZPzLPUF848tyid2u7dh8B7h+wVQ923Q+kqxZe3JclSSB+YTM3nnHrjgFth/vzgZzw6cbOMYa4bHFPU/DR3mp/ubKM4cgwMnHZW4GFxFprOVcevAKGva6oExn1MOmyGDJQPm0rpU8bjqdOo993O6Xz9ofToZela5vwrWoTn4l4o5CIIaKejCEgSnJv784VGlgfgEoGIm4WpNAAA="}
@@ -13,7 +13,7 @@ import json
13
13
 
14
14
  import platformdirs
15
15
 
16
- __all__ = ["DUT1_DATA_START", "DUT1_OFFSETS", "start", "span", "end"]
16
+ __all__ = ["DUT1_DATA_START", "DUT1_OFFSETS", "end", "span", "start"]
17
17
 
18
18
  content: dict[str, str] = {"START": "1970-01-01", "OFFSETS_GZ": "H4sIAFNx1mYC/wMAAAAAAAAAAAA="}
19
19
 
@@ -52,7 +52,7 @@ def update_iersdata( # noqa: PLR0915
52
52
  offs_str = r["UT1-UTC"]
53
53
  if not offs_str:
54
54
  break
55
- offs = int(round(float(offs_str) * 10))
55
+ offs = round(float(offs_str) * 10)
56
56
  if not offsets:
57
57
  table_start = datetime.date(1858, 11, 17) + datetime.timedelta(jd)
58
58
 
@@ -98,7 +98,7 @@ def update_iersdata( # noqa: PLR0915
98
98
  cells = row.findAll("td")
99
99
  when = datetime.datetime.strptime(cells[0].text + "+0000", "%Y-%m-%d%z").date()
100
100
  dut1 = cells[2].text.replace("s", "").replace(" ", "")
101
- dut1 = int(round(float(dut1) * 10))
101
+ dut1 = round(float(dut1) * 10)
102
102
  if wwvb_dut1 is not None:
103
103
  assert wwvb_start is not None
104
104
  patch(wwvb_start, when, wwvb_dut1)
@@ -7,7 +7,6 @@
7
7
  from __future__ import annotations
8
8
 
9
9
  import functools
10
- import threading
11
10
  import time
12
11
  from tkinter import Canvas, TclError, Tk
13
12
  from typing import TYPE_CHECKING, Any
@@ -31,7 +30,7 @@ def validate_colors(ctx: Any, param: Any, value: str) -> list[str]: # noqa: ARG
31
30
  app = _app()
32
31
  colors = value.split()
33
32
  if len(colors) not in (2, 3, 4, 6):
34
- raise click.BadParameter(f"Give 2, 3, 4 or 6 colors (not {len(colors)}")
33
+ raise click.BadParameter(f"Give 2, 3, 4 or 6 colors (not {len(colors)})")
35
34
  for c in colors:
36
35
  try:
37
36
  app.winfo_rgb(c)
@@ -53,7 +52,13 @@ DEFAULT_COLORS = "#3c3c3c #3c3c3c #3c3c3c #cc3c3c #88883c #3ccc3c"
53
52
 
54
53
 
55
54
  @click.command
56
- @click.option("--colors", callback=validate_colors, default=DEFAULT_COLORS)
55
+ @click.option(
56
+ "--colors",
57
+ callback=validate_colors,
58
+ default=DEFAULT_COLORS,
59
+ metavar="COLORS",
60
+ help="2, 3, 4, or 6 Tk color values",
61
+ )
57
62
  @click.option("--size", default=48)
58
63
  @click.option("--min-size", default=None)
59
64
  def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: PLR0915
@@ -61,11 +66,10 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
61
66
  if min_size is None:
62
67
  min_size = size
63
68
 
64
- def sleep_deadline(deadline: float) -> None:
65
- """Sleep until a deadline"""
69
+ def deadline_ms(deadline: float) -> int:
70
+ """Compute the number of ms until a deadline"""
66
71
  now = time.time()
67
- if deadline > now:
68
- time.sleep(deadline - now)
72
+ return int(max(0, deadline - now) * 1000)
69
73
 
70
74
  def wwvbtick() -> Generator[tuple[float, wwvb.AmplitudeModulation], None, None]:
71
75
  """Yield consecutive values of the WWVB amplitude signal, going from minute to minute"""
@@ -127,18 +131,23 @@ def main(colors: list[str], size: int, min_size: int | None) -> None: # noqa: P
127
131
  """Turn the canvas's virtual LED off"""
128
132
  canvas.itemconfigure(circle, fill=colors[i])
129
133
 
130
- def thread_func() -> None:
131
- """Update the canvas virtual LED"""
134
+ def controller_func() -> Generator[int]:
135
+ """Update the canvas virtual LED, yielding the number of ms until the next change"""
132
136
  for stamp, code in wwvbsmarttick():
133
- sleep_deadline(stamp)
137
+ yield deadline_ms(stamp)
134
138
  led_on(code)
135
139
  app.update()
136
- sleep_deadline(stamp + 0.2 + 0.3 * int(code))
140
+ yield deadline_ms(stamp + 0.2 + 0.3 * int(code))
137
141
  led_off(code)
138
142
  app.update()
139
143
 
140
- thread = threading.Thread(target=thread_func, daemon=True)
141
- thread.start()
144
+ controller = controller_func().__next__
145
+
146
+ def after_func() -> None:
147
+ """Repeatedly run the controller after the desired interval"""
148
+ app.after(controller(), after_func)
149
+
150
+ app.after_idle(after_func)
142
151
  app.mainloop()
143
152
 
144
153
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: wwvb
3
- Version: 5.0.0
3
+ Version: 5.0.2
4
4
  Summary: Generate WWVB timecodes for any desired time
5
5
  Author-email: Jeff Epler <jepler@gmail.com>
6
6
  Project-URL: Source, https://github.com/jepler/wwvbpy
@@ -1 +0,0 @@
1
- {"START": "1972-01-01", "OFFSETS_GZ": "H4sIAFEb/WYC/+2aa3LDMAiEL5uHLDuxnN5/pn/aTmfSSiAWhGR9J8gsywJylqVHPtqxZuH/7leeI0fKsGd5EngQ2WisJWKegrThDa6aJFnL0u4wYZkCE2UmSF0U+13vCveStC6JTfQyW3O86HLJf0SvDgy5u4FCI+WVKRuy0KMjJeXoULIvMDmEWgeRxAJtwXquPCIBqbLh/gbfv0mcxk3mHV9tYiATZP8W/zgw2wd5LpJnY+WErI8abJ3opaIW6592+YMbjSsNWQFlNVVtuhjhtQzSUh4MEpOdDrSW6qsUv+O+Dt+XkIONSrUwvWmTsmq5LO9xsZ+EgcDK+MIESDaYmxSxGlgbGOFjBXMjbV7lc6zlmQ0i48oH5P4+vK7i/AHc7tfTXDtffqFi3m6WhApPSTyDvArU5vUDhm7YaNQYGASVbbwLUBtI2PrhSiZNbvCRrtGUGu0GbjDhJ3aLCx5dQFjt0LFovmWB96e6tktqMenoULXajVS3asBibP3kYXrpmZxnsS2Yf2xRPrHbvQ2D9wjfL4C6b4PWV4otW0vWUYkeWE5M8M594oLbxP77xcl4NuBkG0dfM3xOUf/T0GF+ur+J5pljcODEUZkXg6vIdLYy7g3oZU3bPNDnc8qwGdJZMmAurUsRj6tOo95zP6fb9YPWp5OuZ5X7q2DrmsG/VCyTyaREnDRhnUxOjcmKM9b/R7R0+gQ5cs/LtEwAAA=="}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes