pyscreeps-arena 0.5.6.6__py3-none-any.whl
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.
- pyscreeps_arena/__init__.py +51 -0
- pyscreeps_arena/build.py +7 -0
- pyscreeps_arena/compiler.py +1221 -0
- pyscreeps_arena/core/__init__.py +1 -0
- pyscreeps_arena/core/basic.py +72 -0
- pyscreeps_arena/core/config.py +19 -0
- pyscreeps_arena/core/const.py +28 -0
- pyscreeps_arena/core/core.py +132 -0
- pyscreeps_arena/core/main.py +9 -0
- pyscreeps_arena/core/utils.py +11 -0
- pyscreeps_arena/localization.py +146 -0
- pyscreeps_arena/project.7z +0 -0
- pyscreeps_arena/ui/P2PY.py +108 -0
- pyscreeps_arena/ui/__init__.py +10 -0
- pyscreeps_arena/ui/project_ui.py +214 -0
- pyscreeps_arena/ui/rs_icon.py +43 -0
- pyscreeps_arena-0.5.6.6.dist-info/METADATA +50 -0
- pyscreeps_arena-0.5.6.6.dist-info/RECORD +21 -0
- pyscreeps_arena-0.5.6.6.dist-info/WHEEL +5 -0
- pyscreeps_arena-0.5.6.6.dist-info/entry_points.txt +4 -0
- pyscreeps_arena-0.5.6.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
项目创建UI界面
|
|
4
|
+
"""
|
|
5
|
+
import sys
|
|
6
|
+
import os
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
|
|
9
|
+
QHBoxLayout, QLabel, QLineEdit, QPushButton,
|
|
10
|
+
QFileDialog, QMessageBox)
|
|
11
|
+
from PyQt6.QtCore import Qt
|
|
12
|
+
from PyQt6.QtGui import QFont
|
|
13
|
+
from PyQt6.QtGui import QIcon
|
|
14
|
+
from pyscreeps_arena.core import const
|
|
15
|
+
from pyscreeps_arena.ui.rs_icon import get_pixmap
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ProjectCreatorUI(QMainWindow):
|
|
19
|
+
def __init__(self):
|
|
20
|
+
super().__init__()
|
|
21
|
+
self._proj_name = ""
|
|
22
|
+
self._proj_path = ""
|
|
23
|
+
self._init_ui()
|
|
24
|
+
|
|
25
|
+
def _init_ui(self):
|
|
26
|
+
"""初始化UI界面"""
|
|
27
|
+
self.setWindowTitle("PyScreeps Arena - 项目创建器")
|
|
28
|
+
self.setWindowIcon(QIcon(get_pixmap()))
|
|
29
|
+
self.setFixedSize(500, 350)
|
|
30
|
+
|
|
31
|
+
# 主窗口部件
|
|
32
|
+
central_widget = QWidget()
|
|
33
|
+
self.setCentralWidget(central_widget)
|
|
34
|
+
layout = QVBoxLayout(central_widget)
|
|
35
|
+
layout.setSpacing(15)
|
|
36
|
+
layout.setContentsMargins(30, 30, 30, 30)
|
|
37
|
+
|
|
38
|
+
# 标题
|
|
39
|
+
title = QLabel("PyScreeps Arena")
|
|
40
|
+
title.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
41
|
+
title_font = QFont()
|
|
42
|
+
title_font.setPointSize(18)
|
|
43
|
+
title_font.setBold(True)
|
|
44
|
+
title.setFont(title_font)
|
|
45
|
+
layout.addWidget(title)
|
|
46
|
+
|
|
47
|
+
# 项目信息
|
|
48
|
+
info_widget = QWidget()
|
|
49
|
+
info_layout = QVBoxLayout(info_widget)
|
|
50
|
+
info_layout.setSpacing(8)
|
|
51
|
+
|
|
52
|
+
# 版本信息
|
|
53
|
+
version_label = QLabel(f"版本: {const.VERSION}")
|
|
54
|
+
version_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
55
|
+
info_layout.addWidget(version_label)
|
|
56
|
+
|
|
57
|
+
# 作者信息
|
|
58
|
+
author_label = QLabel(f"作者: {const.AUTHOR}")
|
|
59
|
+
author_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
60
|
+
info_layout.addWidget(author_label)
|
|
61
|
+
|
|
62
|
+
# GitHub信息
|
|
63
|
+
github_label = QLabel(f"GitHub: {const.GITHUB_NAME}")
|
|
64
|
+
github_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
65
|
+
info_layout.addWidget(github_label)
|
|
66
|
+
|
|
67
|
+
layout.addWidget(info_widget)
|
|
68
|
+
|
|
69
|
+
# 分隔线
|
|
70
|
+
separator = QLabel("─" * 50)
|
|
71
|
+
separator.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
72
|
+
separator.setStyleSheet("color: #ccc;")
|
|
73
|
+
layout.addWidget(separator)
|
|
74
|
+
|
|
75
|
+
# 项目输入区域
|
|
76
|
+
input_widget = QWidget()
|
|
77
|
+
input_layout = QVBoxLayout(input_widget)
|
|
78
|
+
input_layout.setSpacing(12)
|
|
79
|
+
|
|
80
|
+
# 项目名称输入
|
|
81
|
+
name_layout = QHBoxLayout()
|
|
82
|
+
name_label = QLabel("项目名称:")
|
|
83
|
+
name_label.setFixedWidth(80)
|
|
84
|
+
self._name_input = QLineEdit()
|
|
85
|
+
self._name_input.setPlaceholderText("输入项目名称...")
|
|
86
|
+
self._name_input.textChanged.connect(self._on_name_changed)
|
|
87
|
+
name_layout.addWidget(name_label)
|
|
88
|
+
name_layout.addWidget(self._name_input)
|
|
89
|
+
input_layout.addLayout(name_layout)
|
|
90
|
+
|
|
91
|
+
# 项目路径输入
|
|
92
|
+
path_layout = QHBoxLayout()
|
|
93
|
+
path_label = QLabel("保存位置:")
|
|
94
|
+
path_label.setFixedWidth(80)
|
|
95
|
+
self._path_input = QLineEdit()
|
|
96
|
+
self._path_input.setPlaceholderText("选择项目保存位置...")
|
|
97
|
+
self._path_input.setReadOnly(True)
|
|
98
|
+
# 默认桌面路径
|
|
99
|
+
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
|
|
100
|
+
if os.path.exists(desktop_path):
|
|
101
|
+
self._path_input.setText(desktop_path)
|
|
102
|
+
self._proj_path = desktop_path
|
|
103
|
+
path_layout.addWidget(path_label)
|
|
104
|
+
path_layout.addWidget(self._path_input)
|
|
105
|
+
|
|
106
|
+
# 浏览按钮
|
|
107
|
+
browse_btn = QPushButton("浏览...")
|
|
108
|
+
browse_btn.setFixedWidth(60)
|
|
109
|
+
browse_btn.clicked.connect(self._browse_path)
|
|
110
|
+
path_layout.addWidget(browse_btn)
|
|
111
|
+
|
|
112
|
+
input_layout.addLayout(path_layout)
|
|
113
|
+
layout.addWidget(input_widget)
|
|
114
|
+
|
|
115
|
+
# 按钮区域
|
|
116
|
+
button_layout = QHBoxLayout()
|
|
117
|
+
button_layout.addStretch()
|
|
118
|
+
|
|
119
|
+
# 创建按钮
|
|
120
|
+
self._create_btn = QPushButton("创建项目")
|
|
121
|
+
self._create_btn.setFixedSize(100, 35)
|
|
122
|
+
self._create_btn.clicked.connect(self._create_project)
|
|
123
|
+
self._create_btn.setEnabled(False)
|
|
124
|
+
button_layout.addWidget(self._create_btn)
|
|
125
|
+
|
|
126
|
+
# 取消按钮
|
|
127
|
+
cancel_btn = QPushButton("取消")
|
|
128
|
+
cancel_btn.setFixedSize(80, 35)
|
|
129
|
+
cancel_btn.clicked.connect(self.close)
|
|
130
|
+
button_layout.addWidget(cancel_btn)
|
|
131
|
+
|
|
132
|
+
layout.addLayout(button_layout)
|
|
133
|
+
layout.addStretch()
|
|
134
|
+
|
|
135
|
+
def _on_name_changed(self, text):
|
|
136
|
+
"""项目名称改变时的处理"""
|
|
137
|
+
self._proj_name = text.strip()
|
|
138
|
+
self._create_btn.setEnabled(bool(self._proj_name and self._proj_path))
|
|
139
|
+
|
|
140
|
+
def _browse_path(self):
|
|
141
|
+
"""浏览选择路径"""
|
|
142
|
+
current_path = self._path_input.text() or os.path.expanduser("~")
|
|
143
|
+
path = QFileDialog.getExistingDirectory(
|
|
144
|
+
self, "选择项目保存位置", current_path
|
|
145
|
+
)
|
|
146
|
+
if path:
|
|
147
|
+
self._path_input.setText(path)
|
|
148
|
+
self._proj_path = path
|
|
149
|
+
self._create_btn.setEnabled(bool(self._proj_name and self._proj_path))
|
|
150
|
+
|
|
151
|
+
def _create_project(self):
|
|
152
|
+
"""创建项目"""
|
|
153
|
+
if not self._proj_name or not self._proj_path:
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
# 构建完整路径
|
|
157
|
+
full_path = os.path.join(self._proj_path, self._proj_name)
|
|
158
|
+
|
|
159
|
+
# 检查路径是否已存在
|
|
160
|
+
if os.path.exists(full_path):
|
|
161
|
+
reply = QMessageBox.question(
|
|
162
|
+
self, "路径已存在",
|
|
163
|
+
f"路径 '{full_path}' 已存在。\n是否继续?",
|
|
164
|
+
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
|
|
165
|
+
)
|
|
166
|
+
if reply != QMessageBox.StandardButton.Yes:
|
|
167
|
+
return
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
# 创建项目
|
|
171
|
+
self._extract_project_template(full_path)
|
|
172
|
+
|
|
173
|
+
QMessageBox.information(
|
|
174
|
+
self, "成功",
|
|
175
|
+
f"项目 '{self._proj_name}' 创建成功!\n路径: {full_path}"
|
|
176
|
+
)
|
|
177
|
+
self.close()
|
|
178
|
+
|
|
179
|
+
except Exception as e:
|
|
180
|
+
QMessageBox.critical(
|
|
181
|
+
self, "错误",
|
|
182
|
+
f"项目创建失败:\n{str(e)}"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
def _extract_project_template(self, target_path):
|
|
186
|
+
"""提取项目模板"""
|
|
187
|
+
# 获取当前包路径
|
|
188
|
+
this_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
189
|
+
project_7z_path = os.path.join(this_path, 'project.7z')
|
|
190
|
+
|
|
191
|
+
if not os.path.exists(project_7z_path):
|
|
192
|
+
raise FileNotFoundError(f"项目模板文件不存在: {project_7z_path}")
|
|
193
|
+
|
|
194
|
+
# 创建目标目录
|
|
195
|
+
os.makedirs(target_path, exist_ok=True)
|
|
196
|
+
|
|
197
|
+
# 解压项目模板
|
|
198
|
+
import py7zr
|
|
199
|
+
with py7zr.SevenZipFile(project_7z_path, mode='r') as archive:
|
|
200
|
+
archive.extractall(path=target_path)
|
|
201
|
+
|
|
202
|
+
print(f"[DEBUG] 项目模板已解压到: {target_path}") # 调试输出
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def run_project_creator():
|
|
206
|
+
"""运行项目创建器UI"""
|
|
207
|
+
app = QApplication(sys.argv)
|
|
208
|
+
window = ProjectCreatorUI()
|
|
209
|
+
window.show()
|
|
210
|
+
sys.exit(app.exec())
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
if __name__ == '__main__':
|
|
214
|
+
run_project_creator()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
PyQt6资源模块: icon.png
|
|
4
|
+
由 png_to_py.py 自动生成
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# Base64编码的PNG数据(单行,无换行符)
|
|
8
|
+
ICON = b"iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAA57GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjUtMTEtMjFUMjM6MDE6MjUrMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDI1LTExLTIxVDIzOjAxOjI1KzA4OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAyNS0xMS0yMVQyMzowMToyNSswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NTJmOTM2Y2QtOTY1MC01YjQ0LTgzMjMtYjBjMjgwZDM0MGI3PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6ZWQzNTEwMjMtYzZlYS0xMWYwLTk2YjktZmM2NTg2ZGU4Mzc1PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MGU2N2I1ZTItOTllOS1jMTQyLWIxYjYtMWUwNWY4MzAyYjdiPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBlNjdiNWUyLTk5ZTktYzE0Mi1iMWI2LTFlMDVmODMwMmI3Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNS0xMS0yMVQyMzowMToyNSswODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo1MmY5MzZjZC05NjUwLTViNDQtODMyMy1iMGMyODBkMzQwYjc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMjUtMTEtMjFUMjM6MDE6MjUrMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pud2StQAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABA5JREFUeNpklE2IntUVx3/n3Hufed+Zd74yZjLR+DUxfqXFYkIaiC0iLa22W923IAi6UFy4DbhxqQiiCF2Jq27daWlRoU2VptVSqE1CwaSTxGTCzLwfz3PvPaeLZ8SF564unPPnnv/985Mnf/X01c8/O7cemoSZISIYBg4iAiKAAaAGASHXChGEiLujqtQu+4mTpy7J+qG7fW44pMtdL5YLTZwjW0ZjwEpFXTEJaDS8GOaGSINbi6ZetEkN7XTaqaZIO5sBgDuaIsUMV6hUNKX9V1bMKh4KISlQ0RTBHYB2NkNjbBQgNQ0AVg3LBY8gZkiXwQtVHQkVq457gxn9PRes9nakpgEBBcht2/vljsYAVlkIyuaB21hURcQBZThcZ7R4D9gC7tL3uiMi5LbtfXYcjRE8kCRgWhCMO0cbvHlmgxVSP+RCl4Y8cuZ1RmsP4aa4VTTO4RQkCeAotWFQoMiEEg26JY6PVvn9zze5d2mZLEO8dNQyI6YJw+U1Hn3qdVbXjoILQQrUitRF3EEdY9xMmK8jyANOH668+7NjLM9X3jl/iWvjbSQlUlQmO9e58Nn7LISDHH/8bVY2TjMrhRhWcL0FAmFltHTWo5EL3H9wyLs//SF3xBGv/uUib1z8hqWlJZoDPybOH8Xr1+z974/kXFk79guOHDzD5e1P6cZbSBVUh4SF5dWznhc4dajhncce5sj8gNe++A+/+9dlsMrwwGkee+It1h/4Nd9c/JhJ2eXG9fPE2YTVo7/knkNPcP3aF3TtFdwykf1yviszQxAkCDl3eB9RVApmjjD4Nn7fK7lj414vTYe1DQ8cHPHe48c5rENe+8cl3rjwNcvNEF3+EZQhs/Ffkb0b3PWDF7jr9MuEW1f406e/pb3+FVodjfOE4eL6WdeWoS9wbWz8/cZVfnLnCk9tLuGTMecu7zGZXsKn/2Zqxuax53nwzPO0u1f42yevsLN1nrmwiMkMF0cFZaGbZxL2IM04dzXw7IdfcXNXeO7R+zi8dABKIefEcHQ7myd/w7jb5cs/vMitrT8ziJFSbyG2Ag5K6JhFiD5PLArNDl/ubfPMRxf4794u5DGSGkIIlJxpd67y+QcvcXP7nyBO9Qgh4GEXEZCNI0fdckFTxHLpCSMwXyu3L6+yPZtys+1AlSatkQbLjHe3QHYQ36fRt7Mp9oJBA6UWvFr/nSmiGF4yhAgSESpWAVUwQ6NjnYMIEpQYItUqEYfcdUhQNGjf4IIBnhqSJmpXcIQQwTwDipeApj5PTq+hMaBWis8NBvsh6gEbKuj+ybMZggCKSkSq4iZAwnLZZyXMDQb92idOnrrcTqeuqj3OUyRHo9aKmyGDOUooEDO1tsQQUBXQ72itqrTTKSdOntr6/wB5xwkK8omfuAAAAABJRU5ErkJggg=="
|
|
9
|
+
|
|
10
|
+
def get_pixmap():
|
|
11
|
+
"""返回QPixmap对象"""
|
|
12
|
+
from PyQt6.QtGui import QPixmap
|
|
13
|
+
from PyQt6.QtCore import QByteArray
|
|
14
|
+
|
|
15
|
+
byte_array = QByteArray.fromBase64(ICON)
|
|
16
|
+
pixmap = QPixmap()
|
|
17
|
+
pixmap.loadFromData(byte_array)
|
|
18
|
+
return pixmap
|
|
19
|
+
|
|
20
|
+
def get_icon():
|
|
21
|
+
"""返回QIcon对象"""
|
|
22
|
+
from PyQt6.QtGui import QIcon
|
|
23
|
+
return QIcon(get_pixmap())
|
|
24
|
+
|
|
25
|
+
if __name__ == '__main__':
|
|
26
|
+
import sys
|
|
27
|
+
from PyQt6.QtWidgets import QApplication, QMainWindow
|
|
28
|
+
|
|
29
|
+
app = QApplication.instance() or QApplication(sys.argv)
|
|
30
|
+
|
|
31
|
+
print(f"资源模块 ICON 已加载")
|
|
32
|
+
print(f"字节数据长度: {len(ICON)} 字节") # ✅ 修复:使用 ICON
|
|
33
|
+
|
|
34
|
+
# 验证能否正确加载
|
|
35
|
+
pixmap = get_pixmap()
|
|
36
|
+
print(f"QPixmap加载成功: 尺寸 {pixmap.width()}x{pixmap.height()}")
|
|
37
|
+
|
|
38
|
+
win = QMainWindow()
|
|
39
|
+
win.setWindowIcon(get_icon())
|
|
40
|
+
win.setGeometry(100, 100, 300, 200)
|
|
41
|
+
win.setWindowTitle("测试图标")
|
|
42
|
+
win.show()
|
|
43
|
+
sys.exit(app.exec())
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyscreeps-arena
|
|
3
|
+
Version: 0.5.6.6
|
|
4
|
+
Summary: Python api|interface to play game: Screeps: Arena.
|
|
5
|
+
Author-email: 2229066748@qq.com
|
|
6
|
+
Maintainer: Eagle'sBaby
|
|
7
|
+
Maintainer-email: 2229066748@qq.com
|
|
8
|
+
License: Apache Licence 2.0
|
|
9
|
+
Keywords: python,screeps:arena,screeps
|
|
10
|
+
Classifier: Programming Language :: Python
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.10
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Requires-Dist: pyperclip
|
|
15
|
+
Requires-Dist: colorama
|
|
16
|
+
Requires-Dist: py7zr
|
|
17
|
+
Requires-Dist: chardet
|
|
18
|
+
Requires-Dist: Transcrypt==3.9.1
|
|
19
|
+
Requires-Dist: PyQt6
|
|
20
|
+
Requires-Dist: mkdocs
|
|
21
|
+
Requires-Dist: mkdocstrings[python]
|
|
22
|
+
Requires-Dist: mkdocs-material
|
|
23
|
+
Dynamic: author-email
|
|
24
|
+
Dynamic: classifier
|
|
25
|
+
Dynamic: description
|
|
26
|
+
Dynamic: description-content-type
|
|
27
|
+
Dynamic: keywords
|
|
28
|
+
Dynamic: license
|
|
29
|
+
Dynamic: maintainer
|
|
30
|
+
Dynamic: maintainer-email
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: requires-python
|
|
33
|
+
Dynamic: summary
|
|
34
|
+
|
|
35
|
+
# PyScreeps-Arena
|
|
36
|
+
|
|
37
|
+
use cmd `pyscreeps-arena <your new project path>` to new a project.
|
|
38
|
+
|
|
39
|
+
## Tutorial
|
|
40
|
+
|
|
41
|
+
* [Tutorial 1: Loop and import](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial1-Loop%20and%20import.md)
|
|
42
|
+
* [Tutorial 2: Simple move](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial2-Simple%20move.md)
|
|
43
|
+
* [Tutorial 3: First attack](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial3-First%20attack.md)
|
|
44
|
+
* [Tutorial 4: Creeps bodies](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial4-Creeps%20Bodies.md)
|
|
45
|
+
* [Tutorial 5: Store and transfer](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial5-Store%20and%20transfer.md)
|
|
46
|
+
* [Tutorial 6: Terrain](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial6-Terrain.md)
|
|
47
|
+
* [Tutorial 7: Spawn creeps](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial7-Spawn%20creeps.md)
|
|
48
|
+
* [Tutorial 8: Harvest energy](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial8-Harvest%20energy.md)
|
|
49
|
+
* [Tutorial 9: Construction](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial9-Construction.md)
|
|
50
|
+
* [Tutorial 10: Final test](https://github.com/EagleBaby/python_screeps_arena/blob/main/tutorials/tutorial10-Final%20test.md)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
pyscreeps_arena/__init__.py,sha256=xCj4Oy7VYpNNbxBHyVxCT4ZhJS2G4Mo_JKJS5sIXDpE,1349
|
|
2
|
+
pyscreeps_arena/build.py,sha256=DQeGLnID2FjpsWTbnqwt2cOp28olWK68U67bfbFJSOU,177
|
|
3
|
+
pyscreeps_arena/compiler.py,sha256=lFRElUPzsMb5cotK-omScXvawREJklIDr0MnY1U41yY,57460
|
|
4
|
+
pyscreeps_arena/localization.py,sha256=5GYoegky1y63Ae7Z4YjHLeQp6L87ek73MndERuFC3M4,5886
|
|
5
|
+
pyscreeps_arena/project.7z,sha256=R-zfDDe0vTcrNlXyfjyYQ55d9GAUYfF3auFDC9a6a30,314103
|
|
6
|
+
pyscreeps_arena/core/__init__.py,sha256=qoP_rx1TpbDLJoTm5via4XPwEPaV1FXr1SYvoVoHGms,41
|
|
7
|
+
pyscreeps_arena/core/basic.py,sha256=DFvyDTsTXf2bQtnS9s254TrkshvRwajaHcvTyVvJyqw,2790
|
|
8
|
+
pyscreeps_arena/core/config.py,sha256=x_JhVHlVZqB3qA7UyACVnwZjg2gZU-BIs49UxZzwCoE,637
|
|
9
|
+
pyscreeps_arena/core/const.py,sha256=b5QOLoe3SYDF8xUp9PO7DYHwUeNIp25OlKDls5bPI60,590
|
|
10
|
+
pyscreeps_arena/core/core.py,sha256=3Nty8eLKPNgwnYk_sVNBPrWuKxBXI2od8nfEezsEAZQ,5157
|
|
11
|
+
pyscreeps_arena/core/main.py,sha256=-FNSOEjksNlDfCbUqsjtPSUW8vT3qxEdfzXqT5Tdsik,170
|
|
12
|
+
pyscreeps_arena/core/utils.py,sha256=N9OOkORvrqnJakayaFp9qyS0apWhB9lBK4xyyYkhFdo,215
|
|
13
|
+
pyscreeps_arena/ui/P2PY.py,sha256=c_zLFkp_M83bSJRnQggt_yQL_2xSPtKWp4kh-TuqM2k,3220
|
|
14
|
+
pyscreeps_arena/ui/__init__.py,sha256=9iW-DFRkBWm-2VtOrFqYyp1nuyt4apX0DJxFxjyKCOM,283
|
|
15
|
+
pyscreeps_arena/ui/project_ui.py,sha256=1C0Liz4OeApuxanI0Vvrgh_r7f8JpLTDDTpYj0b1GI4,7667
|
|
16
|
+
pyscreeps_arena/ui/rs_icon.py,sha256=5v8YdTv2dds4iAp9x3MXpqB_5XIOYd0uPqaq83ZNySM,22496
|
|
17
|
+
pyscreeps_arena-0.5.6.6.dist-info/METADATA,sha256=WjGnRmIL2WIrU7nxVd2KnzwzuRHJouAihG-1arKMWAY,2356
|
|
18
|
+
pyscreeps_arena-0.5.6.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
19
|
+
pyscreeps_arena-0.5.6.6.dist-info/entry_points.txt,sha256=pnpuPPadwQsxQPaR1rXzUo0fUvhOcC7HTHlf7TYXr7M,141
|
|
20
|
+
pyscreeps_arena-0.5.6.6.dist-info/top_level.txt,sha256=l4uLyMR2NOy41ngBMh795jOHTFk3tgYKy64-9cgjVng,16
|
|
21
|
+
pyscreeps_arena-0.5.6.6.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pyscreeps_arena
|