第一步优化勾选功能

This commit is contained in:
27942
2026-02-03 00:17:33 +08:00
parent 88890073b2
commit 1aa4acab9d
353 changed files with 7089 additions and 7190 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1985,28 +1985,34 @@ class MainWindow(QMainWindow):
self._show_infobar("success", "筛选", f"已筛选出 {visible_count}{status}记录,再次点击取消筛选")
def _update_status_statistics(self):
"""更新状态统计(成功/失败/待执行数量)- 统计勾选的配置,不累计历史数据"""
"""更新状态统计(成功/失败/待执行数量)- 统计所有配置的真实状态
待执行:所有状态不是"已完成"的数据(包括"待执行""失败"的),表示还需要处理的任务数
执行中只有在任务运行时才有值任务完成后为0
成功:状态为"已完成"的数据数量
失败:状态为"失败"的数据数量
"""
if not hasattr(self, 'configs') or not self.configs:
self.set_status_cards(pending=0, success=0, failed=0)
self.set_status_cards(pending=0, running=0, success=0, failed=0)
return
pending_count = 0
success_count = 0
failed_count = 0
# 统计勾选的配置,不累计历史数据
# 统计所有配置的状态(根据数据总量来统计)
for config in self.configs:
if not config.get('勾选', False):
continue # 跳过未勾选的配置
status = config.get('情况', '待执行')
if "完成" in status or "成功" in status:
success_count += 1
elif "失败" in status or "错误" in status:
failed_count += 1
pending_count += 1 # 失败的也算待执行(需要重试)
elif "" in status or not status:
pending_count += 1
self.set_status_cards(pending=pending_count, success=success_count, failed=failed_count)
# 执行中始终为0只有任务运行时才会被单独更新
self.set_status_cards(pending=pending_count, running=0, success=success_count, failed=failed_count)
def retry_failed_items(self):
"""重新发布所有失败的项目"""
@@ -3211,10 +3217,22 @@ class MainWindow(QMainWindow):
if not self.use_model_view:
self._sync_configs_from_table()
# 开始新任务时重置当前批次状态(不累计历史数据)
self.set_status_cards(pending=0, running=0, success=0, failed=0)
self.batch_success_count = 0
self.batch_failed_count = 0
# 开始新任务时,从当前数据中统计已有的成功/失败/待执行数量(累计历史数据)
existing_success = 0
existing_failed = 0
existing_pending = 0
for config in self.configs:
status = config.get('情况', '待执行')
if "完成" in status or "成功" in status:
existing_success += 1
elif "失败" in status or "错误" in status:
existing_failed += 1
existing_pending += 1 # 失败的也算待执行
elif "" in status or not status:
existing_pending += 1
self.batch_success_count = existing_success
self.batch_failed_count = existing_failed
self.set_status_cards(pending=existing_pending, running=0, success=existing_success, failed=existing_failed)
# 获取文件夹路径
folder_path = self.folder_path_input.text().strip()
@@ -3259,6 +3277,23 @@ class MainWindow(QMainWindow):
self.configs[idx]['情况'] = '待执行'
self._update_table_status(idx, "待执行", is_config_index=True)
# 重置任务状态后,重新统计成功/失败/待执行数量以保持一致性
existing_success = 0
existing_failed = 0
existing_pending = 0
for config in self.configs:
status = config.get('情况', '待执行')
if "完成" in status or "成功" in status:
existing_success += 1
elif "失败" in status or "错误" in status:
existing_failed += 1
existing_pending += 1 # 失败的也算待执行
elif "" in status or not status:
existing_pending += 1
self.batch_success_count = existing_success
self.batch_failed_count = existing_failed
self.set_status_cards(pending=existing_pending, success=existing_success, failed=existing_failed)
# 应用定时发布 + 间隔时间逻辑(跨分页全局应用)
self._apply_schedule_intervals(configs_to_process)

100
main.py
View File

