修改关于界面

This commit is contained in:
2025-06-29 02:27:12 +08:00
parent 06f39aa01b
commit ce9d0b64f2
7 changed files with 799 additions and 48 deletions

352
images/3rd/matplotlib.svg Normal file
View File

@@ -0,0 +1,352 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="167.76pt" height="167.76pt" viewBox="0 0 167.76 167.76" xmlns="http://www.w3.org/2000/svg" version="1.1">
<metadata>
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<cc:Work>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:date>2022-09-27T22:26:51.030457</dc:date>
<dc:format>image/svg+xml</dc:format>
<dc:creator>
<cc:Agent>
<dc:title>Matplotlib v3.6.0, https://matplotlib.org/</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
<defs>
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 167.76
L 167.76 167.76
L 167.76 0
L 0 0
L 0 167.76
z
" style="fill: none; opacity: 0"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 167.808464 83.88
C 167.808464 94.901385 165.637491 105.815601 161.41979 115.998033
C 157.202089 126.180465 151.019682 135.43309 143.226386 143.226386
C 135.43309 151.019682 126.180465 157.202089 115.998033 161.41979
C 105.815601 165.637491 94.901385 167.808464 83.88 167.808464
C 72.858615 167.808464 61.944399 165.637491 51.761967 161.41979
C 41.579535 157.202089 32.32691 151.019682 24.533614 143.226386
C 16.740318 135.43309 10.557911 126.180465 6.34021 115.998033
C 2.122509 105.815601 -0.048464 94.901385 -0.048464 83.88
C -0.048464 72.858615 2.122509 61.944399 6.34021 51.761967
C 10.557911 41.579535 16.740318 32.32691 24.533614 24.533614
C 32.32691 16.740318 41.579535 10.557911 51.761967 6.34021
C 61.944399 2.122509 72.858615 -0.048464 83.88 -0.048464
C 94.901385 -0.048464 105.815601 2.122509 115.998033 6.34021
C 126.180465 10.557911 135.43309 16.740318 143.226386 24.533614
C 151.019682 32.32691 157.202089 41.579535 161.41979 51.761967
C 165.637491 61.944399 167.808464 72.858615 167.808464 83.88
z
" style="fill: #ffffff; fill-opacity: 0.9"/>
</g>
<g id="matplotlib.axis_1">
<g id="xtick_1">
<g id="line2d_1">
<path d="M 83.88 83.88
L 162.7272 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_2">
<path d="M 83.88 83.88
L 139.63339 28.12661
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_3">
<path d="M 83.88 83.88
L 83.88 5.0328
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_4">
<path d="M 83.88 83.88
L 28.12661 28.12661
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_5">
<path d="M 83.88 83.88
L 5.0328 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_6">
<path d="M 83.88 83.88
L 28.12661 139.63339
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_7">
<g id="line2d_7">
<path d="M 83.88 83.88
L 83.88 162.7272
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_8">
<path d="M 83.88 83.88
L 139.63339 139.63339
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
</g>
<g id="matplotlib.axis_2">
<g id="ytick_1">
<g id="line2d_9">
<path d="M 92.6408 83.88
C 92.6408 82.729542 92.414185 81.590271 91.973924 80.527387
C 91.533663 79.464503 90.888318 78.498675 90.074821 77.685179
C 89.261325 76.871682 88.295497 76.226337 87.232613 75.786076
C 86.169729 75.345815 85.030458 75.1192 83.88 75.1192
C 82.729542 75.1192 81.590271 75.345815 80.527387 75.786076
C 79.464503 76.226337 78.498675 76.871682 77.685179 77.685179
C 76.871682 78.498675 76.226337 79.464503 75.786076 80.527387
C 75.345815 81.590271 75.1192 82.729542 75.1192 83.88
C 75.1192 85.030458 75.345815 86.169729 75.786076 87.232613
C 76.226337 88.295497 76.871682 89.261325 77.685179 90.074821
C 78.498675 90.888318 79.464503 91.533663 80.527387 91.973924
C 81.590271 92.414185 82.729542 92.6408 83.88 92.6408
C 85.030458 92.6408 86.169729 92.414185 87.232613 91.973924
C 88.295497 91.533663 89.261325 90.888318 90.074821 90.074821
C 90.888318 89.261325 91.533663 88.295497 91.973924 87.232613
C 92.414185 86.169729 92.6408 85.030458 92.6408 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="ytick_2">
<g id="line2d_10">
<path d="M 110.1624 83.88
C 110.1624 80.428627 109.482555 77.010814 108.161771 73.822161
C 106.840988 70.633508 104.904953 67.736026 102.464463 65.295537
C 100.023974 62.855047 97.126492 60.919012 93.937839 59.598229
C 90.749186 58.277445 87.331373 57.5976 83.88 57.5976
C 80.428627 57.5976 77.010814 58.277445 73.822161 59.598229
C 70.633508 60.919012 67.736026 62.855047 65.295537 65.295537
C 62.855047 67.736026 60.919012 70.633508 59.598229 73.822161
C 58.277445 77.010814 57.5976 80.428627 57.5976 83.88
C 57.5976 87.331373 58.277445 90.749186 59.598229 93.937839
C 60.919012 97.126492 62.855047 100.023974 65.295537 102.464463
C 67.736026 104.904953 70.633508 106.840988 73.822161 108.161771
C 77.010814 109.482555 80.428627 110.1624 83.88 110.1624
C 87.331373 110.1624 90.749186 109.482555 93.937839 108.161771
C 97.126492 106.840988 100.023974 104.904953 102.464463 102.464463
C 104.904953 100.023974 106.840988 97.126492 108.161771 93.937839
C 109.482555 90.749186 110.1624 87.331373 110.1624 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="ytick_3">
<g id="line2d_11">
<path d="M 127.684 83.88
C 127.684 78.127711 126.550925 72.431357 124.349619 67.116935
C 122.148314 61.802513 118.921588 56.973377 114.854105 52.905895
C 110.786623 48.838412 105.957487 45.611686 100.643065 43.410381
C 95.328643 41.209075 89.632289 40.076 83.88 40.076
C 78.127711 40.076 72.431357 41.209075 67.116935 43.410381
C 61.802513 45.611686 56.973377 48.838412 52.905895 52.905895
C 48.838412 56.973377 45.611686 61.802513 43.410381 67.116935
C 41.209075 72.431357 40.076 78.127711 40.076 83.88
C 40.076 89.632289 41.209075 95.328643 43.410381 100.643065
C 45.611686 105.957487 48.838412 110.786623 52.905895 114.854105
C 56.973377 118.921588 61.802513 122.148314 67.116935 124.349619
C 72.431357 126.550925 78.127711 127.684 83.88 127.684
C 89.632289 127.684 95.328643 126.550925 100.643065 124.349619
C 105.957487 122.148314 110.786623 118.921588 114.854105 114.854105
C 118.921588 110.786623 122.148314 105.957487 124.349619 100.643065
C 126.550925 95.328643 127.684 89.632289 127.684 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
<g id="ytick_4">
<g id="line2d_12">
<path d="M 145.2056 83.88
C 145.2056 75.826796 143.619294 67.851899 140.537467 60.411709
C 137.455639 52.971519 132.938223 46.210728 127.243748 40.516252
C 121.549272 34.821777 114.788481 30.304361 107.348291 27.222533
C 99.908101 24.140706 91.933204 22.5544 83.88 22.5544
C 75.826796 22.5544 67.851899 24.140706 60.411709 27.222533
C 52.971519 30.304361 46.210728 34.821777 40.516252 40.516252
C 34.821777 46.210728 30.304361 52.971519 27.222533 60.411709
C 24.140706 67.851899 22.5544 75.826796 22.5544 83.88
C 22.5544 91.933204 24.140706 99.908101 27.222533 107.348291
C 30.304361 114.788481 34.821777 121.549272 40.516252 127.243748
C 46.210728 132.938223 52.971519 137.455639 60.411709 140.537467
C 67.851899 143.619294 75.826796 145.2056 83.88 145.2056
C 91.933204 145.2056 99.908101 143.619294 107.348291 140.537467
C 114.788481 137.455639 121.549272 132.938223 127.243748 127.243748
C 132.938223 121.549272 137.455639 114.788481 140.537467 107.348291
C 143.619294 99.908101 145.2056 91.933204 145.2056 83.88
" clip-path="url(#pccb0f66489)" style="fill: none; stroke: #e6e6e6; stroke-linecap: square"/>
</g>
</g>
</g>
<g id="patch_3">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 100.544032 78.465528
C 100.827679 79.338503 101.042289 80.232419 101.18588 81.139018
C 101.329471 82.045617 101.4016 82.9621 101.4016 83.88
z
" clip-path="url(#pccb0f66489)" style="fill: #004cff; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_4">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 102.349947 34.667001
C 104.928058 35.634582 107.426154 36.803257 109.821161 38.162231
C 112.216167 39.521205 114.500687 41.06628 116.653617 42.783184
z
" clip-path="url(#pccb0f66489)" style="fill: #ceff29; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_5">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 38.963335 30.078544
C 43.193773 26.546722 47.826049 23.526156 52.764087 21.079495
C 57.702125 18.632834 62.911548 16.77711 68.284309 15.550812
z
" clip-path="url(#pccb0f66489)" style="fill: #ff6800; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_6">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 23.539928 94.830109
C 22.390882 88.498347 22.245596 82.025002 23.109411 75.648064
C 23.973226 69.271127 25.835425 63.069714 28.627544 57.271819
z
" clip-path="url(#pccb0f66489)" style="fill: #ffc400; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_7">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 55.074417 103.836559
C 54.551888 103.082334 54.059183 102.307877 53.597441 101.51498
C 53.135699 100.722082 52.705276 99.911356 52.307168 99.084675
z
" clip-path="url(#pccb0f66489)" style="fill: #29ffce; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_8">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 91.217443 127.065094
C 88.388717 127.545714 85.519599 127.747241 82.651462 127.666769
C 79.783325 127.586296 76.93002 127.224214 74.132693 126.585742
z
" clip-path="url(#pccb0f66489)" style="fill: #7dff7a; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_9">
<path d="M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
L 139.162587 126.960611
C 137.470326 129.132181 135.651582 131.202154 133.71581 133.159767
C 131.780039 135.117381 129.730602 136.959235 127.578156 138.675754
z
" clip-path="url(#pccb0f66489)" style="fill: #ff6800; fill-opacity: 0.6; stroke: #4c4c4c; stroke-width: 1.5; stroke-linejoin: miter"/>
</g>
<g id="patch_10">
<path d="M 162.7272 83.88
C 162.7272 73.525881 160.687664 63.272442 156.725314 53.706483
C 152.762964 44.140524 146.954858 35.448078 139.63339 28.12661
C 132.311922 20.805142 123.619476 14.997036 114.053517 11.034686
C 104.487558 7.072336 94.234119 5.0328 83.88 5.0328
C 73.525881 5.0328 63.272442 7.072336 53.706483 11.034686
C 44.140524 14.997036 35.448078 20.805142 28.12661 28.12661
C 20.805142 35.448078 14.997036 44.140524 11.034686 53.706483
C 7.072336 63.272442 5.0328 73.525881 5.0328 83.88
C 5.0328 94.234119 7.072336 104.487558 11.034686 114.053517
C 14.997036 123.619476 20.805142 132.311922 28.12661 139.63339
C 35.448078 146.954858 44.140524 152.762964 53.706483 156.725314
C 63.272442 160.687664 73.525881 162.7272 83.88 162.7272
C 94.234119 162.7272 104.487558 160.687664 114.053517 156.725314
C 123.619476 152.762964 132.311922 146.954858 139.63339 139.63339
C 146.954858 132.311922 152.762964 123.619476 156.725314 114.053517
C 160.687664 104.487558 162.7272 94.234119 162.7272 83.88
" style="fill: none; stroke: #11557c; stroke-width: 4; stroke-linejoin: miter; stroke-linecap: square"/>
</g>
</g>
</g>
<defs>
<clipPath id="pccb0f66489">
<path d="M 162.7272 83.88
C 162.7272 73.525881 160.687664 63.272442 156.725314 53.706483
C 152.762964 44.140524 146.954858 35.448078 139.63339 28.12661
C 132.311922 20.805142 123.619476 14.997036 114.053517 11.034686
C 104.487558 7.072336 94.234119 5.0328 83.88 5.0328
C 73.525881 5.0328 63.272442 7.072336 53.706483 11.034686
C 44.140524 14.997036 35.448078 20.805142 28.12661 28.12661
C 20.805142 35.448078 14.997036 44.140524 11.034686 53.706483
C 7.072336 63.272442 5.0328 73.525881 5.0328 83.88
C 5.0328 94.234119 7.072336 104.487558 11.034686 114.053517
C 14.997036 123.619476 20.805142 132.311922 28.12661 139.63339
C 35.448078 146.954858 44.140524 152.762964 53.706483 156.725314
C 63.272442 160.687664 73.525881 162.7272 83.88 162.7272
C 94.234119 162.7272 104.487558 160.687664 114.053517 156.725314
C 123.619476 152.762964 132.311922 146.954858 139.63339 139.63339
C 146.954858 132.311922 152.762964 123.619476 156.725314 114.053517
C 160.687664 104.487558 162.7272 94.234119 162.7272 83.88
M 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
C 83.88 83.88 83.88 83.88 83.88 83.88
M 162.7272 83.88
z
"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

BIN
images/3rd/packaging.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

8
module/about/schema.py Normal file
View File

@@ -0,0 +1,8 @@
class ThirdParty:
def __init__(self, name: str, url: str, qrc: str = None):
self.name = name
self.url = url
self.qrc = qrc
def __repr__(self):
return f"ThirdParty(name={self.name}, url={self.url})"

View File

@@ -1,6 +1,6 @@
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.9.0
# Created by: The Resource Compiler for Qt version 6.9.1
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
@@ -14171,6 +14171,299 @@ My\xe1#i:\x00\x00\xe8)7|$M'\x00\
\x03\x00<Nu\xe1#i:\x04\x00LSm\xf8H\
\x9aN\x01\x00u\x84O\xea\xff\xec\x05\xdb\xe7\x85I\xd4\
p\x00\x00\x00\x00IEND\xaeB`\x82\
\x00\x00\x0dP\
\x00\
\x00;cx\xda\xed[mo\x1b\xc7\x11\xfe\xee_q\
\xa5\xbf\xf4M\xc7}\x7fQd\x07\x8d\x9c\x06\x01\x926\
h\xd2\x06\xfdT0$%\xb3\xa6H\x85\xa4m\xb9E\
\xff{\x9f\xd9\xbb\xdb\x99\x93\xe8\xc4.\x0aYEm\x03\
6o\xb8;;\xcf\xcc\xec\xbc\xec-\xcf>\xbd\xb9Z\
7\xaf\x96\xbb\xfdj\xbby2\xd1\xad\x9a4\xcb\xcd|\
\xbbXm.\x9fL^\x1e.N\xd2\xa4\xd9\x1ff\x9b\
\xc5l\xbd\xdd,\x9fL6\xdb\xc9\xa7O\x1f\x9d\xfd\xe2\
\xd9\x1f\xcf\xbf\xfb\xeb7\x9f7\xfbW\x97\xcd7\x7f\xfe\
\xec\xab/\xcf\x9b\xc9\xc9t\xfa\xbd=\x9fN\x9f}\xf7\
\xac\xf9\xf6/_4\xba\xd5\xd3\xe9\xe7\x7f\x98<j\x9a\
\xc9\xf3\xc3\xe1\xfat:}\xfd\xfau\xfb\xda\xb6\xdb\xdd\
\xe5\xf4\x8b\xdd\xec\xfa\xf9j\xbe\x9fb\xe8\x94\x86b\xda\
\x14\xec\xb4n\x17\x87\xc5\x04\x8b\x10o\x88\xb7\xd9\x9f\xde\
\xacW\x9b\x17O\x8e0\xd19\xe7i\xf9v\xd2\xbc^\
-\x0e\xcf\x81!\xc46\x86\xeb\xc3\xa4y\xbe\x5c]>\
?H\xca\xab\xd5\xf2\xf5g\xdb\x9b'\x13\xd5\xa8\xa6#\
\xf7\xffM\xba\x95\x8e\xada\x94R$\xd8D\xeaIC\
\xc0\xe6\xecjy\x98-f\x87\x19>7g\xbb\xc5\xc5\
\xe9\x9f\x9e\xfd\xbe\x17y1\xaf\xbc\xae_\xee\xd6\x85\xd3\
b>]\xae\x97W\xcb\xcda_\x10\xf7\x8b\x9e\xcey\
\xec|\xb7\x9c\x1dV\xaf\x96\xf3\xed\xd5\xd5v\xb3/\xd3\
6\xfb\xc7\xc3H\xac\xf1V5(35\xe6\x04#N\
\xf6o6\x87\xd9\xcd\x09\xcd#\xc9\x9a\xb3\xf9\xfc\xf4\xfb\
\xed\xeeEyh\xce\x16\xf3\xd3\xc3\x9b\xebeC\x02\xef\
\x96\xfb\xed\xcb\xdd|yT\xd8\xc5\xfcjE#\xa7\xdf\
\x1eV\xeb\xf5\x97W\xb3\xcb\xe5d\xcaL\x80|\xf9\xd4\
(,\xaa\xf2\x89\x89\xdf\x19sj\xc2\xa9\x87\x13Y\xe5\
|<\x9b\x0ec\xea\x8c\x8b\xed\xeejvx\xba\x22N\
\xa4\xd2\xdf\x00U\x19\xd6\x7fQ\x07\x165lw\x1d\xa1\
\xc8\xff\xbbK\xa8\xad\x7f\xee \xac\x0e\xeb\xe5\xd3\xafg\
\x87\xeb\xf5\xf6\xb0^\xfd\xd0\xbc\xb2mh\xd5o\x1b\x02\
\xb2\x07\x92\xab\xfaU\xc1S\xd6\xe9&\xf5\x5c\xa7c\xb6\
e\x80\x5c\xb8\x0c\x18\xf4v6\xed\xedKv\x9f\x0a\xc3\
\x9f-\x96\x17\xfb2b\x7fx\xb3^6\xa4\xb0'\x93\
\xc3\xf2\xe60\x9d\xef\xf7\x93\xa7\xbf\xfe\xe7\xfe\xb0\xdb\xbe\
X\x9e\xc0K\x97\x7f\xdf\xae6\xa7\xcdn\xfbr\xb3\xf8\
\xa4\x11\xf4\xf9\xec\xfa\xb4\xf9\xe1\xe5\xe1\xf0\xaf\xb3ia\
SV\xe99\x9f]6\xab\xc5\x93\xc9\xc5\xea\xf2\xe5n\
\xf9\xb7\xe2y\x03\xedzv\x98?\xefI\xcd\x19\x9e\x9e\
7\xa0~\xcd\xde\xfd\xe8\xab\xb1\x9f\x0b\x82\xa2\xcfj\xf8\
o\xf8\xfa\x1f\x8fh\xc3C\x02Zp\xbd>m6\xd8\
\xf7\x9f4\xdb\xeb\xd9\x1c\xbep\xda\xa8\xce\x03\xce\xa6\x97\
B\x8c\xd9\xcdr_\xa5\x90\x92\x99I\xaf[\x16-\xd9\
6\xa5\xfe\xdfG\xe7\xa3\xc7\xb7\xfd\xfbq\xd8\xc7a\xff\
\x9da\x9d\xf3'\x95\x5cp<U\xd0\xb2k\xb3\xd26\
y\x10}\x1bltY7Z\xf96i\x1f\x14>\x06\
\xdd:\x9dcn\xb4\xf6m\xceIY[X\xf8\xd8\x22\
\x14\xaa\x84/LhuR.\x80\x07\x05C\x9dC2\
\x8d\xb6\xbeu\xd6*|\xeflkL\xb0)\xc8\x8f\xc4\
\x83\x87\x88y\x92\x1b\xaf\xc1\x8b\xb3D\xc4BJZ\xe5\
\x97\xa0n\xa1\x17\x04L\x8f\xa6M>\x05=\x1a\x08\xfe\
\xd99\x9b\xb3d\x09\x01c\x80\x84q\xbc\xbe\xd3\xad\x8f\
\xd9\xdb\x91\xb0\xd6\xb4\xd6\x04\xd2#\xc32\xae\xf5\xd6\x06\
\xedn\xeb \xb4\xd1)\xab\x93\xd4\x86j=\xb8j-\
\x95\x11Z\xeb\x94\xd1\xb7\xcc`Zm\x8c/s\xaa\x22\
NT\xab\xdc-\xe32\xad:\x01\x93X\x0b\x95\x1d\xeb\
`X\x97\x15P\xd4>H(\x14P\x91T\xfc\x0c\x9a\
?a6\xeb\xa7N\x11l*k^q\x90\x01sY\
\xb0*+\x8b\x7f\x1b%?c\xe61e\x08\xad\xb1&\
Y\xc1b]\xe9\x96l\x1e6\x19\x9b\x91\xcd;\x02-\
|A\xf8G\xf5\x19\xa9\xc7\xc1\xbf\xc6*g_\x94\x0e\
Z\xbd\xf6\xa8+\xf7\xc6\xbe\x93\xe3\x1e_\x94?\x9f4\
\xf4x\xc2\xb9\xae\xcd}\xbd\xd3\xa7\xbb!\xb9\x89\xd2b\
v\xb3\xaa\xa9o\xf8\xfa\xe6\xb0\x9a\xbf\xa8\xc4\x81Jy\
\xde,\x98\xfc\xd6\xa4HA\xca\xb4\xd1D3P&\xcd\
|\xbd\xba>\xa1\xf1\xa8\xcaw\xeb_>\xbe\x9e\xcf\x7f\
P\x17!\xb8\x94\x7fu4aw\xc5\x05\xa0-\x03\xfd\
\xbd[m\xec\x7f|9\xdb\xd5z\xae\x22\x14\x1f$\x18\
s\x1c\x8cy\x1706\xc3R\xd6\xc2E\x13\x9c*\x04\
\xfd\x10\x00\xd9\xe3\x80\xec;\x00\xea>x\x94\xb9\xe6A\
\xd8\xc6\x1d\x87\xe2\xde\x01J\xb5\xc8C2\x8d?\x8e\xc7\
\xbf\x03\x9e\xde(\x0ff\xdb\x84\xe3P\xc2\xfb\x98\x86\xf7\
\xcf\x03\x00\x14\x8f\x03\x8a\xef\xbcmjh{\x00`\xd2\
q0\xe9\xbd\x82\xda\x076\xcf\xcfd&3\xceLo\
~*3\xe5c\xb8\xb3i\x83S\xa2\xce\xae\x04\xb2c\
\xf6\xce\x10\xc5i\xa7QI$d\xed\xacLD\xc9\x89\
\x9c\x1cm6\xc8\xb9(\x0fL\xb4\xa9dm\x90\xa9\x04\
\x08\xb6\x89\xb9EF\xf6\xca6Y\x81s\xa2Z!\xa6\
\xd6\xe5\x14\xa2'\x9a\x8a.\xa1\xd6\x88\xb1\x0d\xc9\xeb\xae\
\xbcL\xb95A[\xe3\x9b\x18\xda\x145U\x0f)\xb5\
$F\x8eD\xa3J\xc3\xc6&\xa1\x8e\xb04\xb2\x89\xbe\
\x8d)\xa8X\x8a\xcb\x84\x9a%dHMd\xeb<J\
\x9d&\xf9\xee\xb8\x22\x11M\xeb<\xe4\xdc\xe1\x89\xa6U\
\xa4uH\xc5)\x18U\x9c\xa35\x19'\x8b\xc78\x19\
\x06\xe3\x1c!\x16\x03\xe4\xa4\x81\x113\xafk\x8e\xf4-\
\xc4\x93\x22w \xee\xc2\x1al\x5c\x09R9\x03#\xa9\
\xc4a\xcd\xaa\xefN\xe4\xc1\x0c\xd24\x83\xb9\xd8\x84\x15\
'[\x9b\xa6K'\x18\x1c\x83\x9d\xa5:\x10\xe3d_\
#c\xb1\x0b\xb2[JW\x15\xde<<\xd1\xb4\x8a\xb4\
\x0e\xa98\x05\xa3\x8as\xbcf\xc5)\xc4\xab8\x19\x06\
\xe3\x1c!\xe6\x01b\x123\x92\xcc\x87=%\xf5-\xc4\
\x93\x22w \xee\xc2\xfa\xf0\xa9\xf1\xcdOU\x94Z\x1d\
\x8bB\x1aM\x062\x87\xec\xd9+E\xb5\xce\xa4`\xd0\
\x89*\xb8I2\xde\x17\xdfRZ%j/\x15\xf2h\
\xd0\x91\x1c\x1fs\x8d\xd1\xa1k`\x14\x5c\xd2\xa9L[\
]Q\x00\xf7P\x8eV\xd4\x149\xf4\x1d\x0d\x1d\x87\xd9\
\xa0\x0c\x9ate\xc8\xfb\x1cl\x81\x9e\x03\xb6\xf0\xb6o\
\xfa`DcsD\x8bL\xcd\x86W\x0e6\x8a\x94\xb5\
\x1d\xf6N@\xf7\xa0\xd1a\xc1\xe9l\x9bmL\xc8\x10\
>\xc39!C\xee\xcdN\xed\x0b\x1a#\x0f\x13\xc7\xe8\
\x5cq0k\xb5\x8d\xb6A+\xe43m\xad\xae\xd8\xec\
\x9f\xc8\xd9*\xde\x81\xc8`\x99\x11c\x1d\xad\xc9PY\
<F\xca0\x18\xe8\x08\xb2\x18\xc0\x93*#f\xcek\
\x8et.\xc4c\x91\x07\x9cw`USW\x02+\xa7\
2\x12J\xack\xb2\xbeId6\x03\x9b\xa6\xc2\x906\
\xac@\x85\xc1\x89\x81p\x84\xea\x1d\xd2e\xd8\x8f*V\
\xe1t\xa4t\xe1\x8c\xd5C\x85\xdb\x8e}\xbb>\x92\xad\
+\xe2Je\xc0\x82\x19#\x1e\xaf\xcc\x90\x85\x98\x02\xb3\
@$@\x8f\xf1\x8f\xc6\x88\x99\x95\x9f\x5c\xa4.>\xb2\
\x81\x94\x94\xc5\xaf\xb0\xef\x82|0A\xea-]\xa2>\
\xda\xc4kC\x19M\xc6\xa8\x9e\x10\xa9\x94\x87V\xba\x03\
,x^\xa6\xf4\x07%\x03\xb6\x87\x03\x18\x87\xe4\x9a\x83\
\xce\xe4l\x1a!\xdc\xfan\xbai\xb5Cb(gp\
I\x19\xafIG\xa9\xcdF{\x0a\x0a\x81\xf2\x81\x8d\xe4\
B\x0e\x1e\xed\xb4\xf2\x8d7\xb0\x96O\xd9\x0fA\x12)\
:\x18\xdb\xb8\xd4&\x9b\x9c6\xe5\x90'{d\x9f\xd8\
8\xdf\x06\xacW\x9c\x09\x1e\xed\xac\x0a\xbeq\x16\xf9D\
\xd9\xd4y\x10\xf2>\xdc\xd4Y:\x911*+\xe4\xe5\
D\x05\xaf1tJCil\xd8\xa9\xfdC\x97\xc2{\
\xbc=\x8d\xb12\x17\x86:Z\x90\x91\xb2p\x0c\x94Q\
0\xce\x11b1\x80'UF\x82y]s\xa4r\x16\
O\x88\xdcc\xb8\x0d\xaa\x9ayxf\xb5T.B}\
uA\xa1j\x9a,L\xc0vac\xb1\x05\x19\xa70\
7\x85G\xe1\x06\xd57\x84\xc3\x08/\xaaP\x85\xcbu\
\xc7\xbe\xd5\x15\xd9?\x85\xd3J\xbf\x1e\x9e\xbar\xbcG\
<\x10\x19\xaf\xe0$\x00\x8f\xd7\x15\x88\x85\x94\x02\xb2\x00\
$0\x8f\xe1\x8f\xc6\xf0L\xc1O\xaeR\x97\x1f[A\
H+!\xf4\xb8\xef\xc0|0\xf1\xe9-G?\xfa\xe8\
\xb9\x9c\x86\xaf\x19\xe5\x85\xe7V\x0aJ\xf9dB\xcc\xdd\
+\x09\xe8\xc7\xe4\xe2.\xa8\xcf\x13\x9d\xab\xc2\xc5\x91\x19\
\x1d\x9d=#oi\x1dUg@\x1b[\xe7}\xa0\xd2\
\x06\xde\x19\xb5'\xcdZ|\xb4\xc8\x84pz\xb4\x02Z\
E\xd3y\x8dq`Q\xe2\x84G\x94\xf7\xa6S<\x0a\
]\xe4\x8eh\x1a\x0b\xab\x1a$\x8f.\x9c\xc5\x94\x1c6\
\x8bU-\xeaW[r*\xf2\x04\xb2\x08\x9d\xa3\x83\x97\
1\xbe;\xf2\xcf\x19\xdb\x22iU\x8e\xd7!hT\xa1\
T\xca\xd6\x1a\xe5\x1a\xb8\x81\xf7n\xb0\xd8\xf0\xd4\xb58\
=\xe2\x81\xc8p\x99\x11\xa3\x1d\xad\xc9`Y>\xc6\xca\
@\x18\xea\x08\xb4\x18\xc0\x93*#f\xcek\x8e\xb4.\
\xc4c\x91{\x10waUc\x0f\x04\xa1\x1cV\x18+\
\xb1\xae)\x14N2\xb3!\x84u\xd8dlG\x86*\
\x8cN\x91\x8e\x9d\x81=D\xbaM\xf5%F+\x1c\xaf\
+\xc5\xaaCV/\x95\xae;\xf2\xef\xfa\xd8\x9d;\xf4\
\x98+\x95!\x0bf\x02\xf3xi\x01Z\x08*P\x0b\
L\x02\xf6X\x03\xa31b&\xf3\x13\xab\xf0\xf2cC\
\x08i%\x84\x01\xd5]\xa0\x1f0X\xdd:\x9c\xea\xee\
\x04\xd8{\xbd\x13\xf0U\x89\xf4\xf0{e\xbb3\x94\xe0\
\xbdIC\xff\x96L\x0ct\xe4\x92Q\x82&:_\x80\
2[\xe5J\xb0G\x85\x8e&\xdb\x95\x5c\xa1[\xf4\xd7\
\xc4\x14\x1f,\xba\x89\x9e\x81F\xaa\xc8\x0e\xe5n2\x98\
\xe5Q\xfa\x16\xa2S:\x10)\x07zAY\x09\xfc\xf2\
\xe9=,\xf1X)7?\xf6j*\x08\xfb\xb89\xfd\
\xad\xf6)7\xa1N\x1bx\xd8\xc8d\xdd\xe5\x93\xab\xd5\
a\xb9;\xfeZ\xab\xb3\x8f\xbbw\xfb\x18J\xca\xd0#\
\xc5\x93\x10\xa2R\xba6\x1e&\xa1\xe4i,\xbd\xebs\
\x9e^\x87c/8\x13\xb4w\x8dE\x07\x02\xa3\xfa\xae\
\xf1G\x1c\xa2\xce\xcbR\x07\x82\x0d\xd6q\xd0\xa6\xa5~\
\x0c{\xc8\xa2;4\xda\xf4\xd5\x83W*\xa4R\x8c*\
T\x0bT8\x846xK\xf6s\x06;\xd0j*p\
\xde\xd7R\xf3\xe5\xc5\x85\xc9\xf7h)\x7f\xcf\x96\x82r\
3\x1du{\xca\x06*\xa6>\x95\x22 i4{h\
\xe0\xa8\x8aB\xc42H\x02\x91\xa22\xda\xc6\xc6Xh\
\x1e\x06\x0b\x14\xeb#\x9dA\xc5\x06\xc1O\xc5\xec\xba\x92\
\x1d\xed}T\xb0\x0dL\x93\xa8\xd0J\xb6\x1c\xa8d\x0d\
#\xa7\xf2&\xb9T\xa1\x01=\x7fr\xdd\xed\x08\xaa\xd5\
\x12\xaa\xe3\xf76\xd1\xc5EHJ\xdd\xa3\x89\xc2=\x9b\
\x88\xb4m3\xb6\x0d\xbd\xdfOV\xe9\xbed\xc0\x16C\
\xaa\xe8\x8e\xcb]\x86\x8a#\xd1\x0c\xf2N.\xa1\x0a\xbd\
\x82R\x86\xa6c\x06\x92/\xa5UhPuw\x05@\
F\x8ba\xe8\xb4'\xb7\x06\xd60\x98\x8e\xbck\xbd\x83\
\xd9\x82\xc56B\x16w\xf4\xce*\x98HnAo\xf2\
\xa3NT\xe7\xbf\xbf\x8d\xe6\xee^m\x14\xef\xd9F\xde\
\xd3\xe1\xaf+\xc9\x024\x8b\x8cT\x8c\xe4\x11\x98P\xde\
\x94#\x1a\xa84\x19\x8b\x9d\x00\xa2\xf2Y\xa7\xeeX\xc6\
b\xd7\xa1\xda\xf2\x96N\xc4\xc0\xa2d\x17\xafa\xd1\xc2\
\x00\xd6\xb3>\xe4\xae\xbb\xc16\x04\x8f\xb2\xeb\x94G\x9e\
+\xe5\x82\xa6\x01D\x03't\x9dD\xa3\xab\x11hU\
\xdf\xdbN&\xc3R\xcb{\xb4S\xbag;\xa1\x96B\
q\xeb\xfaN\x10\x9d\x22vF\x7f\xdcoS\x8ad?\
\xd0\xbd\xf3\xe4\xfa\x09AIg\x9f\xbb&1\xba\x88\xca\
\x816V\x80uBW\x0a\x07\xe4\xb6\x90\xfb\x97BH\
2t\xce_8\xa4`\xb0\x0b#\xfaxK\x9b\xb0\x14\
\x8d\xc6\x19p\x8d\xa8\xd0\xe9nL\xdfO'\xb4\xb1\xff\
A\xd4\x8b\x8b\x8b\x8b8\xbbGK\xe5\xfb.!\x90\xde\
\xa9\xe5H\xdd\x09F\x0e*h]\x1b\xd4\x88*\x01\xdd\
\x81\xc9\xa4K\x9d\xba{J\xb0K\xa9',\x9d\xd5\x18\
\xaa'\xb4\xb5-Z\x91\xf2=6\x12\x1d9w\xa5?\
\x86Dd\x8d\xf2\xae\x97^\x8c\xc5r\x8a\x03v\xd1\xaa\
@\xf6B%\x02\xcb\x1b\xdb\x9b3\xd2\x15*P\x11\x0c\
\xa3G4\xfc\x1fHS\xf5\xad\x8b<.\xb8u\x09\xe9\
\x9c)\x91r:\xeaa\xba\xb2\x06\xa9R\x0ctO\xd0\
\x22\xe4\x1b\x07\x07\x05|\x8c\xf3t\xf8\x82\x90\x84\xfe\xd2\
\xa5\xfe\x92$U\x00\xf0u\xd7\xb8\xd2zzC}\x0a\
i\xcf\xa5\xae\xccs\xc891\x1d\xbd3\xd4\xf5O\x96\
^L\x22Q\xa1vW\xd8Z\xb4[J?\xe4\xe8\x8a\
3\x0a\xc6\x0ck\x87R\xe4)o=\xedQ\xba\x8f\xee\
B\x7f\xbd\x105\xa5K\xd1\xd3\x1bM\x04aD\xd8@\
\x89\xd2X\xa4\xbc<\xbe=2\xdc\xef9\x17h{\x1a\
#\xadL\x18\xe7h=\x09s\x90\x8dQ2\x88#\xf7\
p\xce\xc5\xd7B1\x95\x8d`]W\x1ci\xbb\xca\xc6\
\xe2\xf6\xf2\xdf\x01\xc4\xafZ\xbagVIe\x224\xc7\
\xeb\x095\x97\xce\xb4\xaa\x9fm\x22\x0c%\xacw\xe4n\
\xcb\xf9\x08e\xf5\x09\x01\x93\xbdGh\x9b]\x8d\x0e\x08\
\xd8\x05\xd9/\xa5\xb3\x8e<\x9a\xaf\xa2\x9c\x0b\xc4\x95*\
\x1137\xe9Y\xa3\xb5\xa5\x1f\xb2\xa4\x02\xb4\x00u\xf4\
\xf6\xc8\xf9x\x04\xcf\x13\xdc\xe4\x1au\xf1[V\x10\xb2\
J\x04=\xaa#@\xeb\x01\xc1O\x1d\x01\xa0\x1a\xf7\xf1\
N\xb8qo\x0b6?sV0\xfc|\xa0\xfc\xd7\xff\
[\x7fGA\x91\xf2\x1b\x0aC%>q\x98\xbc\xf3+\
\x87\x8f\x11\xeac\x84\xfa\x18\xa1\xfe\x7f\x22\xd4\xc7\x1f\x0f\
}\x1c\xf6\x01\x87\xddM8\xa8\xeb\xfb_\xc3\x0d9K\
\xfcn\xef\x8c~\xe1\xf8\xf4\xd1\xbf\x01:\x8f<\x83\
\x00\x00\x04\xc0\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x000\x00\x00\x000\x08\x02\x00\x00\x00\xd8`n\xd0\
\x00\x00\x04\x87IDATx^\xed\x95mL[U\
\x18\x801\xfe\xf0\xa7\xc6e&\xd3-\xdb\x1c \x0e\xdd\
\xb2\xa8\xf1+F\x9d3\xfe\xd0%#\x9a\x98\x99\x18\xff\
\xb0\x1ft2M\x99LZ\x91.\xb4`\x08\x1f]\xc6\
\xc7\x0f\xb1\xc0\xa0\x85\x01\xbd-0J[\xd6i\xa0\x11\
R>\x1ci\xd6RF[\xa0@kK\xf9\x10h\xcb\
G\xf3\xfa\x96S\xaf\xf4\x0e\xbc&\xa6\xdbL\xee\x93\xe6\
\xe6\xe6\xbd\xef9\xf79\xf7\xbc\xefi\x02<d$0\
\x03\x0f\x1aN\x88\x0dN\x88\x0dN\x88\x0dN\x88\x0dN\
\x88\x0dN\x88\x8d\xff\x89\xd0rh\xc3\xb3\x14\x0c\xaeo\
2\x1f\xc4\x1f\xa6\x90bh\xfa\xe4Uc\xaaD\x9fr\
Y\x93\x94\xdb~\xfa\xaaabn\x99\x91\x13W\x98B\
i?\x99|\xcb\xa1\xe3\x12\x1d\xda<\x9bC\x1d\xfc\xe6\
\xfa\xb9\x9a\x1eFN\x5c\x89\x11\xda\x0c\xc3\xf1\xc2\x9b\x9f\
\xd7\xf6'\x7f\xdfqD\xa0:\x98\xdd\xfc\x0c_~\xe6\
\x8av{N\xbc\x89\x0a\xcd\xaf\xaek,\x1e\xe5\xed\x19\
\xe9-[i\xb7\xb5Xw'\xad\xdc\xb0\x9f\xaf\xd8w\
\xe1\xda\xe9\xd2N\x08\xdd\x86\xc0/\xb0\xe9\x8b\x1d\x0b^\
\xafW\xa3\xd1\xd4\xd4\xd4\xb4\xb6\xb6\xce\xcf\xcfc$\x1c\
\x0e\xeb\xf5\xfa\xf5\xf5u\x92`\xb7\xdb\x87\x86\x86\xc8\xbd\
\xc3\xe1P\xa9T2\x99\x0c\x87\xac\xad\xad\x91\xa0\xcdf\
knn\xc6`OO\x0f\x8e\x05\x22\xe4\xf4\xaf\xbey\
\xc5\xf8b\xa1\xe1h\xbe69\xef\xc6\x11\xa1\xea\xd0\xa5\
\x96\x03Y\x8d\xfb\xbe\xba\xb6\xf7\xbc\xec\xa3\x92\x0e\xf0K\
`\xf6\x13\x98\xfd\x02 :\x11\x99K$\x12Y,\x16\
T\xe9\xee\xee\x16\x08\x04\xf8\x9aP(\x94\x9e\x9e\x8eW\
\x92\xa3\xd3\xe9\xaa\xaa\xaa\xf0\xc6`0H\xa5\xd2\x89\x89\
\x09\xbf\xdf\x8f\x0b\xa8\xa8\xa8 \x09&\x93izz\xda\
\xe5r\x15\x14\x14\xa8\xd5j B\xe5\xbd\x8ec?\xdc\
:*\xd6='\xeaL\x14\xaa\x0f]j=p\xb1\xf1\
\xe9\xaf\xeb\x9f\xfaR\xb6'\xa3\xfal\x85\x0e\xbcY\xe0\
\xfa\x00&\xde\x82\x80)\xaa\x03`4\x1a\xc9\xcb\x08\xd9\
\xd9\xd9\x83\x83\x83\xbb\x09)\x14\x8a\xae\xae.\x12\x5cX\
X\xc0\x1c\xfc\xba\xf4X\xa4\xbf\xbf\xbf\xb8\xb8\x18\x88\x10\
\x9f2\xa7\x8a\xf5)\x22M\xe2wm\x87\xbfU\x9e\x10\
\xa9^\xbeL\x9d\xc8m>&h|GB\x0d\x8f\xea\
`\xea\x148_\x07{*,\xc8\xe8)\x18BEE\
Emmm\xbb\x09\xc9\xe5rZ\x08\xc9\xc8\xc8@{\
\xdc\xa3\xce\xce\xce\x92\x92\x92\xca\xcaJ\x89D\x823\x00\
\x11\xe2]\x1f&M\x9e\x92\xab\xfe\xd9\xdc\x0fK?\xc2\
b%,V\xc0\xbc\x14|\xb90y\x12\x1c/\xc1x\
\x12\xd8\x9e\x00\x9f\x84\x9e\xf4^!\x8a\xa2\xfe\xa5\x10\x8f\
\xc7\xc3O\xd2\xdb\xdb+\x16\x8b\x83\xc1 F\xfa\xfa\xfa\
\xfe\x16*\xd4Z\x22M.\xa0\xb2[L\xe0\xbd\x00\x9e\
\xcf\xc0\xfd)\xcc\x9c\x81\xa9\xf7\xc1\xf9\x06\xd8_\x80\xbb\
\xfba\xf41\xb0$\xc0\x12EO\xba]\x08\xd7\x9a\x95\
\x95500\x80\xe5\x8cB\xb8)$N\x0b544\
\xd0Bsss\x98\xe3\xf1x\xb0\x15\xea\xea\xeaH0\
Fhx\xca\x9f(\x8c4y\x91\xe67p\x9f\x8d\xd4\
\xaf\xebC\x98|\x17\x9c\xaf\xc0x2\xd8\x9e\x04\xeb#\
p'\x01,{!\xbcJ\xc6\xc3\x96\x10\x9f\xcf\xd7j\
\xb5X\xd7\xb5\xb5\xb5\xf9\xf9\xf9\x1b\x1b\x1b\x18/--\
\xc5\xfa5\x9b\xcd\xd88B\xa1\x90\x16\xca\xcb\xcb\xc3!\
\x18\xc7\x17\x13\x0f\xec\xbb\xcc\xccLL\xc3`YY\x19\
n_T\x08\xb9i\x99\x15R\x83z\xf3$\xcc\xa4E\
\xebw\xf6\x1cxE\xf0\xfbEp\xf3`\x96\x073\xe7\
a\xf5W\xda\x06\xb6\x84\xca\xcb\xcbGFF\x9a\x9a\x9a\
\xb0\x93\xc9\x97G\xb0\xd7\xb0\xf3[ZZpS\xf0\xab\
TWWc\xb0\xbe\xbe^\xa9T\xe2\x1e\xe1\xde\xd1\x1d\
\x8e8\x9dN\xcc\xc4U\xb9\xddn\x12a\x9c\xd4\x9b0\
\xf5\x1e8_\x8b\xd4\xaf\xfdy\x18?\x0cw\x93`\xf2\
\xe3\xd8\x9c((Dw\xefnttt`\x7f\xc1\x96\
P{{;\xf3\xf1N0\x84\xc2\xe0|\x15\xc6\x13\xc1\
\xf6xd\x9b\x9co\xc3\xda\x148N\xc5\xe6Da\x15\
\xc2E\xe7\xe4\xe4X\xadV\xf8\x0fB\x00\x8br\x18\xdb\
\x13\xa9_3\xfe\x1e\x8d\xd8\xac\xec\xfc_FJ\x87\x19\
\xdd\xc2\xe7\xf3a\xa1\xa0\xee\xe8\xe8(\x89\xe0\xc9\xb9\xbd\
\xcb\xfe\x81{\x84\x10\xac\x5c,\x97?\xb4\x10\x18\x8el\
\xe2\xfd\x85)\x84\xe5\x86\xad\x8b\x15\x1a\x08\x04\xf0J\x1a\
\xe7~\xc2\x14ZYY\xc1\x13\x02\x8b\x7fll\x0c\xaf\
x\xc0\xa3\x19#'\xae0\x85\x08\xe1\xbf`>\x88?\
;\x0b=@8!68!68!68!6\
8!68!6\x1e:\xa1?\x01S\xe1\x9f|\x8b\
j\x8f\xf5\x00\x00\x00\x00IEND\xaeB`\x82\
"
qt_resource_name = b"\
@@ -14195,6 +14488,14 @@ qt_resource_name = b"\
\x07\x87WG\
\x00q\
\x00t\x00.\x00p\x00n\x00g\
\x00\x0e\
\x03\x9b+G\
\x00m\
\x00a\x00t\x00p\x00l\x00o\x00t\x00l\x00i\x00b\x00.\x00s\x00v\x00g\
\x00\x0d\
\x04\xbey'\
\x00p\
\x00a\x00c\x00k\x00a\x00g\x00i\x00n\x00g\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -14202,14 +14503,18 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x12\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\
\x00\x00\x00\x12\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x97\x0d\xb6\xa1\x16\
\x00\x00\x01\x97\xa0\xe5\x95}\
\x00\x00\x00p\x00\x01\x00\x00\x00\x01\x00\x03t\xf5\
\x00\x00\x01\x97\xb7\xaf+u\
\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x03\x82I\
\x00\x00\x01\x97\xb7\xb1\xa2\xd4\
\x00\x00\x00^\x00\x00\x00\x00\x00\x01\x00\x03f\x83\
\x00\x00\x01\x97\x12L\xfd\x82\
\x00\x00\x01\x97\xa0\xe5\x95|\
\x00\x00\x004\x00\x00\x00\x00\x00\x01\x00\x03H\xd3\
\x00\x00\x01\x96\xed\x00qM\
\x00\x00\x01\x97\xa0\xe5\x95{\
"
def qInitResources():

View File

@@ -4,5 +4,7 @@
<file>./images/logo.png</file>
<file>./images/3rd/qfluentwidgets.png</file>
<file>./images/3rd/qt.png</file>
<file>./images/3rd/matplotlib.svg</file>
<file>./images/3rd/packaging.png</file>
</qresource>
</RCC>

View File

@@ -1,14 +1,100 @@
from PySide6.QtGui import QDesktopServices, Qt
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout
from qfluentwidgets import PrimaryPushSettingCard, FluentIcon, GroupHeaderCardWidget, PushButton, ImageLabel, TitleLabel
from PySide6.QtGui import QDesktopServices, Qt, QColor
from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget
from qfluentwidgets import FluentIcon, GroupHeaderCardWidget, PushButton, ImageLabel, \
TitleLabel, HeaderCardWidget, BodyLabel, HyperlinkLabel, SingleDirectionScrollArea
from qfluentwidgets.components.widgets.card_widget import CardSeparator
from module.about.schema import ThirdParty
from ui.components.widget import Widget
from utils.function import DEVELOPMENT_ENV
from utils.function import RELEASE_ENV
if RELEASE_ENV:
from build_info import *
class AboutWidget(Widget):
def __init__(self, key: str, parent=None):
super().__init__(key, parent)
class AboutCard(HeaderCardWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setTitle('关于本程序')
self.vBoxLayout = QVBoxLayout(self)
self.vBoxLayout.setContentsMargins(0, 0, 0, 0)
self.lineVBoxLayout = QVBoxLayout(self)
self.lineVBoxLayout.setContentsMargins(24, 16, 24, 8)
self.textVBoxLayout = QVBoxLayout(self)
self.textVBoxLayout.setContentsMargins(24, 8, 24, 16)
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.addLine('程序名称', '教学工具箱')
if RELEASE_ENV:
self.addLine('程序版本', '1.0.0#' + GIT_HASH)
self.addLine('作者', '许方杰')
if RELEASE_ENV:
self.addLine('构建时间', BUILD_TIME)
self.addLine('许可证', 'GNU 通用公共许可证 第三版GPLv3')
self.addLineUseLink('项目主页', 'https://cantyonion.site/git/cantyonion/JITToolBox')
self.addText(
'教学工具箱是自由软件;您可以依据自由软件基金会发布的 GNU 通用公共许可证第三版条款,重新发布或修改它;许可证应使用第三版或(按您的选择)任何其更新的版本。')
self.addText(
'教学工具箱是以希望它有用为目的而发布的,但不附带任何担保;甚至没有适销性或特定用途适用性的隐含担保。请参看 GNU GPL 第三版了解更详细的内容。')
self.addTextWithLink('您应该已收到一份 GNU 通用公共许可证的副本;如果没有,请查看<',
'https://www.gnu.org/licenses/gpl-3.0.html')
self.vBoxLayout.addLayout(self.lineVBoxLayout)
self.vBoxLayout.addWidget(CardSeparator(self))
self.vBoxLayout.addLayout(self.textVBoxLayout)
self.viewLayout.addLayout(self.vBoxLayout)
def addLine(self, title: str, content: str):
hBox = QHBoxLayout(self)
mTitlte = BodyLabel(title, self)
mContent = BodyLabel(content, self)
mContent.setTextColor(QColor(96, 96, 96), QColor(206, 206, 206))
mTitlte.setFixedWidth(100)
hBox.addWidget(mTitlte)
hBox.addWidget(mContent)
self.lineVBoxLayout.addLayout(hBox)
def addLineUseLink(self, title: str, content: str):
hBox = QHBoxLayout(self)
mTitle = BodyLabel(title, self)
mContent = HyperlinkLabel(content, content)
mTitle.setFixedWidth(100)
hBox.addWidget(mTitle)
hBox.addWidget(mContent)
self.lineVBoxLayout.addLayout(hBox)
mContent.clicked.connect(lambda: QDesktopServices.openUrl(content))
def addText(self, text: str):
label = BodyLabel(text, self)
label.setWordWrap(True)
self.textVBoxLayout.addWidget(label)
def addLink(self, text: str, url: str):
link = HyperlinkLabel(url, text)
link.setUrl(url)
self.textVBoxLayout.addWidget(link)
def addTextWithLink(self, text: str, url: str):
hBox = QHBoxLayout(self)
label = BodyLabel(text, self)
link = HyperlinkLabel(url, url)
link.setContentsMargins(0, 0, 0, 0)
hBox.addWidget(label)
hBox.addWidget(link)
hBox.addWidget(BodyLabel(">。", self))
self.textVBoxLayout.addLayout(hBox)
link.clicked.connect(lambda: QDesktopServices.openUrl(url))
class AboutMain(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.logoImage = ImageLabel(':/images/logo.png')
self.logoImage.scaledToHeight(100)
@@ -18,48 +104,46 @@ class AboutWidget(Widget):
self.hBox.addWidget(self.logoImage, 0, Qt.AlignLeft)
self.hBox.addWidget(self.appNameLabel, 1, Qt.AlignLeft)
build_time_str = ''
if DEVELOPMENT_ENV:
from build_info import BUILD_TIME
build_time_str = f",构建时间:{BUILD_TIME}"
third_parties = [
ThirdParty("PySide6", "https://qt.io", ":/images/3rd/qt.png"),
ThirdParty("QFluentWidgets", "https://qfluentwidgets.com", ":/images/3rd/qfluentwidgets.png"),
ThirdParty("openpyxl", "https://openpyxl.readthedocs.io/en/stable"),
ThirdParty("python-docx", "https://github.com/python-openxml/python-docx"),
ThirdParty("Matplotlib", "https://matplotlib.org", ":/images/3rd/matplotlib.svg"),
ThirdParty("packaging", "https://github.com/pypa/packaging", ":/images/3rd/packaging.png"),
ThirdParty("pywin32", "https://github.com/mhammond/pywin32")
]
sorted(third_parties, key=lambda item: item.name)
self.version_card = PrimaryPushSettingCard(
text="获取源码",
icon=FluentIcon.INFO,
title="关于",
content=f"作者许方杰。当前版本1.0.0{build_time_str}\n"
f"本软件使用 GPLv3 开源协议进行分发,作者不对使用本软件造成的任何损失负责。"
)
self.button_list = [
PushButton("访问网站"),
PushButton("访问网站"),
PushButton("访问网站"),
PushButton("访问网站"),
]
self.url_list = [
"https://qt.io",
"https://qfluentwidgets.com",
"https://openpyxl.readthedocs.io/en/stable",
"https://github.com/python-openxml/python-docx"
]
self.group_card = GroupHeaderCardWidget(self)
self.group_card.setTitle("第三方框架")
self.vbox = QVBoxLayout(self)
self.vbox.addLayout(self.hBox)
self.vbox.addWidget(self.version_card)
self.vbox.addWidget(AboutCard(self))
self.vbox.addWidget(self.group_card)
self.vbox.addStretch(1)
self.group_card.addGroup(":/images/3rd/qt.png", "PySide6", self.url_list[0], self.button_list[0])
self.group_card.addGroup(":/images/3rd/qfluentwidgets", "QFluentWidgets", self.url_list[1], self.button_list[1])
self.group_card.addGroup(FluentIcon.LAYOUT, "openpyxl", self.url_list[2], self.button_list[2])
self.group_card.addGroup(FluentIcon.LAYOUT, "python-docx", self.url_list[3], self.button_list[3])
[self.addThirdParty(x) for x in third_parties]
self.version_card.clicked.connect(
lambda: QDesktopServices.openUrl("https://cantyonion.site/git/cantyonion/DefenseTopicGenerator")
)
self.button_list[0].clicked.connect(lambda: QDesktopServices.openUrl(self.url_list[0]))
self.button_list[1].clicked.connect(lambda: QDesktopServices.openUrl(self.url_list[1]))
self.button_list[2].clicked.connect(lambda: QDesktopServices.openUrl(self.url_list[2]))
self.button_list[3].clicked.connect(lambda: QDesktopServices.openUrl(self.url_list[3]))
def addThirdParty(self, third_party: ThirdParty):
button = PushButton(FluentIcon.LINK, "访问网站")
button.setFixedWidth(120)
self.group_card.addGroup(third_party.qrc if third_party.qrc else FluentIcon.LAYOUT, third_party.name,
third_party.url, button)
button.clicked.connect(lambda: QDesktopServices.openUrl(third_party.url))
class AboutWidget(Widget):
def __init__(self, key: str, parent=None):
super().__init__(key, parent)
self.scrollArea = SingleDirectionScrollArea(orient=Qt.Vertical)
self.scrollArea.setWidget(AboutMain(self))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.enableTransparentBackground()
self.vBox = QVBoxLayout(self)
self.vBox.setContentsMargins(0, 0, 0, 0)
self.vBox.setSpacing(0)
self.vBox.addWidget(self.scrollArea)

View File

@@ -3,7 +3,7 @@ import sys
from PySide6.QtCore import Signal
from PySide6.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QApplication, QGridLayout
from qfluentwidgets import PushButton, SpinBox, PrimaryPushButton, \
BodyLabel, CardWidget, SimpleCardWidget, FluentStyleSheet
BodyLabel, SimpleCardWidget
from qfluentwidgets.components.widgets.card_widget import CardSeparator
from ui.components.widget import RollingTextWidget