@@ -366,7 +366,7 @@ class Pdd:
self.page.ele("x://*[text()='签约主播/作者']").click()
logger.info(" ✓ 已点击'签约主播/作者'")
ele = self.page.ele("x://*[text()='我知道了']", timeout=3)
ele = self.page.ele("x://*[text()='稍后再说']", timeout=3)
if ele:
ele.click()
logger.info(" ✓ 已关闭提示框")
@@ -1237,14 +1237,14 @@ class Pdd:
}
results.append(result_item)
logger.info(f" ✓ 视频 {video_name} 处理完成ok={ok}")
# 实时回调通知 GUI 更新状态(每处理完一个视频就通知)
if on_item_done and callable(on_item_done):
try:
on_item_done(result_item)
except Exception as e:
logger.warning(f"回调通知失败: {e}")
time.sleep(2) # 每个视频处理间隔
except Exception as e:
@@ -1261,7 +1261,7 @@ class Pdd:
"reason": f"处理异常: {e}",
}
results.append(error_result)
# 实时回调通知 GUI 更新状态(失败情况)
if on_item_done and callable(on_item_done):
try:
@@ -1629,7 +1629,7 @@ class Pdd:
expected_str = expected_dt.strftime("%Y-%m-%d %H:%M:%S")
expected_date = expected_dt.strftime("%Y-%m-%d")
expected_time = expected_dt.strftime("%H:%M:%S")
# 读取日期时间输入框的值
final_value = None
try:
@@ -1648,28 +1648,28 @@ class Pdd:
final_value = value_ele.attr("value")
except Exception as e:
logger.warning(f"读取日期选择器值失败: {e}")
if not final_value or not str(final_value).strip():
return False, "定时设置失败:无法读取日期选择器值", "", ""
final_value_str = str(final_value).strip()
logger.info(f"日期选择器当前值: {final_value_str}, 期望值: {expected_str}")
# 比较完整的日期时间字符串
if final_value_str == expected_str:
return True, "", final_value_str[:10], final_value_str[11:] if len(final_value_str) > 10 else ""
# 如果完整比较不匹配,尝试分别比较日期和时间
actual_date = final_value_str[:10] if len(final_value_str) >= 10 else final_value_str
actual_time = final_value_str[11:] if len(final_value_str) > 11 else ""
if actual_date == expected_date and actual_time == expected_time:
return True, "", actual_date, actual_time
# 不匹配
reason = f"定时设置失败:期望 {expected_str},实际 {final_value_str}"
return False, reason, actual_date, actual_time
except Exception as e:
logger.error(f"验证定时时间失败: {e}")
return False, f"定时设置失败:验证异常 {e}", "", ""
@@ -1723,41 +1723,41 @@ class Pdd:
datas = ThreadSafeDict()
if __name__ == '__main__':
url = "18 【运动男孩都爱这么穿吗?🏃 - Liu_烫烫 | 小红书 - 你的生活兴趣社区】 😆 D13BaPl6xyUAuQO 😆 https://www.xiaohongshu.com/discovery/item/678ceeef000000001602fb54?source=webshare&xhsshare=pc_web&xsec_token=ABe9oWR9CYCsHBkWUPuoS1Fz3_Uz4WGFMdfCGwSbl0Dfs=&xsec_source=pc_share"
pdd = Pdd(
url=url,
user_id="1050100241",
time_start="2026-01-28 09:30:00",
ht="#python #haha",
index="1",
)
# pdd.action(folder_path=r"C:\Users\27942\Desktop\多多自动化发文")
folder_path = r"C:\Users\27942\Desktop\多多自动化发文"
file_paths = []
for file in os.listdir(folder_path): # 获取文件夹下所有的文件夹
file_path = os.path.join(folder_path, file) # 拼接文件夹
# 检查是否为目录,跳过文件(如.lnk快捷方式
if not os.path.isdir(file_path):
continue
files = os.listdir(file_path) # 获取用户id下的文件
for file in files:
if ".mp4" in file:
file_names = file.split("-")
path = Path(os.path.join(file_path, file))
# 判断是否为文件
file_paths.append(
{
"url": url,
"user_id": "1050100241",
"time_start": "2026-01-28 09:30:00",
"ht": "#python #haha",
"index": "1",
"path": path
}
)
pdd.action1(folder_path=file_paths)
# if __name__ == '__main__':
# url = "18 【运动男孩都爱这么穿吗?🏃 - Liu_烫烫 | 小红书 - 你的生活兴趣社区】 😆 D13BaPl6xyUAuQO 😆 https://www.xiaohongshu.com/discovery/item/678ceeef000000001602fb54?source=webshare&xhsshare=pc_web&xsec_token=ABe9oWR9CYCsHBkWUPuoS1Fz3_Uz4WGFMdfCGwSbl0Dfs=&xsec_source=pc_share"
# pdd = Pdd(
# url=url,
# user_id="1050100241",
# time_start="2026-01-28 09:30:00",
# ht="#python #haha",
# index="1",
# )
# # pdd.action(folder_path=r"C:\Users\27942\Desktop\多多自动化发文")
#
# folder_path = r"C:\Users\27942\Desktop\多多自动化发文"
# file_paths = []
# for file in os.listdir(folder_path): # 获取文件夹下所有的文件夹
# file_path = os.path.join(folder_path, file) # 拼接文件夹
# # 检查是否为目录,跳过文件(如.lnk快捷方式
# if not os.path.isdir(file_path):
# continue
# files = os.listdir(file_path) # 获取用户id下的文件
# for file in files:
# if ".mp4" in file:
# file_names = file.split("-")
#
# path = Path(os.path.join(file_path, file))
# # 判断是否为文件
#
# file_paths.append(
# {
# "url": url,
# "user_id": "1050100241",
# "time_start": "2026-01-28 09:30:00",
# "ht": "#python #haha",
# "index": "1",
# "path": path
# }
# )
#
# pdd.action1(folder_path=file_paths)

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJMSUNFTlNFIiwicm9vdF9oYXNoIjoiUGIwc2tBVUxaUzFqWldTQnctV0hIRkltRlhVcExiZDlUcVkwR2ZHSHBWcyJ9LHsicGF0aCI6ImNybC1zZXQiLCJyb290X2hhc2giOiI0ZWNUMzVwUGh4UlRKcU9rUUQweVNoMHhzXzcxTTdKNmRnNjZueG5aempVIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IlJIMVlRXzBIU3dGNURwSk5iekNoMm56Vm9BZXUwb1Q0b04zVHo0S1F3RVUifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJoZm5rcGltbGhoZ2llYWRkZ2ZlbWpob2ZtZmJsbW5pYiIsIml0ZW1fdmVyc2lvbiI6IjEwMzE3IiwicHJvdG9jb2xfdmVyc2lvbiI6MX0","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"ohF-K2Yie2hQxg3R1RvhYHWppQ4MmGr2LVTXFPo52S-GqM0mLP6MWC0TGyxgsCpXfXWHhUZK72mF9qSrMA0mXOVeR5KHnr4In3k1vaaGEUMUBeqHrZ3Qn-jEVwFWk_avIRNbWImcTSysubdPICM5rgpEvIEAnv0qIqQzffAqzZoV10rLyledlch1frqakFK480wXnoRDQpUWmpZjSU8bFJvQ1YlZ4sj8y9qAYlVqSmqedAObjvJyaJvMFGeeF6Sb1-joO2K3fHM4NwsPEFNBvwnqMe1A1ysnScniuX3SSkh-1ilzmTvcbeW275s0lvxhvg_3y12hsLd0CQn3pkbHOQ"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"XWFPSkDyg4OXaK7-QfDKKdG2p5DAm7dZ6EbOR9qluSd1vgsjOcTbCLjSg4S4Supel7MaKWOa9diInmrk84L3vxyVunfg6TbADiM9Zt1BNBItomPqVGdk3KunYJkW599cbCYDBEEXArH5K6zroJ0_fW-tn-YUpNhqrJTMG9rqxi2cYOuLdut344MtHs6gTnlxfT3QJdjw2r-rExaWof_Tp-e3cn3vJOkOd0HZ-g_FYBg-x72EnCdGiXtth2ti2_-YGKg7KmhbB9B46AVD5Dl5oTUIHGf1BY6PSU1V8BJep1XrhEcTqBU9yfpCOM_AREkD5bv_7rDrN5fsTuapVhCIiA"}]}}]

View File

@@ -1,5 +0,0 @@
{
"manifest_version": 2,
"name": "crl-set-14006623799089998022.data",
"version": "10317"
}

View File

@@ -0,0 +1 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJMSUNFTlNFIiwicm9vdF9oYXNoIjoiUGIwc2tBVUxaUzFqWldTQnctV0hIRkltRlhVcExiZDlUcVkwR2ZHSHBWcyJ9LHsicGF0aCI6ImNybC1zZXQiLCJyb290X2hhc2giOiJ5cUhucDQ1Z3FrTVVjcGFlWng1RVFSaUxxN2F1STZKbUI0bV9sYktJUVJvIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6Ik45T1pOVGxGdjVMNXlCVGVFM2VYWEFWek5EVG9kd1pYcEotWFRVWnhhYjAifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJoZm5rcGltbGhoZ2llYWRkZ2ZlbWpob2ZtZmJsbW5pYiIsIml0ZW1fdmVyc2lvbiI6IjEwMzIxIiwicHJvdG9jb2xfdmVyc2lvbiI6MX0","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"fwBU1Vc9BwO8ks2un1Xtl2ptuu6UMxot_f4bL3nWIOa45Al4H1xipvycidiHmetB69b4wv2kS4HCMUCqh8y1kxQ22v989MvlKerdbr9FpcyQmo6b8KHF5MOUK6SuSB28DRDQGeJsxqB2Jlju8unU-TJyCQ6z0u8DnSXQMgFxxX_MGZxeS0gyYl_FzSlIlPbCBlA7nGU0y_c0OKcMRHPoaHjyFNr9gQOdk_DurKO8dfMOHpeaadWmKMF0RumvnuYJYXJoG-Ws47sY8mvL_2cAbCt2eUsKKbOMoZaZ5WBKbarideC1tETjJmRx408pCN0b77SjzG6hflE4ddDYtNo8aw"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"CwDF5pJAYXla8ha21dBet6Q8M4A8W6n7HUJLRdXEXql1upIUPghPdzScfHf8Z7itQApQAPz1MatjO-KbWd7Ev9mDfnHp6ZYWbfEnWHnor3tLPFb8ZcmIpXSPyPDxCLm6SUeTvRx06NG07PysrWqtxwwPsQh0LBDteMCHK2bQhZtotMcNiLgx5TV5cicVzAtaeYUOrQhg-kvbXWLQxB_GEv0AS7p3rhyshZ--aXoAsrll284zrUXaBi5UBADlKUvX6_iLPk3GV3KEse-wKwhVoEzKo8mOQ8zEL94N22RgPJz50MesYxgPw-gmbyHYqOI4uwTjJ5sR9fwtb8JVtIO_Mw"}]}}]

View File

@@ -0,0 +1,5 @@
{
"manifest_version": 2,
"name": "crl-set-5688209328603264380.data",
"version": "10321"
}

View File

@@ -1 +0,0 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJQcmVsb2FkIERhdGEiLCJyb290X2hhc2giOiJUeGdpU0ZBYWpKODA2LUVEdWloeDRJRlVRcTlSVGpPN01hbGlqclFCZWlnIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IkZjUGhLMkpBS3ktR0ZZNnZMUnlZUlVEeFA2NlREUkl1TmVrYUxhMjJvSW8ifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJnZ2trZWhnYm5manBlZ2dmcGxlZWFrcGlkYmtpYmJtbiIsIml0ZW1fdmVyc2lvbiI6IjIwMjYuMS4yOS4xMjEiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"SFHAd5HNyGF6WzKgoHt1eoS0rvvBG2vumA6d65sQLv-W5ATuACfZ8tLIuvZsAJTHScHsgFlN5uJalBY_eCM2eanEz0wGERmmwhPHeLDxDSUSLbpxAvAtaYWsncYN5zfbPNlhDGgvBX2S2r0a4qDGwCJeczD_N9Z3DsLwM7q57wyx1SUSqvKp4eb8dtF674SA6F8WNCgeeGWaFaSh_DWE9HxQ03TDu10P382wcrazb7Q2kzOlNdTwesOC1wrHum1O7iRvyic_traTIzyRqkEUVgHVvLjbW3jHzJ2TRAXeSGS0QRF8yBqcziae0hSg7NxGq2N3SbYtJHCJRuOZAg2t4O9suBSetyKrAp7Z14qxOqdS8LcguVD4saOJLma6zK3NrGcgoqdTD-rFHpmVpxakPe9XqljJTprmlXWY95opJ-A966NFFbHOPMpEd8enLZlylwcqOpRGbVYY9SoE0BADiGaP9mlc1SJz4G52TXjn7M4XV-K_wC9UXxrxNlqsulu6awmAKNTYzEe9HfmV-yW99anvv2gZwiLac2_yDFID-ShW0SEDIwF_ry067tLgfHcGHYXrmFm6zuAxx-XpRQx9ugcPy5Uj7WVriCqdQwh0YIkXKRNHGHe-HptZZHW3fjQnVAzVqmoZgnai3_cx_gVAS19yjKWqVsxm-8aP5GojXnk"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"PZCAwXm-Vmnm7yWCX4Nm3HvC6URnq66WpSQCwHhr3Q3d3wWCS7QmYoOGoSZHAT2TmXN3lsxLWmuy-EhkR0p-muwS8wwLgrsEEY3bIQDGYAifwzwl1iAcySVaM-rYQKz5VblYu_DH0nH2IjaT1kiElo0OwosjoFPdPe4Q_0sgDBijkqCgDd77ajyHyixi1mZ9r-TQczeC_CgSV2bBx1Q8GuiwV28jlZRx0s6parboDAaFA1dcwmDq4rixxJB_2zK4IwNDsYIjLBGYwfdEE_x_eLcGFQyC-09dLdK40iEPqN1eIFZd1jLFtgLiNMWy-jmhIILjsHRk_-Bxd7X3TdCiyA"}]}}]

View File

@@ -0,0 +1 @@
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJQcmVsb2FkIERhdGEiLCJyb290X2hhc2giOiI5MFptcFJQTGh3c2xxbXBka2hMclUzODgzSHVTYXJkUFBkYVZfSWF2ZUtZIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6Imh5Z0tCY2hTMXhKTXRvV2tIWURCaDZmYVBGaU1haFFlMkxFb3o1cWxTREkifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJnZ2trZWhnYm5manBlZ2dmcGxlZWFrcGlkYmtpYmJtbiIsIml0ZW1fdmVyc2lvbiI6IjIwMjYuMi4yLjEyMSIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"IG_xMeVVGDbd9FINYr7EcsO1rObec7fteiBx7PwXXzKnxGyRYlwkRCHb-baFAcLekoUCL780XLPjMbkQVnb7PqsTyrXfX7-MCSjLM1kcNIiCpm9GoXg_m0SH2TgmsX8RR3xLNgpvwhu3ulyzIXnzvD_xEed_6vgqSbjMhqPv9VsV3clh_NzFqPIz1J_uJkcicPKxQ7xJAZBKhF6UZLdY2Pqewr2q4Moiz2RhraeDCfhTy0iaio994QXKd1Eu4yIQINQw-zyBut4rFlCNdZT8xjcpukpvfxgSt-J07R6sFuvMZESu3-NGjIKoEzZckLisOCtGYnF75Lp-tDkxCDy6PwOhfAneodxYpO-swCQjaNz1oKfjvXpJTi0r9FoNYfKHKEsZEBOLejpTj3pQsp-ZMNnd77W0daCr3avNOCjEqRXjnc7IfoaJgLK9xXhj8D8WihQnpLTE3Wih3KHzgqaU0LJ0GPGb0rXvAvtvKExBzuiClTpcwWdJwaut1aL7-YbkdPGQ2qYm0IMAMb7QiSpR48zjKyXt_97fjSvXMt75I1fpkxbBLmU2wVO6LiPTXMPSaDM_Uz0KPd8ToCg1xJd5n-n-BHHHFLeNlV0wYoR-N2wgCUpF0YMEcBplKeyeEVw3A_wnQRd6TzyWz0vZE1SLpusHaVvn404mrrU8EIoeLao"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"CR_JAvPr3BrvEdRIKZ2FxmoxYoBWnZWhgSl5Ush_kT5S3DZu_e-OOVHhpIZI4vM7cYfaChgG72LNI2E_-g7HCf1nEaM5_smP0TxWKXH15X1zvW0SqSPYaXR3An_2TDh9dg2PQoyxk3CxWFFG2OiZfdA3sCBW6ezL_PfGrVK5YT00uKs0o4cXSqRbtNRDsYf18NyEw-z2VAS9qAbjMTZ4NqZTz8A9r1OvSrZPzONB4kwmfDc7wzzBne0cJbmUAeU1VETFaqyfH4HV3WnIM-9Rux0OAX2zqLuff_JUQKJ0He399JYsfsRIlGZl3_u3Hfj9oMNfOplRTrmvBl7cMFtdlw"}]}}]

View File

@@ -2,5 +2,5 @@
"manifest_version": 2,
"name": "Crowd Deny",
"preload_data_format": 1,
"version": "2026.1.29.121"
"version": "2026.2.2.121"
}

View File

@@ -22,5 +22,5 @@
"top_topics_and_observing_domains": [ ]
} ],
"hex_encoded_hmac_key": "434BF7DBD7DA573B45E0A11AD9045A61B6221D14AE2F9A341E2FEF659AF071F6",
"next_scheduled_calculation_time": "13414862793246458"
"next_scheduled_calculation_time": "13414862793246872"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 572 KiB

After

Width:  |  Height:  |  Size: 572 KiB

View File

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More